如何计算具有一定角度的圆上的位置?

2022-09-03 13:52:19

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

http://i.stack.imgur.com/y1F2y.png

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

http://i.stack.imgur.com/ckopK.png

我需要计算新红点的坐标。(我还需要不同程度的这个,例如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度进行这些计算时,它仍然返回比原始坐标另一个值。

任何帮助将不胜感激!

编辑菲利普·贾霍达:

我的价值观是:

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坐标,但它不保留这些坐标。


答案 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;
}

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

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

请注意,0 度位于圆的最东端位置,270 度位于圆的最北端位置:

enter image description here

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

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

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


答案 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