2011-10-23 15 views
0

私は、2行のx座標とy座標(したがって8座標)を受け取るisInPolyというメソッドを作成し、2行が交差する場所を決定しました。私は、intersectLocationや何かのようなメソッドを呼び出す必要があったはずですが、なぜそれを作成したのかは、ポイントがポリゴンであるかどうかを確認することでした。ポリゴンにない点を知っていて、その点とそれがポリゴンの内側にあるかどうかを調べるためにテストしたい点との間に線を引いたら、そこにいくつの交点があるかを数えます。交点の数が偶数の場合、点はポリゴンにはなく、数が奇数の場合、点はポリゴン内にあります。とにかく、私はこの方法のための正しい出力を得ていません。私のプログラムでは、テストポイントが既知のポイントに対して-1の傾きにある場合、そのポイントがポリゴンの内側にあることがわかります。私が書いたことが、私の方法に問題があるかどうかを見ることができますか?ポリゴンテストでは、ヒットテストはポリゴン内のポイントですか?メソッド

public static boolean isInPoly(float l1x1, float l1y1, float l1x2, float l1y2, float l2x1, float l2y1, float l2x2, float l2y2) { 
    // TODO Auto-generated method stub 

    // l1x1 = the first lines first x coordinate 
    // l1y1 = the first lines first x coordinate 
    //..... 
    //l1m = the first lines slope represented as "m" in the equation y=mx+b 
    //l1b = the first lines y intercept represented as "b" in the equation y=mx+b 
    // x = the x coordinate of the intersection on the 2 lines 
    // y = the x coordinate of the intersection on the 2 lines 



    float l1m,l2m,l1b,l2b,x,y; 

    //y=mx+b 
    //x=(y2-y1)/(x2-x1) 
    //b=y/(mx) 


    //slopes of each line 
    l1m = (l1y2-l1y1)/(l1x2-l1x1); 
    l2m = (l2y2-l2y1)/(l2x2-l2x1); 

    //y-intercepts of each line 
    l1b = l1y2/(l1m*l1x2); 
    l2b = l2y2/(l2m*l2x2); 

    //m1x+b1=m2x+b2 
    //m1x=m2x+b2-b1 
    //x=(m2/m1)x+((b2-b1)/m1) 
    //x-(m2/m1)x=((b2-b1)/m1) 
    //(1-(m2/m1))x=((b2-b1)/m1) 
    //x=((b2-b1)/m1)/(1-(m2/m1)) 


    //finding the x coordinate of the intersection 
    x=((l2b-l1b)/l1m)/(1-(l2m/l1m)); 

    //y=mx+b 


    //finding the x coordinate of the intersection 
    y=(l1m*x)+l1b; 

    if(y>=l1y1 && y<=l1y2 && x>=l1x1 && x<=l1x2){ 
     return true; 
    } 
    else{ 
     return false; 
    } 

} 

答えて

0

スロープの計算は正しいです。

しかし、b方程式変換は間違っています。それはむしろすべきである:

//l1y1=l1m*l1x1+l1b 
l1b=l1y1-l1m*l1x1 

のx座標の計算も間違っている(編集:実際には正しいが、必要以上に複雑です)。正しい変換は:

//l1m*x+l1b = l2m*x+l2b 
//l1m*x-l2m*x = l2b-l1b 
// x*(l1m-l2m) = l2b - l1b 
x = (l2b-l1b)/(l1m-l2m) 

残りのアルゴリズムは正しいです。また、全く同じ線(無限の交差点)を考慮に入れなければならないことも忘れないでください。また、y軸に平行な線について、方程式のゼロ除算(たとえば)をキャッチします。

if節の検証は、一部の行でのみ有効です。また、ラインの座標を入れ替える可能性があるため、交点のx座標は常にラインの2つのx座標の最大値より小さく、x座標の最小値より大きくなければなりません。同じことがy座標にも当てはまります。

x_max = l1x1 > l1x2 ? l1x1 : l1x2; 
x_min = l1x1 < l1x2 ? l1x2 : l1x1; 

y_max = l1y1 > l1y2 ? l1y1 : l1y2; 
y_min = l1y1 < l1y2 ? l1y2 : l1y1; 

if ((y_min <= y) && (y_max => y) && (x_min <= x) && (x_max >= x)) 
    return true; 
関連する問題