2014-09-19 235 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)爲中心的圓。如果中心不在,只需添加一個班次。