尽管用户2221343已经回答了Monkeybro10的问题,但在某些情况下,知道形状的轮廓可能会对使用他描述的技术起作用,我认为这可能有所帮助:
例如,如果您绘制两个多边形,则仅当多边形轮廓内包含的区域重叠时才检测到它们之间的碰撞,如果仅在多边形的准确轮廓上发生碰撞,则不会检测到它们之间的碰撞。如果您填充两个多边形,但不绘制它们,则即使在可见区域的轮廓上也会检测到碰撞。
我写了一个小例子来说明我的意思。取消注释绘制或填充命令,并通过取消给定行的第二个多边形垂直上升一个像素。运行代码并在JFrame中查看结果。如果上升第二个多边形,且两个多边形仅通过“fill”命令可见,则它们与其轮廓相交且检测到碰撞。如果未上升第二个多边形,并且两个多边形通过“draw”命令可见,则它们与其轮廓相交,但不会检测到碰撞:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.geom.Area;
import javax.swing.JFrame;
public class Test {
private JFrame frame;
private Polygon polygon1;
private Polygon polygon2;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test window = new Test();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Test() {
initialize();
}
private void initialize() {
frame = new JFrame(){
private static final long serialVersionUID = 1L;
@Override
public void paint(Graphics g){
super.paint(g);
doDrawing(g);
}
};
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int nShape1 = 4;
int xPoly1[] = {30,50,50,30};
int yPoly1[] = {30,30,50,50};
polygon1 = new Polygon(xPoly1,yPoly1,nShape1);
int nShape2 = 4;
int xPoly2[] = {35,55,55,35};
int yPoly2[] = {50,50,70,70};
polygon2 = new Polygon(xPoly2,yPoly2,nShape2);
}
public synchronized void doDrawing(Graphics g){
g.setColor(new Color(255,0,0));
g.drawPolygon(polygon1);
g.fillPolygon(polygon1);
g.setColor(new Color(0,0,255));
g.drawPolygon(polygon2);
g.fillPolygon(polygon2);
Area area = new Area(polygon1);
area.intersect(new Area(polygon2));
if(!area.isEmpty()){
System.out.println("intersects: yes");
}
else{
System.out.println("intersects: no");
}
}
}