2015-04-05 33 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

相关问题