如何旋转一条线使其与另一条线平行?

How do I rotate one line so that it is parallel to the other?

用户正在更改第一条线(当前线)的一个顶点,第二条线应立即与第一条线平行。为此,我尝试使用公式找到这些线的两个向量之间的角度:

  vec1.x =(x-x2), vec1.y =(y-y2); // coordinates of first vector (x,y) - user-editable point

  vec2.x =(x3-x4), vec2.y =(y3-y4); // coordinates of second vector 

  double angle = acos(
               ( vec1.x * vec2.x + vec1.y * vec2.y ) 
                                        /
                sqrt( ( SQR(vec1.x) + SQR(vec1.y) ) * ( SQR(vec2.x) + SQR(vec2.y) ) ) 
                );

when x > x2 formula gives angle > 90°

when x < x2 formula gives angle < 90°

然后将第二行旋转angle

point xAxis = point{cos(angle),sin(angle)};
point yAxis = point{-sin(angle),cos(angle)};
          
point origin = point{x3,y3};

point p = point{x4-origin.x, y4-origin.y};

x4 =  origin.x + p.x * xAxis.x + p.y * yAxis.x;
y4 =   origin.y + p.x * xAxis.y + p.y * yAxis.y;

当我逆时针旋转线时一切正常,第二条线与第一条线平行,

但是当我顺时针旋转第二行时,第二行开始怪胎表演

我猜想在某些情况下,我应该将第二行旋转 angle,而不是旋转 -angle

cos(a) == cos(-a),所以 acos(cos(a)) 可能会给你 a-a。都是正确的。

如果你想得到一个向量的角度,使用atan2(y,x),它覆盖了整个圆。如果你想用你的余弦解,你必须自己区分角度的正负,并确保结果在右象限。

但是你的问题更容易解决:

len1 = sqrt((x2-x)*(x2-x) + (y2-y)*(y2-y));
len2 = sqrt((x4-x3)*(x4-x3) + (y4-y3)*(y4-y3));

x4 = x3 + (x2-x)*len2/len1;
y4 = y3 + (y2-y)*len2/len1;

你只需要在第一条的方向上换行,第二条的长度。检查 len1==0.0,因为在这种情况下方向未定义。

另请注意,无论您如何执行此操作,都会在用户拖动点时累积错误。每次更改 line2 时,长度都会改变一点点,然后您将以此作为下一个的基础。错误很小,您可能不会注意到,但您应该真正记住开头的 len2 并在以后的所有操作中使用该值。