画一条平行线。

29

我有点(x1,y1)和点(x2,y2),它们构成了一条线段。如何得到与第一条线段平行的另一条线段x3,y3 - x4,y4,如图片所示?我可以简单地在x1和x2上加n来得到一条平行线,但这不是我想要的。我希望这些线在图片中像平行线一样。

enter image description here

2个回答

55
您要做的是沿正交方向偏移坐标。如果您知道向量数学,可以将由线段两端点之间距离创建的向量乘以以下矩阵:
[ 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 / Ldy = 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

实际上,我不懂向量数学。您能否写一个C#或伪代码函数来实现您所说的内容? - VOX
搞定了。但我还有一个问题,如果我想要将其偏移10像素,我应该将dx乘以10吗? - VOX
1
您刚刚救了我不用重新学习几何学!继续保持好工作! - Greg Bray
这是一个省时的方法 - 我想知道如何在Qt中使用QTransform来实现(我只是不明白),但这种蛮力方法非常有效。 - Scott
@Krumelur 如果我有一条之字形的线,那么它的逻辑是什么?是相同的还是我们需要找到两条连接线的角度? - jatin_ghataliya

0

你尝试过在x1和x2上加n,同时在y1和y2上减去n吗?我猜那可能会起作用。


当直线为90度或180度时,从y1和y2中减去的结果不正确。 - VOX
可能你可以考虑边界条件,即检查y1、y2是否为零。 - gsk
@Krumelur的方法不需要检查边缘。 ;) - VOX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接