2012-04-03 47 views
4

我試圖在指定的度數值下圍繞另一個Java中的二維點旋轉,在這種情況下僅在90度的點(0,0)周圍。Java:按指定的度數值圍繞另一個點旋轉點

方法:

public void rotateAround(Point center, double angle) { 
    x = center.x + (Math.cos(Math.toRadians(angle)) * (x - center.x) - Math.sin(Math.toRadians(angle)) * (y - center.y)); 
    y = center.y + (Math.sin(Math.toRadians(angle)) * (x - center.x) + Math.cos(Math.toRadians(angle)) * (y - center.y)); 
} 

預期爲(3,0):X = 0,Y = -3

發回(3,0):X = 1.8369701987210297E-16,Y = 1.8369701987210297E-16

預期爲(0,-10):X = -10,Y = 0

發回(0,-10):X = 10.0,Y = 10.0

該方法本身有問題嗎?我將函數(Rotating A Point In 2D In Lua - GPWiki)移植到Java。

編輯:

做了一些性能測試。我不會這麼想,但矢量解決方案贏了,所以我會用這個。

回答

10

如果你有機會獲得java.awt,這只是

double[] pt = {x, y}; 
AffineTransform.getRotateInstance(Math.toRadians(angle), center.x, center.y) 
    .transform(pt, 0, pt, 0, 1); // specifying to use this double[] to hold coords 
double newX = pt[0]; 
double newY = pt[1]; 
+0

速度夠快嗎?我需要這種方法在遊戲中使用速度非常快。本機例程似乎不是性能優化的。 – Aich 2012-04-03 01:35:29

+0

AWT是爲繪圖而設計的,它通常意味着遊戲 - 所以我不擔心。 – 2012-04-03 04:13:39

+0

@LouisWasserman偉大的工作,非常感謝你 – Aladdin 2013-07-19 00:05:58

1

在對Y值進行計算之前,您正在變更center的X值。改爲使用臨時點。

此外,該功能需要三個參數。你爲什麼只有兩個?

+0

在Lua代碼的第一個參數是要移動點。那裏的函數似乎沒有綁定到類,就像在PHP中一樣。在我的java代碼中,第一個參數出現在方法調用之前,point.rotateAround(center,angle)。 – Aich 2012-04-03 00:22:19

+0

添加了溫度座標,該方法仍會返回意外的值。 =/ – Aich 2012-04-03 00:35:42

+1

你可以發佈你的新代碼嗎?因爲@Peter已經正確地解釋了爲什麼你的代碼沒有做正確的事情。這聽起來像你沒有正確理解他要求你做的事情。 – 2012-04-03 04:15:01