根据旋转角度计算新的点偏移?

7
我过去几周一直在开发一个涉及三角学的应用程序,目前遇到了困难。如下图所示,我有一个圆形物品(位于位置#1的绿色圆圈),我知道它的中心点(我们称之为X1,Y1)。圆上还有另一个点(橙色圆圈),它有点偏离中心 - 位于两个其他标记(蓝色圆圈)之间。这些标记可以移动。橙点的坐标被计算出来(我们称之为X2,Y2),蓝线的角度也被计算出来(我们称之为Angle),相对于圆的水平线。

Diagram

我可以通过以下方式计算圆心和点之间的差:

deltaX = X2-X1

deltaY = Y2-Y1

我需要将绿色圆圈移动并旋转(向CW或CCW方向,以较短的方式),从其起始位置(位置1)移到位置2。这意味着角度可能为负或正。蓝线必须垂直,橙点必须位于位置2的中心(红色正方形)。我知道位置2的中心坐标(我们称此点为X3,Y3)。位置#1和位置#2彼此正好相距90度。

我认为我可以使用一些三角恒等式公式来计算点的旋转,例如:

offsetX = deltaX * cos(90-Angle) - deltaY * sin(90-Angle)

offsetY = deltaX * sin(90-Angle) + deltaY * cos(90-Angle)

我希望这些偏移量是我将圆形调整到其新中心时所需的内容。

X3 = X3 + offsetX

Y3 = Y3 + offsetY

但是,当我尝试使用这个数学公式时,它没有将圆的橙色标记放在正方形的中心。不确定基于旋转角度(正或负,CW或CCW)我的方程式和计算是否正确,或者我是否正确使用了角度(在90度中减去已知角度)。如何正确计算最终的点/位置?任何帮助和示例都将不胜感激!

非常感谢您的时间!

2个回答

1

所以你需要将你的圆形旋转 90 - Angle 然后将橙点移动到 (X3, Y3)?
首先你需要找到旋转后橙点的坐标:

newX = X2 * cos(90 - Angle) - Y2 * sin(90 - Angle);
newY = X2 * sin(90 - Angle) + Y2 * cos(90 - Angle);

newXnewY是旋转后的橙色点坐标。要找到移动变换,只需相减:

moveX = X3 - newX;
moveY = Y3 - newY;

现在如果你将圆形旋转90 - Angle并将其移动(moveX, moveY),则橙色点将移动到(X3, Y3)。 这是如果你围绕(0, 0)点旋转圆的情况。 如果你围绕某个(X,Y)点旋转,你首先需要从X2中减去X,从Y2中减去Y,然后将X添加到newX,将Y添加到newY。 那个减法“移动”了你的旋转基点到(0, 0),所以旋转后你需要将它移回去:
newX = (X2 - X) * cos(90 - Angle) - (Y2 - Y) * sin(90 - Angle) + X;
newY = (X2 - X) * sin(90 - Angle) + (Y2 - Y) * cos(90 - Angle) + Y;

谢谢。我会尝试一下。我想我应该澄清一下,我要将圆从位置1移动到位置2,然后在那里进行旋转。因此,我需要将橙色点(X2,Y2)居中于红色正方形(已知点X3,Y3)的中心。角度是基于蓝色圆计算出来的,有时可能是负数(在-1和-180之间)。不确定这是否影响公式? - DataCrypt
@DataCrypt 如果旋转基点与橙色点一起移动,则在计算时先移动还是先旋转并不重要。但如果您将橙色点移动到(X3,Y3),则答案可能会错误,因为您可能是围绕圆心而不是围绕橙色点旋转圆。当然,这仅适用于(X3,Y3)不随圆一起旋转的情况。 - Atomosk
@DataCrypt 对于 sincos,任何值都可以,即使是 -9000。唯一让我困惑的是 90 - Angle,因为我看到的所有 sin 和 cos 实现都采用角度的弧度值,而不是度数。但我相信你知道这一点。 - Atomosk

0
请注意,您的代码使用了逆时针旋转(通常角度是逆时针测量),这可能是您未获得预期结果的原因。如果您想要顺时针旋转,请尝试以下方法:
offsetX = deltaX * cos(angle) + deltaY * sin(angle)
offsetY = -deltaX * sin(angle) + deltaY * cos(angle)

确保您的角度以弧度为单位而不是度数。 画一些线条也可以帮助您调试问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接