3

ポイントが円の中にあるかどうかをテストしようとしています。ポイントが周囲にある場合は、結果に含める必要があります。ただし、Javaのcontains()実装では、以下ではなく、以下を使用します。たとえば、次のスニペットについて考えてみます。

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これらすべてのケースでの値をどのように達成できますか?

4

3 に答える 3

10

メソッドで使用する許容誤差の種類を決定する必要があります。あなたの例では浮動小数点で表現できるポイントを使用していますが、楕円の境界に沿ってそうではないポイントがたくさんあるため、ポイントが「境界上」にあるかどうかを判断することは明確ではありません。あまり気にしない場合は、楕円を実際よりも少し「大きく」して、組み込みのcontains()方法を使用することをお勧めします。

独自のメソッドを作成する場合は、楕円の式を取得し、テストするポイントの X 値と Y 値を差し込んで、結果を観察するだけです。

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

これはまだ表現不可能な点の問題に遭遇することに注意してください.

更新: 組み込みの楕円オブジェクトを使用しているだけで (したがって、一般的な楕円パラメーターではなく高さ/幅を指定している)、contains()ここのソースを確認する価値があります: http://hg.openjdk .java.net/jdk6/jdk6/jdk/file/ffa98eed5766/src/share/classes/java/awt/geom/Ellipse2D.java

新しいクラスを派生させてからオーバーライドしますcontains()<=オーバーライドされたバージョンでは、代わりに使用することを除いて、コードをコピーするだけ<で十分です。

于 2012-02-22T23:17:43.923 に答える
0

メソッドintersectsを使用できます。javadocが言うように:このEllipse2Dの内部が指定された長方形の領域の内部と交差するかどうかをテストします。円ではありませんが(点の周りの公差の最良の表現)はかなりうまく機能します

このスニペットは、チェックしたいすべてのx、yで機能するはずです。

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

これは、関心のあるポイントの周りの単なる長方形です。より多くのサイズ、ノーレトレランス

于 2012-08-12T19:28:27.867 に答える
-1

多分 getDistance() がここであなたを助けることができますか? プレリメータのポイントは 0 を返すはずです。

于 2012-02-22T23:25:57.093 に答える