2012-02-22 5 views
2

ポイントが円内にあるかどうかをテストしようとしており、そのポイントが周囲にある場合は、そのポイントを結果に含める必要があります。ただし、Javaの実装では、より小さい値ではなく、より小さい値が使用されます。たとえば、このスニペットを考えてみます。ポイントが楕円内にあるかどうかを確認する(エッジを含む)

Ellipse2D.Double circle = new Ellipse2D.Double(0, 0, 100, 100); 

System.out.println(circle.contains(50, 0)); 
System.out.println(circle.contains(50, 100)); 
System.out.println(circle.contains(0, 50)); 
System.out.println(circle.contains(100, 50)); 
System.out.println(circle.contains(50, 50)); 

これは、次のように出力されます

false 
false 
false 
false 
true 

どのように私はこれらの例すべてについてtrueの値を達成することができますか?

答えて

9

あなたの方法で使用する公差の種類を決める必要があります。あなたの例は浮動小数点で表現可能な点を使用していますが、ではなく、となる楕円の境界に沿って多くの点があり、点が "境界線上"であるかどうかは明確ではありません。あまり気にしないのであれば、楕円をあなたが実際に望んでいるよりも「大きく」作り、組み込みのメソッドを使うことをお勧めします。

独自のメソッドを書きたい場合は、それは、楕円のための式を取ってテストしたいポイントのXとYの値を接続し、その結果を観察するのと同じくらい簡単です:

bool isInsideOfOrOnBorderOfEllipse = ((x*x)/(a*a) + (y*y)/(b*b)) <= 1; 

これはまだ表現できない点の問題に繋がりますので、 "境界線"にあると思われる点はありません。

更新:あなたはちょうどここのソースを見てする価値があるでしょう楕円オブジェクトを内蔵(したがって、指定高さ/幅ではなく、一般の楕円パラメータ)を使用していることを考えると: http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/ffa98eed5766/src/share/classes/java/awt/geom/Ellipse2D.java

新しいクラスを派生し、をオーバーライドします。オーバーライドされたバージョンでは、<の代わりに<=を使用する以外はコードをコピーしてください。

-1

おそらくgetDistance()があなたを助けますか?プリミリメータのポイントは0を返します。

0

intersectsの方法を使用できます。 javadocとは:このEllipse2Dの内部が指定された矩形領域の内部と交差するかどうかを判定します。

int size = 2; 
... 
ellipse.intersects(x - (size/2), y - (size/2), size, size); 

それはただの長方形である:それが、円(ポイントの周りの許容範囲の最高の表現)を確認したい、Y、このコードは、任意のxに対して動作するはずかなりよく

作品ではありません興味のある場所を中心にその他のサイズ、許容差なし

関連する問題