此外,如果有人知道如何对这条线应用抗锯齿功能,那将是非常有帮助的。
计算起始点和终止点之间的向量
V.X := Point2.X - Point1.X;
V.Y := Point2.Y - Point1.Y;
然后计算其垂线(只需交换X和Y坐标即可)
P.X := V.Y; //Use separate variable otherwise you overwrite X coordinate here
P.Y := -V.X; //Flip the sign of either the X or Y (edit by adam.wulf)
将那个垂直方向归一化
Length = sqrt(P.X * P.X + P.Y * P.Y); //Thats length of perpendicular
N.X = P.X / Length;
N.Y = P.Y / Length; //Now N is normalized perpendicular
通过添加标准化的垂线并将其乘以所需宽度的一半,计算形成矩形的4个点
R1.X := Point1.X + N.X * Width / 2;
R1.Y := Point1.Y + N.Y * Width / 2;
R2.X := Point1.X - N.X * Width / 2;
R2.Y := Point1.Y - N.Y * Width / 2;
R3.X := Point2.X + N.X * Width / 2;
R3.Y := Point2.Y + N.Y * Width / 2;
R4.X := Point2.X - N.X * Width / 2;
R4.Y := Point2.Y - N.Y * Width / 2;
使用这4个点绘制矩形。
这是图片:
编辑: 回答评论: 如果X和Y相同,则该线正好是对角线,垂直于对角线的是对角线。归一化是一种使长度等于1的方法,因此在这个例子中,你的线条宽度不会取决于垂线的长度(在这里等于线条长度)。
* Width / 2
加入N中可能更值得考虑。 - drewishQPolygon polygon;
polygon << QPoint(R1X, R1Y) << QPoint(R2X, R2Y) << QPoint(R4X, R4Y) << QPoint(R3X, R3Y);
- Ashif简单的方法(我将把“宽度”称为线条的厚度):
我们需要计算每个角落在x轴和y轴上的移位量,这很容易。
线的尺寸为:
width = x2 - x1
height = y2 - y1
xS = (thickness * height / length of line) / 2
yS = (thickness * width / length of line) / 2
要找到线的长度,请使用勾股定理:
length = square_root(width * width + height * height)
First coordinate is: (x1 - xS, y1 + yS)
Second: (x1 + xS, y1 - yS)
Third: (x2 + xS, y2 - yS)
Fourth: (x2 - xS, y2 + yS)
好的,完成了!(这些坐标是逆时针绘制的,这是OpenGL的默认设置)
如果我理解正确,您有两个端点A(x1,y1)和B(x2,y2),以及一个任意的矩形宽度w。我假设端点将恰好位于矩形较短的一侧的中间位置,这意味着最终矩形的角坐标距离A和B的距离将为w/2。
您可以通过以下方式计算线的斜率;
s1 = (y2 - y1) / (x2 - x1) //假设x1 != x2
短边的斜率就是s2 = -1/s1。
我们有斜率,距离和参考点。
然后我们可以为每个角点推导出两个方程式:
对于靠近A的一个角落
C(x3,y3):
(y3 - y1) / (x3 - x1) = s2 //通过斜率
(y3 - y1)^2 + (x3 - x1)^2 = (w/2)^2 // 通过距离
用a替换(y3 - y1),用b替换(x3 - x1):
a = b * s2 //斜率公式
//用b*s2代替a
b^2 * s2^2 + b^2 = (w/2)^2 // 距离公式
b^2 = (w/2)^2 / (s2^2+1)
b = sqrt((w/2)^2 / (s2^2+1))
我们知道 w 和 s2,因此可以计算出 b
如果已知 b,则可以推导出 x3
x3 = b + x1
以及 a
a = b * s2
和 y3
y3 = b*s2 + y1
我们有一个角点 C(x3,y3)。
要计算靠近 A 的另一个角点 D(x4,y4),可以构建斜率方程
(y1 - y4) / (x1 - x4) = s2 并应用上述计算。
其他两个角落可以使用此处列出的步骤进行计算,将 A(x1, y1) 替换为 B(x2,y2)。