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

我有以下代码返回生成的行。我在形状角度上有问题。一点越过原始线。

我的代码是:

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的系数bca*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

07-26 09:28