如何旋转一条线使其与另一条线平行?
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
并在以后的所有操作中使用该值。
用户正在更改第一条线(当前线)的一个顶点,第二条线应立即与第一条线平行。为此,我尝试使用公式找到这些线的两个向量之间的角度:
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 givesangle > 90°
when
x < x2
formula givesangle < 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
并在以后的所有操作中使用该值。