zoukankan      html  css  js  c++  java
  • GdiPlus[38]: IGPGraphicsPath (五) 路径标记


    IGPGraphicsPath.SetMarker    //建立一个标记
    IGPGraphicsPath.ClearMarkers //取消全部标记
    

    在路径中每建立一个图形都可以同时做个 Marker,

    真正使用这些个标记时, 主要通过 IGPGraphicsPathIterator 的 NextMarker() 方法.

    下面是建立并遍历 Marker 的演示代码, 暂未使用 IGPGraphicsPathIterator.

    uses GdiPlus;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Pt1,Pt2: TGPPoint;
      Rect: TGPRect;
      Path: IGPGraphicsPath;
      i: Integer;
      str: string;
    begin
      Pt1.Initialize(20, 20);
      Pt2.Initialize(150, 150);
      Rect.InitializeFromLTRB(Pt1.X, Pt1.Y, Pt2.X , Pt2.Y);
      Path := TGPGraphicsPath.Create;
    
      { 路径有四个图形(或叫子路径构成), 并在每个图形后做了 marker; 第一个前不需要也作不上. }
      Path.AddRectangle(Rect);
      Path.SetMarker;
    
      Path.AddEllipse(Rect);
      Path.SetMarker;
    
      Path.AddLine(Pt1.X, Pt1.Y, Pt2.X, Pt2.Y);
      Path.SetMarker;
    
      Path.AddLine(Pt1.X, Pt2.Y, Pt2.X, Pt1.Y);
      Path.SetMarker;
    
      { 检索看看都是哪个点上有 Marker, 它的类型标识是 $20 }
      str := '';
      for i := 0 to Path.PointCount - 1 do
        if Path.PathTypes[i] and $20 = $20 then
          str := str + IntToStr(i+1) + ' ';
      ShowMessage(TrimRight(str)); // 4 17 19 21
    
      { 执行 ClearMarkers, 重新检索看看 }
      Path.ClearMarkers;
      str := '';
      for i := 0 to Path.PointCount - 1 do
        if Path.PathTypes[i] and $20 = $20 then
          str := str + IntToStr(i+1) + ' ';
      ShowMessage(TrimRight(str)); // 当然不会再有了
    end;
    

    使用 IGPGraphicsPathIterator 检索 Marker 的例子:

    uses GdiPlus;
    
    var
      Path: IGPGraphicsPath;
      PathIterator: IGPGraphicsPathIterator;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Pt1,Pt2: TGPPoint;
      Rect: TGPRect;
    begin
      Pt1.Initialize(20, 20);
      Pt2.Initialize(150, 150);
      Rect.InitializeFromLTRB(Pt1.X, Pt1.Y, Pt2.X , Pt2.Y);
      Path := TGPGraphicsPath.Create;
    
      //建立四个图形并添加两个标记
      Path.AddRectangle(Rect);
      Path.SetMarker;
    
      Path.AddEllipse(Rect);
    
      Path.AddLine(Pt1.X, Pt1.Y, Pt2.X, Pt2.Y);
      Path.SetMarker;
    
      Path.AddLine(Pt1.X, Pt2.Y, Pt2.X, Pt1.Y);
    
      //建立 PathIterator
      PathIterator := TGPGraphicsPathIterator.Create(Path);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      m1,m2: Integer;
      i: Integer;
    begin
      i := 0;
      PathIterator.Rewind;
      while PathIterator.NextMarker(m1, m2) > 0 do
      begin
        Inc(i);
        ShowMessageFmt('第 %d - %d 个标记的范围: %d - %d', [i-1, i, m1, m2]);
      end;
    {
      第 0 - 1 个标记的范围: 0 - 3
      第 1 - 2 个标记的范围: 4 - 18
      第 2 - 3 个标记的范围: 19 - 20
    } //就添加了两个标记怎么会检索出三个范围呢? 两个点把路径分成了三段!
    end;
    
    //IGPGraphicsPathIterator.NextMarker 的第二种用法
    procedure TForm1.Button2Click(Sender: TObject);
    var
      i,r: Integer;
    begin
      i := 0;
      PathIterator.Rewind;
      while True do
      begin
        r := PathIterator.NextMarker(Path);
        if r = 0 then Break;
        Inc(i);
        ShowMessageFmt('第 %d - %d 个标记间共有 %d 个点', [i-1, i, r]);
      end;
    {
      第 0 - 1 个标记间共有 4 个点
      第 1 - 2 个标记间共有 15 个点
      第 2 - 3 个标记间共有 2 个点
    }
    end;
    
  • 相关阅读:
    EM算法
    Statistics in Python
    26 THINGS I LEARNED IN THE DEEP LEARNING SUMMER SCHOOL
    5 Techniques To Understand Machine Learning Algorithms Without the Background in Mathematics
    统计学习那些事
    Image Scaling using Deep Convolutional Neural Networks
    Unsupervised learning, attention, and other mysteries
    使用导入导出进行备份和恢复OCR(10g)
    计算比尔盖茨財富的方法
    jQuery訪问属性,绝对定位
  • 原文地址:https://www.cnblogs.com/del/p/1627443.html
Copyright © 2011-2022 走看看