且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

画一条平行线

更新时间:2021-11-14 22:09:34

您想要做的是抵消坐标在正交方向。如果知道矢量数学,乘以由线路的端点之间的距离,由以下矩阵创建的矢量:

What you want to do is to offset the coordinates in the orthogonal direction. If you know vector math, multiply the vector created by the distance between the endpoints of the line by the following matrix:

[ 0 -1 ]
[ 1  0 ]

说,第一行有个(X1,Y1)(x2,y2) X = X2-X1 Y = Y2-Y1 。结果
我们也有 L =开方(X * X + Y * Y),该线的长度(原谅符号)。然后,下一行应

Say that the first line has the points (x1,y1), (x2,y2), with x=x2-x1, y=y2-y1.
We also have L = sqrt(x*x+y*y), the length of the line (pardon the notation). Then the next line should be offset by

[ 0 -1 ] [x]
[ 1  0 ] [y]

=> DX = -y / L DY = X / L
它是归为新的行偏移。

=> dx = -y / L, dy = x / L which is the normalized offset for the new line.

在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