2014-09-19 233 views
11

我想弄清楚如何能够计算出圆上的坐标。为了简单,我制作了一些图像。如何计算具有一定角度的圆上的位置?

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度,它仍然会返回比原始坐标更多的值。

任何帮助,将不胜感激!

为菲利普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

为什么你不能在整个时间以极坐标工作?仅适用于展示阶段转换为笛卡尔。 – Bathsheba 2014-09-19 08:48:57

+0

否则,此链接可能会对您有所帮助:http://en.wikipedia.org/wiki/Rotation_matrix – Bathsheba 2014-09-19 08:51:27

+0

您正在使用'x'和'y'。请注意,'x'在向右增加,而'y'在向下增加,因此您的'targetPt.y - centerPt.y'部分应该是相反的 – Eypros 2014-09-19 08:59:51

回答

14

那如何:

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,它起作用。

+0

我试过这个,但遇到了一个问题。我将自己的价值观置于顶端,因为我无法在评论中放置代码。 – Marc 2014-09-19 09:18:07

+0

看看我的更新。 0度在圆的东侧。所以你的计算是正确的。 – 2014-09-19 10:15:41

+0

您是否设法解决您的问题? – 2014-09-19 11:17:56

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度。

0

完成此操作的一个优雅方法是使用复数,例如here

在伪代码:

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

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