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

时间:2014-09-19 08:43:54

标签: java android math geometry

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

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度进行这些计算时,它仍会返回另一个值而不是原始坐标。

任何帮助将不胜感激!

为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坐标但不保留它们。

3 个答案:

答案 0 :(得分:15)

多数民众赞成:

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度位于圆圈的最北侧位置:

enter image description here

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

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

在我的图表库中使用here,它可以正常工作。

答案 1 :(得分:0)

这需要一些数学。你需要知道两条线是否相互垂直,这两条线的渐变应该等于-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度。

答案 2 :(得分:0)

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

在伪代码中:

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

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