绘制平行线

时间:2011-12-09 18:54:50

标签: c# graphics line gdi

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

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

我的代码是:

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();
}

1 个答案:

答案 0 :(得分:4)

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

我需要三个课程。

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

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

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

  4. 通过在线上取一个点并沿垂直于线的方向移动它然后通过具有相同方向的那个点计算新系数c来计算无限线的偏移({{1 }})。通过找到它们的交点,由它的相邻线“修剪”得到的无限线。

    完全解释很复杂,但您可以自由探索源代码并提出问题。该项目的源代码可以访问here

    注意:等式c -> c + offset*sqrt(a^2+b^2)的直线与原点的距离为a*x+b*y+c=0。因此,要偏移某一行,您需要新的distance = c/sqrt(a^2+b^2),以使新距离为c