【问题标题】:Rotate a rectangle until two points have equal y coordinates旋转一个矩形,直到两个点的 y 坐标相等
【发布时间】:2015-10-17 02:01:48
【问题描述】:

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

我的解决方案是在围绕 M(A 和 B 之间的中点)旋转时求解 theta,然后围绕 C 旋转 theta(下图)。

这是否适用于所有情况/这是最优的吗?提前致谢!

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)

【问题讨论】:

  • 很可能发布您的代码。相信我!
  • 无论旋转哪个点,需要旋转的角度都是一样的。
  • caf5 - 我相信你是对的。我一回到我的开发 PC 就会发布我的代码。
  • 你没有解释什么是“M”。
  • @robmayoff - 我认为它是中心,我认为它与旋转角度无关。

标签: objective-c rotation rectangles points


【解决方案1】:

您可以围绕 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。在这种情况下,您的旋转应该由 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

【讨论】:

  • 你能解释一下为什么方程不是:CGFloat rotation = (dx
  • 我们需要一个简单的斜率来计算 arctan,即 x 的变化除以 y 的变化。
  • 我相信上述方法也适用,使用中点,因为它产生相同的结果。
  • 中点将是 dx/2 和 dy/2,而不是平方。平方是这些差异的非线性变化。
  • 对不起。由于编辑,很难跟踪这一点。线上的任何两个点都足以计算其斜率。中点当然是线上的一个点,但输入点也是如此。无需计算其他点即可获得斜率。您最近的编辑只需要解决 x 排序问题,它就相当于我的。
猜你喜欢
  • 2016-02-13
  • 2012-07-25
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 2016-03-27
  • 2013-03-25
相关资源
最近更新 更多