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 回答