绘制平行线

我有一组代表一条线的点。 它可能是封闭的形状或开放的形状。 我需要绘制一条平行线,除了原始线之外没有任何交叉点。

我有以下代码来返回生成的行。 我在形状的角度有问题。 有些观点超过原始线。

我的代码是:

PointF[] GetParrarel(PointF[] lst, double width, float distance) { List final = new List(); width = width + distance; for (int i = 0; i  0) { if (dy == 0) { first.Y += (float)width; second.Y += (float)width; } first.X += (float)width; second.X += (float)width; } else if (dx  0) { first.X -= (float)width; second.X -= (float)width; } else if (dy < 0) { first.X += (float)width; second.X += (float)width; } else { continue; } } final.Add(first); final.Add(second); } return final.ToArray(); } 

我想出了怎么做,但它很复杂。 这是我做的一个例子的截图。 截图

我需要三个课程。

  1. class使用系数abc描述无穷直线的等式a*x+b*y+c=0 。 构造函数采用两个PointF并计算系数。 该线有一个“中心”,它是最接近原点的点。 沿线的任何点都可以描述为沿着线方向距“中心”的距离。

  2. class LineSeg ,它描述一个线段,通过指定一条线,以及从线中心开始和结束的距离(见上文)。

  3. PolyLine类,它只是LineSeg的集合,可以通过PointF列表进行初始化。 我添加了一个选项来描述封闭的折线,方法是在最后一个点添加一个线段。

通过在线上取一个点并沿垂直于线的方向移动它然后通过具有相同方向的那个点计算系数abc来计算无限线的偏移。 通过找到它们的交点,通过它的相邻线“修剪”无限线。

要完全解释是复杂的,但您可以自由探索源代码并提出问题。 可以在此处访问项目的源代码。