2017-07-30 10 views
1

この質問には何百万回もの質問がありますが、私は若干異なる問題があります。私はPolygonオブジェクトを1つの単位 "ブロック"から作成し、ブロックが互いに接触するかどうかを判断する必要があります。他の回答には、このようなコードを持っていた:Java-Shape Collision Detection

Area area1 = new Area(poly1); 
Area area2 = new Area(poly2); 
area1.instersect(poly2); 
if(!area1.isEmpty()) { 

    // Do collision stuff here 

} 

これは、形状が(彼らが接触している)隣接している場合、これは衝突を報告しないだろうということですけれども、問題を持っています。

私の元のアイデアは、1つのポリゴンの周りに1単位の境界線を持つことでした。したがって、それらが隣り合っていた場合、境界線は2番目のポリゴンと交差し、衝突します。私は境界線を追加する方法を見つけることができないようです。

お願いします。

EDIT:

この問題場合、すべてのブロックのサイズが1x1の単位であり、(ArrayListの付) "チャンク" に格納されています。 My Polygonオブジェクトは、オブジェクト全体を表します。これを行うより良い方法があれば、教えてください!

私のコードは、私は潜在的にブロックの塊/数十万人を持っているとして、できるだけefficentようにする必要がある、と物理ループが1秒ごとに

+0

ここで2Dまたは3Dポリゴンを話していますか? – kasoban

+0

私は2Dポリゴンで作業しています – atoms118

答えて

0

よしを実行し、私は、私は解決策を持っていると思います私はこの権利を持っている場合はコメントしてください。

私はブロックごとに3単位幅の広い長方形を作成するために、ブロックのArrayListのを使用します(xは - 1)の代わりにAreaオブジェクトの周りに私に1つの単位の境界線を与えるべき1つの単位ブロック、の:

​​

私もチャンクのエリアを見つけるために私のオリジナルの方法を維持し、私はこれとの衝突をチェックすることができます。

Area area1 = chunk1.calculateHitboxArea(); 
Area area2 = chunk2.calculateArea(); 
area1.intersect(area2); 
if(!area1.isEmpty()) { 

    // Collision stuff here 

} 

は、パフォーマンスを向上させています、私のチャンククラスは両方の方法を返すエリアなので、エリアをキャッシュします物理ループがchunを変更したときにのみオブジェクトが生成されますks。

これは私の場合、理想的ではないチャンクごとに4つの領域オブジェクトが必要であることを意味するので、これが本当にこれを行う最良の方法かどうかはわかりません。私はまだこれを行うより効率的な方法を好むので、多くのupvotesを取得しない限り、私はこの答えを受け入れてマークするつもりはありません。

0
public static boolean checkCollision(Shape shapeA, Shape shapeB) { 
    Area areaA = new Area(shapeA); 
    areaA.intersect(new Area(shapeB)); 
    return !areaA.isEmpty(); 
} 
+0

...しかし、形状が重なっているのではなく、隣り合っている場合はtrueになりますか? – atoms118

+0

@ atoms118衝突が発生した場合はtrueを返します。 – Akash

+0

私は自分でコードを試しました。このメソッドは、図形が互いに重なっている場合にのみtrueを返しますが、図形が互いに重なっていない場合はtrueを返します。私はRectangle(0、0、1、1)とRectangle(1,0,1,1)を使いました。これらの矩形は互いに隣り合っていますが、このメソッドはfalseを返します。私はあなたが質問を誤解しているかもしれないと思う – atoms118