2013-12-11 98 views
1

我目前正在研究幾何引擎(我希望在其中構建一個物理和遊戲引擎)......並且它有一個問題。當我旋轉一個矩形時,比如說一個正方形,它首先將它變成一個菱形,然後幾乎看不見,然後回到正方形。旋轉正方形導致拉伸

for(int i = 0; i < fv.length; i++) { 
    double[] ve = fv[i]; 
    ve[0] = ve[0] - getCMX(); 
    ve[1] = ve[1] - getCMY(); 
    double sin = Math.sin(getRot()); 
    double cos = Math.cos(getRot()); 
    ve[0] = ((cos * ve[0]) - (sin * ve[1])); 
    ve[1] = ((-sin * ve[0]) + (cos * ve[1])); 
    ve[0] = ve[0] + getCMX(); 
    ve[1] = ve[1] + getCMY(); 
    fv[i] = ve; 
} 

fv是2D雙數組。 getCMX/CMY獲取正方形的中心。

任何想法都讚賞,我的目標是讓廣場保持同一區域,而旋轉...?

+1

嗨。要求人們發現代碼中的錯誤並不是特別有效。您應該使用調試器(或者添加打印語句)來分析問題,追蹤程序的進度,並將其與預期發生的情況進行比較。只要兩者發生分歧,那麼你就發現了你的問題。 (然後,如果有必要,你應該構建一個[最小測試用例](http://sscce.org)。) –

+0

是的,這是一個數學而不是代碼問題(在我看來)。作爲一個自學幾何的人,我不確定期望什麼,但是我認爲我得到的結果是不正確的。 – user2507230

回答

2

你的兩個罪惡因素需要有相反的跡象。你必須使用的五個[0]更新一個不變的副本已經[1]:

temp = ((cos * ve[0]) - (sin * ve[1])); 
ve[1] = ((sin * ve[0]) + (cos * ve[1])); 
ve[0] = temp; 
+0

我的否定罪正好顛倒了旋轉的方向。沒有它,問題仍然存在。 – user2507230

+0

您還必須保存ve [0]的臨時副本以用於更新ve [1]。 – PaulQ

+0

好的,如果這樣保存了形狀,那麼爲什麼在某些旋轉時,正方形變成一條線......或者完全消失,並且擴展回正方形?我改變了你所說的,沒有改變。 – user2507230

1

兩個問題:

  1. 不能將結果計算入同一載體作爲源。使用兩個向量。
  2. 右變換爲x'= c * x - s * y; y'= s * x + c * y;