需要在行首画“>”形

Need to draw ">" shape on beginning of line

我用红色画了一条线(基本上,我有坐标(x1,y1)和(x2,y2))。 现在我应该画两条绿色的线,相交于 line(x1, y1)

的起点

红线可以是任意角度,所以我需要一些帮助。 我如何在数学上获得两条绿线的坐标。 即我已经有了 (x1, y1),所以我需要 (x3, y3) 和 (x4, y4)

绿线之间的角度应在85到90度之间,每条绿线的长度不应超过10像素(固定大小)

我有一个 API 来绘制一条需要坐标的线,所以我需要代码来计算 C++/C++11 中绿线的坐标。

第一步:在红线方向计算长度为10的"vector":

v = 10 * (x1-x2, y1-y2) / length of (x1-x2, y1-y2)

向量的长度来自毕达哥拉斯:(X,Y)的长度是sqrt(X*X+Y*Y)。为此有一个标准的数学库函数:std::hypot.

此矢量应指向您想要绿线的同一侧。

第二步是将矢量 v 向两侧旋转 45 度角,得到代表两条绿线的矢量。旋转的一般公式会给你这个:

green1 = (v.x cos(45) - v.y sin(45), v.x sin(45) + v.y cos(45))
green2 = (v.x cos(45) + v.y sin(45), -v.x sin(45) + v.y cos(45))

由于 45 度角的特殊性,这将简化很多:余弦和正弦具有相同的值 cos(45) = sin(45) = sqrt(1/2)

一旦你有了这两个向量,你只需要将它们添加到 (x1,y1)。

综合起来:

length_of_red = std::hypot(x1 - x2, y1 - y2);
sqrt_half = std::sqrt(.5);

x = 10*(x1 - x2) / length_of_red;
y = 10*(y1 - y2) / length_of_red;
x3 = x1 + sqrt_half*(x - y);
y3 = y1 + sqrt_half*(x + y);
x4 = x1 + sqrt_half*(x + y);
y4 = y1 + sqrt_half*(-x + y);