2012-03-08 15 views
0

ポリゴンクラスを使用して、与えられたポイントのポイントが三角形の内側にあるかどうかを調べましたが、三角形の外側にあるかどうかを判断する方法はわかりません。ここまでは私のコードです。ポイントが三角形の上にあるかどうかのテスト

public static void main(String[] args) { 

    Scanner s = new Scanner(System.in); 
    int c =0; 
    Polygon p = new Polygon(); 

    p.addPoint(s.nextInt(), s.nextInt()); 
    p.addPoint(s.nextInt(), s.nextInt()); 
    p.addPoint(s.nextInt(), s.nextInt()); 

    int y = 3; 
    while(y-->0) 
    { 
    if(p.contains(s.nextDouble(),s.nextDouble())) 
     c++; 
    } 
    System.out.print(c); 

} 

答えて

1

Line2Dを使用して、三角形のエッジを表現することを考えてみましょう。

Line2D a = new Line2D.Double(); 
Line2D b = new Line2D.Double(); 
Line2D c = new Line2D.Double(); 

a.setLine(x1, y1, x2, y2); 
b.setLine(x2, y2, x3, y3); 
c.setLine(x3, y3, x1, y1); 

double pntX = s.nextDouble(); 
double pntY = s.nextDouble(); 

if (a.ptLineDist(pntX, pntY) == 0 || b.ptLineDist(pntX, pntY) == 0 || c.ptLineDist(pntX, pntY) == 0) 
    c++; 
+0

私はデルタ値を使用します。ある種の閾値。 'dist <0.0001d' –

3

http://docs.oracle.com/javase/7/docs/api/java/awt/Shape.html

ポリゴンが使用「内在」の定義によれば、境界上の点は、内部と見なされ、従って含まれるべきです。

編集:すべての出力は本当だった

public static void main(String[] args) 
{ 
    Polygon p = new Polygon(); 
    p.addPoint(1, 1); 
    p.addPoint(3, 1); 
    p.addPoint(2, 2); 
    System.out.println(p.contains(2, 1)); 
    System.out.println(p.contains(2.5, 1)); 
    System.out.println(p.contains(2.9999, 1)); 
    System.out.println(p.contains(2.9999, 1.00)); 
} 

は確認するためにいくつかの基本的なテストを実行しました。クラスがint/double数学をどのように扱うかは保証できませんので、二重の値を持つフリンジケースをテストしたいかもしれません。

+0

あなたが正しいことは何デですよ私の例ではうまくいきません。:( –

+0

私は実際にそれをテストしました。なぜなら、私はそれが二重データにどのように反応するのか不思議であったからです。私はそれを広範囲にテストしなかったが、それをうまく処理しているようだ。おそらく、スキャナのやりとりが計画どおりに機能しているかどうかを確認するために、いくつか手書きで入力する必要がありますか? – Corbin

+0

私はそれがうまくいくと思います、私は4点、(3、1) (3,2) (3,3)と (3,4)を持っています。私のプログラムでは2と書かれています。 –

0

あなたは常にテスト自分で実装することができます(外、エッジで、内部の)三つの異なるケースを区別したい場合:

がここにある使用するhttp://www.blackpawn.com/texts/pointinpoly/default.html 式を説明重心技術を使用しますそのページの下部内側/外側の/エッジ検出のための

は擬似コード:

if 0<=u<=1 && 0<=v<=1 
    // inside, maybe on edge 
    if u==0 || v==0 || u+v==1 
     //edge1 || edge2 || edge3 
    else 
     //inside 
    end 
else 
    //outside 
end 
関連する問題