【问题标题】:Calculate new point offset based on angle of rotation?根据旋转角度计算新点偏移?
【发布时间】:2014-11-18 08:58:58
【问题描述】:

过去几周我一直在处理一个涉及一些三角函数的应用程序,但目前卡住了。如下图所示,我有一个圆形项目(位置 #1 处的绿色圆圈),我知道它的中心点(我们称之为 X1,Y1)。圆圈有另一个点(橙色圆圈)有点偏离中心 - 在其他两个标记(蓝色圆圈)之间。这些标记可以四处移动。计算橙色点的坐标(我们称之为 X2,Y2),并计算蓝线相对于圆的水平线的角度(称之为角度)。

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

deltaX = X2-X1

deltaY = Y2-Y1

我需要将绿色圆圈(顺时针或逆时针 - 以较短者为准)从其起始位置(位置 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)

我希望当圆移动/旋转到位置 2 时,我需要将这些偏移量调整到它的新中心。

X3 = X3 + 偏移量X

Y3 = Y3 + 偏移量Y

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

非常感谢您的宝贵时间!

【问题讨论】:

    标签: c# .net math trigonometry robotics


    【解决方案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 如果旋转基点随着橙色点移动,那么出于计算目的,先移动或旋转并不重要。如果您将橙色点移动到 (X3, Y3) 但是答案将是错误的,因为您可能围绕它的中心旋转圆圈,而不是围绕橙色点(您围绕它进行旋转的点,旋转后不会改变它的坐标)。当然,只有 (X3, Y3) 不随圆旋转。
    • @DataCrypt 任何值都适用于sincos,这些公式甚至是-9000。唯一让我感到困惑的是90 - Angle,因为我看到的所有 sin 和 cos 实现都采用角度的弧度值,而不是度数。但我很确定你知道。
    【解决方案2】:

    请注意,您的代码使用的是逆时针旋转(通常角度是逆时针测量的),这可能是您没有得到预期结果的原因。如果你想顺时针旋转试试:

    offsetX = deltaX * cos(angle) + deltaY * sin(angle)
    offsetY = -deltaX * sin(angle) + deltaY * cos(angle)
    

    确保您的角度是弧度而不是度数。 画一些线也可以帮助你调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多