是否可以访问Graphicspath中的点?

时间:2016-08-07 16:21:12

标签: c# user-interface drawing gdi+

如果有一条线添加到Graphicspath并且定义了两个端点,是否可以读取这对点?

Point[] myArray =
         {
             new Point(30,30),
             new Point(60,60),

         };
GraphicsPath myPath2 = new GraphicsPath();
myPath2.AddLines(myArray2);
来自myPath2的

是否有类似于myPath2.Location的东西可以给我积分(30,30)和(60,60)? 感谢

2 个答案:

答案 0 :(得分:3)

是的,可以通过GraphicsPath.PathPoints进行,但您需要了解GraphicsPath.PathTypes的第二个数组!

只有将所有点添加为坐标的简单点数组时,可能是这样的:

List<Point> points = new List<Point>();
..  // add some points!
GraphicsPath gp = new GraphicsPath();
gp.AddLines(points.ToArray());

你可以毫不费力地使用/修改积分。

如果您通过圆角形状添加它们,例如..

 gp.AddEllipse(ClientRectangle);

..你需要了解各种类型!将它们添加为其他曲线gp.AddCurves(points.ToArray());

时也是如此

如果您将它们添加为gp.AddRectangle(ClientRectangle);,您将获得常规点,但字节类型为

  

0 - 表示该点是图形的开头。

所以在你的情况下,你会得到这样的第一点:

Console.WriteLine(gp.PathPoints[1].ToString());
顺便说一句:没有GraphicsPath.Location这样的东西;但你可能会发现GraphicsPath.GetBounds()有用..

请注意,所有圆形形状(包括弧形和椭圆形!)实际上只包含贝塞尔点:

  

3 - 表示该点是a的端点或控制点   立方Bézier样条

表示PathPoints交替端点和控制点。

答案 1 :(得分:0)

Somethimes,矩阵无法绘制正确的点,因此...,在少量路径中,这很有用,在此示例中,您可以:读取,修改和比较点和点类型,重写路径或创建一个新的..等..

PointF[] changedPoints = Refpath.PathData.Points;
byte[] pointTypes = Refpath.PathData.Types;

List<PointF> OriginalPoints = new List<PointF>();
PointF currentPoint = new Point();
int MyCoffe = 0;

Refpath.PathPoints
        .ToList()
            .ForEach(
                i =>
                {    
                    currentPoint = new PointF
                    {
                        X = i.X,
                        Y = i.Y
                    };
                    OriginalPoints.Add(currentPoint);

                    if (pointTypes[MyCoffe]==3)
                    { 
                        // it's a curve, see the "TaW" explantion, do something, like add text caption, etc...
                        changedPoints[MyCoffe].X -= 100; 
                        changedPoints[MyCoffe].Y -= 100;
                        // etc...
                    }

                    changedPoints[MyCoffe].X += 100; // if you want to change value
                    changedPoints[MyCoffe].Y += 100;
                    MyCoffe ++;
                }
            );
GraphicsPath newPath = new GraphicsPath(changedPoints, pointTypes);