我有一组代表一条线的点。它可以是封闭形状或开放形状。
我需要画一条平行线,该线除了原始线外没有任何交叉点。
我有以下代码返回生成的行。我在形状角度上有问题。一点越过原始线。
我的代码是:
PointF[] GetParrarel(PointF[] lst, double width, float distance)
{
List<PointF> final = new List<PointF>();
width = width + distance;
for (int i = 0; i < lst.Length-1 ; i++)
{
int index = i;
PointF current = lst[index];
PointF next = lst[index + 1];
double dx = next.X - current.X;
double dy = next.Y - current.Y;
PointF first = current;
PointF second = next;
if (dx > 0)
{
if (dy == 0)
{
first.Y += (float)width;
second.Y += (float)width;
}
first.X += (float)width;
second.X += (float)width;
}
else if (dx < 0)
{
if (dy == 0)
{
first.Y -= (float)width;
second.Y -= (float)width;
}
first.X -= (float)width;
second.X -= (float)width;
}
else //// X = 0
{
if (dy > 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();
}
最佳答案
我想出了办法,但这很复杂。这是我所做的示例的屏幕截图。
为此,我需要三节课。
类Line
,它使用等式a
的系数b
,c
,a*x+b*y+c=0
描述无限线。构造函数采用两个PointF
并计算系数。该线有一个“中心”,它是最接近原点的点。沿线的任何点都可以描述为距沿线方向的“中心”的距离。
类LineSeg
,它通过指定一条线以及到线中心的起点和终点距离来描述线段(请参见上文)。
类PolyLine
只是LineSeg
的一个集合,可以通过PointF
的列表进行初始化。我添加了一个选项来描述闭合的折线,方法是将线段添加到最后的初始点。
无限线的偏移量的计算方法是:在直线上取一个点,然后在垂直于该线的方向上移动该点,然后以相同的方向(c
)计算通过该点的新系数c -> c + offset*sqrt(a^2+b^2)
。通过找到相邻线的交点,可以将生成的无限线“修剪”为其相邻线。
进行全面解释很复杂,但是您可以自由探索源代码并提出问题。该项目的源代码可通过here访问。
注意:方程式为a*x+b*y+c=0
的线到原点的距离为distance = c/sqrt(a^2+b^2)
。因此,要偏移一条线,您需要一个新的c
,导致新的距离为distance+offset