【问题标题】:Need to draw ">" shape on beginning of line需要在行首绘制“>”形状
【发布时间】:2020-04-17 23:20:11
【问题描述】:

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

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

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

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

【问题讨论】:

  • 将归一化向量 (P1, P2) 分别旋转 -135 和 +135 度,与 P1 相加得到 P3 和 P4。
  • 我认为您仍然需要定义绿线之间的角度它们的长度。否则,您的问题会有无限的答案。
  • 绿线夹角为90度,绿线长度不超过10像素。

标签: c++ c++11 math mathematical-expressions


【解决方案1】:

第一步:在你拥有的红线方向上计算一个长度为 10 的“向量”:

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多