我有一个名为Shape的Object,它有一个代表topLeftCorner的Point和一个代表它的宽度和高度的Dimension。
要获取topRightCorner,我只需将宽度添加到topLeftPoint.x即可。我用它们围绕中心旋转一定程度。轮换后的问题是,我的intersects(Shape)
方法失败了,因为它不尊重形状的旋转。每个Shape的旋转都是相同的。我当前的实现在我的Shape Object中看起来像这样:
public boolean intersects(Shape s){
// functions returning a Point of shape s
return intersects(s.topLeft())
|| intersects(s.topRight())
|| intersects(s.bottomLeft())
|| intersects(s.bottomRight())
|| intersects(s.leftCenter())
|| intersects(s.rightCenter())
|| intersects(s.center());
}
public boolean intersects(Point p){
return p.x >= leftX()
&& p.x <= rightX()
&& p.y >= topY()
&& p.y <= bottomY();
}
基本上我需要rotatedLeftX()
或rotatedTopRight()
等功能才能正常工作。同样对于那个计算我觉得旋转即90之前的topLeft点会变成topRight ...无关紧要。
答案 0 :(得分:1)
我从Stackoverflow修改了一个算法,用你为我编写的战舰游戏做矩形指示。这是代码:
private boolean overlaid(int [][][] shps, int curr)
{
for (int i = curr-1; i>=0; --i)
{
// From: http://stackoverflow.com/questions/306316/determine-if-two-rectangles-overlap-each-other/306332#306332
// if (RectA.X1 < RectB.X2 && RectA.X2 > RectB.X1 &&
// RectA.Y1 < RectB.Y2 && RectA.Y2 > RectB.Y1)
if (shps[curr][0][1] <= shps[i][1][1] &&
shps[curr][1][1] >= shps[i][0][1] &&
shps[curr][0][0] <= shps[i][1][0] &&
shps[curr][1][0] >= shps[i][0][0])
return true;
}
return false;
}
private int [][][] shps = { {{-1,-1},{-1,-1}},
{{-1,-1},{-1,-1}},
{{-1,-1},{-1,-1}} };
shps
参数只是一个矩阵,用{x0,y0},{x1,y1}表示每个矩形的左上角和右下角的位置。例如,shps[curr][0][1]
==当前shp
的y0。出于我的目的,我不得不使用&lt; =和&gt; =。此外,如果使用屏幕坐标与笛卡尔坐标,则必须注意y的反转。如果你想使用NOT覆盖,还有DeMorgan定律。
答案 1 :(得分:0)
我有一个解决方案:
假设我想计算一个Shape的旋转(90度),其中x = 1,y = 1(topLeft Point),宽度为4,高度为6,围绕其中心(3,4)== (x1,y2)
rotatedX = x1 + cos(q) * (x - x1) - sin(q) * (y - y1)
rotatedY = y1 + sin(q) * (x - x1) + cos(q) * (y - y1)
在这种情况下:
rotatedX = 3 + cos(90) * (1 - 3) - sin(90) * (1 - 4)
rotatedY = 4 + sin(90) * (1 - 3) + cos(90) * (1 - 4)
这是在笛卡尔平面上旋转(正旋转值意味着逆时针旋转)
所以,如果你想要旋转90度CLOCKWISE,你只需要将旋转乘以-1;