旋转矩形直到两点的 y 坐标相等

Rotate a rectangle until two points have equal y coordinates

假设我有一个矩形 (R) 并且在所述矩形内,我有两个点 A 和 B。我需要围绕中心点 (C) 旋转矩形到点 A 和 B 具有相等的 y 坐标.由于对此的解决方案可能会产生两个单独的答案(其中 Ax < Bx,并且 Ax > Bx),我想将其限制为仅允许 Ax < Bx.

的解决方案

我的解决办法是绕M(A和B的中点)旋转时求解theta,然后绕C旋转theta(下)。

这会在所有 cases/is 这个最优的情况下工作吗?提前致谢!

CGPoint m = CGPointMake(a.x / 2 + b.x / 2, a.y / 2 + b.y / 2);
float dx = m.x - a.x;
float dy = m.y - a.y;
float radians = -atan2f(dy, dx)

您可以围绕C进行旋转,但要通过检查A点和B点之间的关系来确定旋转角度。旋转角度将为-atan2(dy, dx),其中dy = B.y-A.ydx = B.x-A.x.

atan2的范围是-M_PIM_PI,所以表达式总是提供最小的旋转,使直线AB平行于x轴。要生成 A.x < B.x 的结果,请检查 dx 的符号。负 dx 表示 A.x > B.x。在这种情况下,您的旋转应该由 pi 调整。总结:

CGPoint A = // some point
CGPoint B = // some point

CGFloat dx = B.x - A.x;
CGFloat dy = B.y - A.y;
CGFloat rotation = (dx < 0)? M_PI+atan2(dy,dx) : -atan2(dy,dx);

将旋转应用到矩形坐标系中您希望的任何点。矩形将围绕该点旋转,使线 AB 平行于 x 轴,离开 A.x < B.x.