C# 画平行线

C# 画平行线,c#,graphics,line,gdi,C#,Graphics,Line,Gdi,我有一组点代表一条线。它可能是一个封闭的形状,也可能是一个开放的形状。 我需要画一条平行线,这条平行线与原来的平行线不相交 我有以下代码返回生成的行。我在形状的角度上有问题。有些点越过了原始线 我的代码是: PointF[] GetParrarel(PointF[] lst, double width, float distance) { List<PointF> final = new List<PointF>(); width = width + di

我有一组点代表一条线。它可能是一个封闭的形状,也可能是一个开放的形状。 我需要画一条平行线,这条平行线与原来的平行线不相交

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

我的代码是:

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();
}
PointF[]getPararel(PointF[]lst,双宽,浮动距离)
{
最终列表=新列表();
宽度=宽度+距离;
对于(int i=0;i0)
{
如果(dy==0)
{
第一,Y+=(浮动)宽度;
第二,Y+=(浮动)宽度;
}
第一个.X+=(浮动)宽度;
第二,X+=(浮动)宽度;
}
else if(dx<0)
{
如果(dy==0)
{
第一,Y-=(浮动)宽度;
第二,Y-=(浮动)宽度;
}
第一个.X-=(浮动)宽度;
第二,X-=(浮动)宽度;
}
else///X=0
{
如果(dy>0)
{
第一个.X-=(浮动)宽度;
第二,X-=(浮动)宽度;
}
else if(dy<0)
{
第一个.X+=(浮动)宽度;
第二,X+=(浮动)宽度;
}
其他的
{
持续
}
}
最后添加(第一);
最后添加(第二);
}
返回final.ToArray();
}

我知道怎么做了,但它很复杂。下面是我做的一个例子的截图。

我需要上三节课

  • Line
    ,它使用方程
    a*x+b*y+c=0
    的系数
    a
    b
    c
    来描述一条无限长的直线。构造函数获取两个
    点f
    并计算系数。该线有一个“中心”,即距离原点最近的点。沿直线的任何点都可以描述为沿直线方向与“中心”的距离

  • class
    LineSeg
    ,通过指定直线以及距直线中心的起点和终点距离来描述线段(见上文)

  • PolyLine
    ,它只是
    LineSeg
    的集合,可以通过
    PointF
    列表初始化。我添加了一个选项来描述闭合多边形线,方法是在端点的初始点上添加线段

  • 无限直线的偏移量是通过在直线上取一个点并沿与直线垂直的方向移动它,然后计算新的系数
    c
    ,通过该点以相同的方向(
    c->c+offset*sqrt(a^2+b^2)
    )。通过找到相邻直线的交点,生成的无限直线将被相邻直线“修剪”

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


    注:等式为
    a*x+b*y+c=0的直线到原点的距离为
    distance=c/sqrt(a^2+b^2)
    。因此,要偏移一条线,你需要一个新的
    c
    ,这个新的距离就是
    distance+offset

    我知道了怎么做,但它很复杂。下面是我做的一个例子的截图。

    我需要上三节课

  • Line
    ,它使用方程
    a*x+b*y+c=0
    的系数
    a
    b
    c
    来描述一条无限长的直线。构造函数获取两个
    点f
    并计算系数。该线有一个“中心”,即距离原点最近的点。沿直线的任何点都可以描述为沿直线方向与“中心”的距离

  • class
    LineSeg
    ,通过指定直线以及距直线中心的起点和终点距离来描述线段(见上文)

  • PolyLine
    ,它只是
    LineSeg
    的集合,可以通过
    PointF
    列表初始化。我添加了一个选项来描述闭合多边形线,方法是在端点的初始点上添加线段

  • 无限直线的偏移量是通过在直线上取一个点并沿与直线垂直的方向移动它,然后计算新的系数
    c
    ,通过该点以相同的方向(
    c->c+offset*sqrt(a^2+b^2)
    )。通过找到相邻直线的交点,生成的无限直线将被相邻直线“修剪”

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


    注:等式为
    a*x+b*y+c=0的直线到原点的距离为
    distance=c/sqrt(a^2+b^2)
    。因此,要偏移一条线,你需要一个新的
    c
    ,这个新的距离就是
    distance+offset

    这是一个偶然的家庭作业吗?
    width
    distance
    是什么。在我看来,你只需要一个标量
    偏移量
    。可能重复的在线相关论文你现在可以给出答案了……这是一个偶然的家庭作业吗?
    宽度是多少,距离是多少。在我看来,你只需要一个标量
    偏移量
    。可能重复的在线相关论文你现在可以奖励答案了。。。