1

2つの直角プリズムが接触または重なり合っているかどうかを判断するのに問題があります。私は両方の直角プリズムのhighX、Y、ZとlowX、Y、Zしか持っていません。これが私がこれまでに持っているものです:

    public boolean overlaps(AreaSelection other) {
    boolean Xs = (lowX <= other.getHighestX()) && (other.getLowestX() <= highX);
    boolean Ys = (lowY <= other.getHighestY()) && (other.getLowestY() <= highY); 
    boolean Zs = (lowZ <= other.getHighestZ()) && (other.getLowestZ() <= highZ);
    return (Xs && Ys && Zs);        
}

これが正しいかどうか誰かが知っていますか?そうでない場合、解決策は何ですか?ありがとう!

4

2 に答える 2

2

座標軸に平行なエッジを持つ2つの直角プリズムは、座標軸に投影された間隔のそれぞれの3つのペアがすべてオーバーラップする場合にのみオーバーラップします。

したがって、間隔のオーバーラップをチェックする「ユーティリティ」メソッドを使用することは理にかなっています。これを3回呼び出して、プリズムのオーバーラップをチェックします。このメソッドは、間隔のエンドポイントが適切に順序付けられた状態で呼び出されると想定しています。

public boolean overlap_1d(double aLow, double aHigh, double bLow, double bHigh)
{
    if (aLow <= bLow) return (bLow <= aHigh);
    /* else aLow > bLow */
    return (aLow <= bHigh);
}

元のコードは次のようになります。

public boolean overlaps(AreaSelection other)
{
    boolean Xs = overlap_1D(lowX,highX,other.getLowestX(),other.getHighestX());
    boolean Ys = overlap_1D(lowY,highY,other.getLowestY(),other.getHighestY());
    boolean Zs = overlap_1D(lowZ,highZ,other.getLowestZ(),other.getHighestZ());
    return (Xs && Ys && Zs);        
}

このアプローチでは、オーバーラップは単一の交点で構成されている可能性があることに注意してください(1次元または3次元)。

于 2013-01-22T03:26:26.227 に答える
1

プリズムが回転していない場合、メソッドは正しいです。そうでない場合、それらがそれらの値とちょうど重なっているかどうかを計算する方法はありません。

于 2013-01-22T01:07:49.613 に答える