【问题标题】:How to calculate position on a circle with a certain angle?如何计算具有一定角度的圆上的位置?
【发布时间】:2014-11-13 19:21:30
【问题描述】:

我试图弄清楚如何计算圆上的坐标。为简单起见,我制作了一些图片。

这就是我掌握的信息的开始。现在我需要计算新坐标,例如当圆向右转 90 度时。就像下一张图片:

我需要计算新红点的坐标。 (我也需要这个不同的度数,比如20度)。

为此,我的计划是执行以下操作:

  • 计算两点之间的距离
  • 计算北(上)与给定点之间的度数
  • 用度数(从后退一步)+ 需要转动的度数(在图像中为 90 度)计算新位置。

我的第一步是:

distance = Math.sqrt((point1.x-point2.x)*(point1.x-point2.x) + (point1.y-point2.y)*(point1.y-point2.y))

计算新度数的部分是:

double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x);
theta += Math.PI/2.0;

计算新位置的最后一部分是:

double x = mMiddleView.getX() + distance * Math.cos(Math.toRadians(theta));
double y = mMiddleView.getY() + distance * Math.sin(Math.toRadians(theta));

但是,当我使用例如 0 度进行这些计算时,它仍然返回不同于原始坐标的另一个值。

任何帮助将不胜感激!

为 Philipp Jahoda 编辑:

我的价值观是:

distance +- 70, currentDegree = 0.
PointF point = new PointF((float)mMiddleView.getX(), (float)mMiddleView.getY());
PointF point2 = getPosition(point, (float) distance, currentDegree);

我的结果是:

center: PointF(490.0, 728.0) radius: 78.0 angle: 0.0
new point: PointF(568.0, 728.0)

如您所见,度数为 0,因此该点不应转动。它应该保留 490、728 坐标,但不会保留这些坐标。

【问题讨论】:

  • 为什么不能一直在极坐标下工作?仅用于显示阶段转换为笛卡尔坐标。
  • 否则,此链接可能会对您有所帮助:en.wikipedia.org/wiki/Rotation_matrix
  • 您使用的xy 相同。注意x 向右增加,而y 向下增加,所以你的targetPt.y - centerPt.y 部分应该是相反的
  • 另一个问题是theta += Math.PI/2.0;,这部分旋转方向与您图片中的方向相反。请改用theta -= Math.PI/2.0;

标签: java android math geometry


【解决方案1】:

就是这样:

private PointF getPosition(PointF center, float radius, float angle) {

    PointF p = new PointF((float) (center.x + radius * Math.cos(Math.toRadians(angle))),
    (float) (center.y + radius* Math.sin(Math.toRadians(angle))));

    return p;
}

此方法根据半径和角度计算圆心(视图中心)周围的位置。以度为单位的角度。

返回的PointF 将包含计算位置的 x 和 y 坐标。

注意0度在圆的最东边,270度在圆的最北边:

因此,如果您的视图中心位于 x: 100, y: 100 并且您以 0 度的角度和 50 的半径计算位置,结果将是 x: 150, y: 100

如果您使用角度 90 度和半径 50,结果将是 x: 100, y: 150

它在我的图表库中使用here,并且有效。

【讨论】:

  • 我试过这个,但遇到了问题。我将我的价值观放在首位,因为我无法将代码放入 cmets。
  • 看看我的更新。 0 度在圆的东边。所以你的计算是正确的。
  • 还没有,还有其他事情需要我去做。稍后会报告它,因为我将在今天晚些时候继续。
  • 好的,我研究了一下,它部分工作。它如何计算坐标效果很好,但有一个问题。它只停留在圆圈的右上角。我将我的结果(带有 x、y、半径、角度)粘贴到了这个 pastebin 中:-removed- 它应该到处而不是只在右上角,如果可以修复它会是完美的。编辑:没关系。它现在确实有效,现在可以修复我自己的错误。谢谢!
  • @PhilippJahoda:如果 0 度在最北的位置,90 度在圆的最东位置,在最南的位置与 180 相同,我该怎么办......,我应该对大于 90 的角度做负 90,对小于 90 的角度做 270 吗?
【解决方案2】:

这里需要一些数学知识。你需要知道两条线是否相互垂直,两条线梯度的乘积应该等于-1

然后

m1=(770-500)/(540-400)=27/14

同样的方式

m2=(y-770)/(x-540)

(x,y) 是您要查找的点。

现在

m1*m2=-1

现在我们得到了一个方程。您需要另一个,因为需要找到两个变量

你可以通过考虑圆的半径来获得另一个。

r=sqrt((540-400)^2+(770-500)^2)

同样的方法

r=sqrl((x-540)^2+(y-770)^2)

现在你有两个方程,只需要求解。这将为您提供两组坐标。因为可以有-9090 度数。

【讨论】:

    【解决方案3】:

    实现此目的的一种优雅方法是使用复数,例如 here

    在伪代码中:

    z = (x_old + I*y_old)*exp(I*angle);
    x_new = real(z);
    y_new = imag(z);
    

    注意:旋转angle 需要以弧度表示。 注意2:这假设一个以(0,0)为中心的圆。如果中心不存在,只需添加一个班次即可。

    【讨论】:

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