【发布时间】: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
-
您使用的
x和y相同。注意x向右增加,而y向下增加,所以你的targetPt.y - centerPt.y部分应该是相反的 -
另一个问题是
theta += Math.PI/2.0;,这部分旋转方向与您图片中的方向相反。请改用theta -= Math.PI/2.0;
标签: java android math geometry