2015-04-05 34 views
2

我正在嘗試創建一個形狀,使船的中心位於中間。兩個Shape對象似乎在錯誤的位置相交?

one.xone.z是該船的X和Z位置。在X上的船大小約爲100,在Z上爲50。

Shape my = new Rectangle(
    (int) one.x - disToLeft, // upper-left corner X 
    (int) one.z - disToTop, // upper-left corner Y 
    disToLeft + disToRight, // width 
    disToTop + disToBottom // height 
); 

然後我旋轉Shape,當然要面對正確的方法。這似乎工作:

int rectWidth = (disToLeft + disToRight); 
int rectHeight = (disToTop + disToBottom); 
AffineTransform tr = new AffineTransform(); 

// rotating in central axis 
tr.rotate(
    Math.toRadians(one.rotation), 
    x + (disToLeft + disToRight)/2, 
    z + (disToTop + disToBottom)/2 
); 
my = tr.createTransformedShape(my); 

我然後做與另一個形狀完全相同的東西,並測試相交。這工作。

但是,感覺形狀是不正確的尺寸。或者其他的東西。我的船在很遠的一側(在圖形存在的地方)碰撞,但從另一側,我幾乎可以在發現任何碰撞之前穿過船舶!

基本上,形狀只是在錯誤的位置相交。我無法弄清楚爲什麼。形狀,位置或旋轉必須錯誤。

int disToLeft = 100; 
int disToRight = 100; 
int disToTop = 150; 
int disToBottom = 100; 

這些是從中心到左側,右側,頂部和底部的距離。

我使用的是Z而不是Y,因爲我的遊戲處於3D世界,海平面幾乎相同(因此我不必擔心Y軸碰撞!)。

更新:
做了很多的測試後,我發現,矩形的頂部是在中間!我做了很多亂七八糟的事情,但是沒有能夠以圖形的方式看到正方形,這很難測試。 這意味着框在船的一側,像這樣: enter image description here

顯然,當左邊的船旋轉到是什麼感覺在這張圖片中,檢測到衝突。 enter image description here

+0

我注意到我的代碼中的一些未使用的變量或不好的做法。請不要將它們指出來,只要我有一些實際可行的東西,我會盡快解決它們。 – Joehot200 2015-04-06 10:23:52

+1

你應該隔離一個測試用例,然後用一個調試器遍歷它。 – 2015-04-06 11:06:23

+0

@OliverCharlesworth有一些公然錯誤的東西,我只是沒有注意到和其他人。 – Joehot200 2015-04-06 16:33:09

回答

1

看來你的輪換是錯誤的。從我的數學的理解應該是

tr.rotate(Math.toRadians(one.rotation), x + (disToRight - disToLeft) /2, z + (disToBottom - disToTop) /2); 

注意標誌和變量的順序

編輯:

讓我們拆開公式:

您的矩形這樣定義:

x-coordinate (x): one.x-disToLeft 
y-coordinate (y): one.z-disToTop 
width: disToLeft+disToRight 
height: disToTop+disToBottom 

矩形的中心(你在哪裏因此otating)是:

(x+width/2) 
(y+height/2) 

如果你的聲明以上你

(one.x-disToLeft + (disToLeft+disToRight)/2) 
(one.z-disToTop + (disToTop+disToBottom)/2) 

這已經是你所需要的點,但它可以simplyfied替換x,寬度y和height:

one.x-  disToLeft + (disToLeft+disToRight)/2 
is equal to 
one.x-(2*disToLeft/2)+(disToLeft/2)+(disToRight/2) 
is equal to 
one.x-(distoLeft/2) + (disToRight/2) 
is equal to 
one.x+(disToRight-disToLeft)/2 

其他座標的作用完全相同。

+0

您編輯過它並添加了一個減號?哪一個? – Joehot200 2015-04-14 12:38:36

+0

disToBottom-disToTop之間的負數。 – 0xJonas 2015-04-14 12:58:18

+0

等一下,爲什麼減去另一個呢?我只是看了看,沒有任何意義。之前,它在船的中心旋轉。現在它向左上方旋轉。或者至少,這就是我的數學大腦告訴我的。我是完全愚蠢的嗎? – Joehot200 2015-04-14 13:02:11

相關問題