我到处搜索,但似乎无法弄清楚。我发现了很多关于直线/正交多边形分解的文章,但是关于如何构造一个的却一无所获。
我正在使用Slick2D,并且有一个图块图。我想通过从任何接触的矩形中制作单个多边形(即并排并排拼贴)来减少必须计算的碰撞量。
示例:https://www.dropbox.com/s/2kf8olw5701e1xn/rectilinear_polygon.png
我正在使用的是二维矩形数组。我可以遍历并找出正在触摸的内容以及所有这些内容,但是由于某种原因,我无法弄清楚为什么.union()无法正常工作(或者我可能不完全理解它)。在slick2D中,它返回Shape [],而在awt中,似乎有一个方法.createUnion(),我在程序外部尝试了该方法,但是由于任何原因,它都不起作用。不过,出于兼容性的明显原因,我宁愿坚持使用slick2D类。
Slick2D矩形类-
http://www.slick2d.org/javadoc/org/newdawn/slick/geom/Rectangle.html
我的方法现在很简单。只需使用两个正方形进行测试,然后通过遍历所有正方形就可以完全扩展。
Polygon p = new Polygon();
//Calculate polygons
public void calcPoly(){
//The blocking array is all rectangles, [0,0] and [1,0] are known to be touching.
p = RectangleToPolygon(blocking[0][0]);
p.union(RectangleToPolygon(blocking[1][0]));
}
我也有一个矩形到多边形的方法,以确保我一直在使用多边形。
public Polygon RectangleToPolygon(Rectangle rect) {
Polygon result = new Polygon();
result.addPoint(rect.getX(), rect.getY());
result.addPoint(rect.getX() + rect.getWidth(), rect.getY());
result.addPoint(rect.getX() + rect.getWidth(), rect.getY() + rect.getHeight());
result.addPoint(rect.getX(), rect.getY() + rect.getHeight());
return result;
}
这并不是我遇到错误。这是我没有任何变化的事实。没有输出,没有错误,没有统一。这看似简单,但是并不想让步。
最佳答案
我找到了我要完成的目标的答案(部分地;我仍然可以从中得到一些奇怪的结果,但总的来说,它返回了我通常想要的结果)。
Slick2D库中有一个Geom Utility类,它也具有.union()方法。如果联合有效,则返回一个大小为1的Shape数组,如果形状保持分离,则返回2。这与Rectangle和Shape类中的.union()不同(出于某些奇怪的原因...)。