C# 画一条平行线

C# 画一条平行线,c#,graphics,geometry,drawing,computational-geometry,C#,Graphics,Geometry,Drawing,Computational Geometry,我有x1,y1和x2,y2,它们形成了一个线段。我怎样才能得到另一条平行于图中第一条线的线x3,y3-x4,y4。我可以简单地把n加到x1和x2上,得到一条平行线,但这不是我想要的。我希望这两条线在图中一样平行 您是否尝试过将n减去y1和y2,同时将n加到x1和x2?我想这可能行得通您要做的是在正交方向上偏移坐标。如果您了解向量数学,请将由直线端点之间的距离创建的向量乘以以下矩阵: [ 0 -1 ] [ 1 0 ] 假设第一行有点(x1,y1),(x2,y2),带有x=x2-x1,y=y2-

我有x1,y1和x2,y2,它们形成了一个线段。我怎样才能得到另一条平行于图中第一条线的线x3,y3-x4,y4。我可以简单地把n加到x1和x2上,得到一条平行线,但这不是我想要的。我希望这两条线在图中一样平行


您是否尝试过将n减去y1和y2,同时将n加到x1和x2?我想这可能行得通

您要做的是在正交方向上偏移坐标。如果您了解向量数学,请将由直线端点之间的距离创建的向量乘以以下矩阵:

[ 0 -1 ]
[ 1  0 ]
假设第一行有点
(x1,y1)
(x2,y2)
,带有
x=x2-x1
y=y2-y1

我们还有
L=sqrt(x*x+y*y)
,行的长度(请原谅符号)。那么下一行应该偏移

[ 0 -1 ] [x]
[ 1  0 ] [y]
=>
dx=-y/L
dy=x/L
这是新行的标准化偏移量

在类C伪代码中:

var x1 = ..., x2 = ..., y1 = ..., y2 = ... // The original line
var L = Math.Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

var offsetPixels = 10.0

// This is the second line
var x1p = x1 + offsetPixels * (y2-y1) / L
var x2p = x2 + offsetPixels * (y2-y1) / L
var y1p = y1 + offsetPixels * (x1-x2) / L
var y2p = y2 + offsetPixels * (x1-x2) / L

g.MoveTo(x1p,y1p) // I don't remember if this is the way
g.LineTo(x2p,y2p) // to draw a line in GDI+ but you get the idea

当直线为90度或180度时,减去y1和y2不起作用。您可能可以设置边缘条件,即检查y1、y2或零。@Krumelur的方法不需要检查边缘。;)不,不是。对你来说,把它当作家庭作业容易吗?那么请回答我。:)事实上,我不懂向量数学。你能写一个C#或伪函数来实现你所说的吗。但还有一个问题,如果我想从原始线偏移10个像素,我应该乘以dx*10吗?先生,你刚刚让我不用重新学习几何!继续努力!这是一个节省时间的方法——我想知道如何在Qt中使用QTTransform(我只是不明白),但这种蛮力方法非常有效。@Krumelur如果我有锯齿线,那么这条线的逻辑是什么。?同一条线,或者我们需要找到两条连通线的夹角。?