zoukankan      html  css  js  c++  java
  • GdiPlus[37]: IGPGraphicsPath (四) 路径变换


    IGPGraphicsPath.Flatten();   //把路径中的曲线转换为近似直线段(路径中只有 Bezier 线和直线).
    IGPGraphicsPath.Outline();   //同 Flatten();
    IGPGraphicsPath.Warp();      //四边形或平行四边形扭曲. 
    IGPGraphicsPath.Widen();     //把轮廓转换为范围.
    IGPGraphicsPath.Transform(); //矩阵变换; 其实上面几个方法都包含矩阵变换的参数.
    

    Flatten 测试图:



    Flatten 测试代码:

    uses GdiPlus;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
      Pen: IGPPen;
      Brush: IGPBrush;
      Path, PathClone: IGPGraphicsPath;
      Rect: TGPRect;
      Pt: TGPPoint;
      Matrix: IGPMatrix;
    begin
      Graphics := TGPGraphics.Create(Canvas.Handle);
      Pen := TGPPen.Create($FFFF0000);
      Brush := TGPSolidBrush.Create($800000FF);
      Path := TGPGraphicsPath.Create;
      Rect.Initialize(20, 20, 200, 75);
      Path.AddEllipse(Rect);
    
      PathClone := Path.Clone;
      Graphics.DrawPath(Pen, PathClone);
      for Pt in PathClone.PathPointsI do Graphics.FillRectangle(Brush, Pt.X-2, Pt.Y-2, 4, 4);
      Graphics.TranslateTransform(0, Rect.Y + Rect.Height);
    
      PathClone := Path.Clone;
      PathClone.Flatten(); //其参数 2 默认是 0.25
      Graphics.DrawPath(Pen, PathClone);
      for Pt in PathClone.PathPointsI do Graphics.FillRectangle(Brush, Pt.X-2, Pt.Y-2, 4, 4);
      Graphics.TranslateTransform(0, Rect.Y + Rect.Height);
    
      PathClone := Path.Clone;
      PathClone.Flatten(nil, 10);
      Graphics.DrawPath(Pen, PathClone);
      for Pt in PathClone.PathPointsI do Graphics.FillRectangle(Brush, Pt.X-2, Pt.Y-2, 4, 4);
      Graphics.TranslateTransform(0, Rect.Y + Rect.Height);
    
      PathClone := Path.Clone;
      PathClone.Flatten(nil, 25);
      Graphics.DrawPath(Pen, PathClone);
      for Pt in PathClone.PathPointsI do Graphics.FillRectangle(Brush, Pt.X-2, Pt.Y-2, 4, 4);
      Graphics.TranslateTransform(0, Rect.Y + Rect.Height);
    
      PathClone := Path.Clone;
      PathClone.Flatten(nil, 50);
      Graphics.DrawPath(Pen, PathClone);
      for Pt in PathClone.PathPointsI do Graphics.FillRectangle(Brush, Pt.X-2, Pt.Y-2, 4, 4);
      Graphics.TranslateTransform(0, Rect.Y + Rect.Height);
    
      PathClone := Path.Clone;
      Matrix := TGPMatrix.Create;
      Matrix.Scale(1, 0.5);
      Matrix.Translate(0, 20);
      PathClone.Flatten(Matrix, 25);
      Graphics.DrawPath(Pen, PathClone);
      for Pt in PathClone.PathPointsI do Graphics.FillRectangle(Brush, Pt.X-2, Pt.Y-2, 4, 4);
      Graphics.TranslateTransform(0, Rect.Y + Rect.Height);
    end;
    

    Warp 测试图:



    Warp 测试代码:

    uses GdiPlus;
    
    const
      { 数组有三个元素时, 0: 左上; 1: 右上; 2: 左下; 3: 自动调整为平行四边形 }
      pts3: array[0..2] of TGPPointF = ((X:20; Y:20),(X:250; Y:0),(X:20; Y:120));
    
      { 数组有四个元素时, 0: 左上; 1: 右上; 2: 左下; 3: 右下 }
      pts4: array[0..3] of TGPPointF = ((X:20; Y:20),(X:220; Y:10),(X:20; Y:120),(X:270; Y:190));
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
      Brush: IGPHatchBrush;
      Path,PathClone: IGPGraphicsPath;
      Rect: TGPRectF;
      FontFamily: IGPFontFamily;
      StringFormat: IGPStringFormat;
      Pt: TGPPointF;
    begin
      Graphics := TGPGraphics.Create(Canvas.Handle);
      Brush := TGPHatchBrush.Create(HatchStyleShingle, $FF808080, $FF483D8B);
    
      Rect.Initialize(20, 20, 250, 120);
      FontFamily := TGPFontFamily.Create('Arial Black');
      StringFormat := TGPStringFormat.Create;
      StringFormat.Alignment := StringAlignmentCenter;
      StringFormat.LineAlignment := StringAlignmentCenter;
    
      Path := TGPGraphicsPath.Create;
      Path.AddRectangle(Rect);
      Path.AddString('Delphi', FontFamily, [], 56, Rect, StringFormat);
    
      PathClone := Path.Clone;
      Graphics.FillPath(Brush, PathClone);
      Graphics.TranslateTransform(0, Rect.Y*2 + Rect.Height);
    
      //PathClone := Path.Clone;
      PathClone.Warp(pts3, Rect);
      Graphics.FillPath(Brush, PathClone);
      Graphics.TranslateTransform(0, Rect.Y*2 + Rect.Height);
    
      PathClone := Path.Clone;
      PathClone.Warp(pts4, Rect);
      Graphics.FillPath(Brush, PathClone);
      Graphics.TranslateTransform(0, Rect.Y*2 + Rect.Height);
    end;
    

    Widen 测试图:



    Widen 测试代码:

    uses GdiPlus;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
      Pen: IGPPen;
      Brush: IGPHatchBrush;
      Path, PathClone: IGPGraphicsPath;
      Rect: TGPRect;
    begin
      Graphics := TGPGraphics.Create(Canvas.Handle);
      Pen := TGPPen.Create($AAFF0000, 20);
      Brush := TGPHatchBrush.Create(HatchStyleShingle, $FFC0C0C0, $FF888888);
      Path := TGPGraphicsPath.Create;
      Rect.Initialize(20, 20, 200, 75);
      Path.AddEllipse(Rect);
    
      PathClone := Path.Clone;
      Graphics.FillPath(Brush, PathClone);
      Graphics.DrawPath(Pen, PathClone);
      Graphics.TranslateTransform(0, Rect.Y*2 + Rect.Height);
    
      PathClone := Path.Clone;
      PathClone.Widen(Pen);
      Graphics.FillPath(Brush, PathClone);
      Pen.Width := 1;
      Graphics.DrawPath(Pen, PathClone);
      Graphics.TranslateTransform(0, Rect.Y + Rect.Height);
    end;
    

    Translate 测试图:



    Translate 测试代码:

    uses GdiPlus;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
      Brush: IGPHatchBrush;
      Path,PathClone: IGPGraphicsPath;
      FontFamily: IGPFontFamily;
      Pt: TGPPointF;
      Matrix: IGPMatrix; 
    begin
      Graphics := TGPGraphics.Create(Canvas.Handle);
      Brush := TGPHatchBrush.Create(HatchStyleZigZag, $FFC0C0C0, $FFFF0000);
    
      FontFamily := TGPFontFamily.Create('Arial Black');
      Pt.Initialize(0, 0);
      Path := TGPGraphicsPath.Create;
      Path.AddString('Delphi', FontFamily, [], 32, Pt, nil);
    
      Graphics.FillPath(Brush, Path);
    
      PathClone := Path.Clone;
      Matrix := TGPMatrix.Create;
      Matrix.Scale(2, 2);
      Matrix.Rotate(-30);
      Matrix.Translate(-35, 45);
      PathClone.Transform(Matrix);
      Graphics.FillPath(Brush, PathClone);
      
      PathClone := Path.Clone;
      Matrix.Reset;
      Matrix.Scale(2.5, 6);
      Matrix.Translate(0, 18);
      PathClone.Transform(Matrix);
      Graphics.FillPath(Brush, PathClone);
    end;
    
  • 相关阅读:
    Sendkeys 和 Sendmessage 使用技巧一例
    和菜鸟一起学算法之二分法求极值问题
    和菜鸟一起学算法之三分法求极值问题
    和菜鸟一起学证券投资之国内生产总值GDP
    和菜鸟一起学OK6410之Led字符驱动
    和菜鸟一起学OK6410之最简单驱动模块hello world
    和菜鸟一起学OK6410之交叉编译hello world
    和菜鸟一起学android4.0.3源码之touchscreen配置+调试记录
    和菜鸟一起学android4.0.3源码之红外遥控器适配
    和菜鸟一起学OK6410之最简单字符驱动
  • 原文地址:https://www.cnblogs.com/del/p/1626664.html
Copyright © 2011-2022 走看看