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
并计算系数。该线有一个“中心”,即距离原点最近的点。沿直线的任何点都可以描述为沿直线方向与“中心”的距离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
并计算系数。该线有一个“中心”,即距离原点最近的点。沿直线的任何点都可以描述为沿直线方向与“中心”的距离
classLineSeg
,通过指定直线以及距直线中心的起点和终点距离来描述线段(见上文)
类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
是什么。在我看来,你只需要一个标量偏移量
。可能重复的在线相关论文你现在可以给出答案了……这是一个偶然的家庭作业吗?宽度是多少,距离是多少。在我看来,你只需要一个标量偏移量
。可能重复的在线相关论文你现在可以奖励答案了。。。