确定一个点是否位于椭圆内,包括边缘

时间:2012-02-22 23:12:55

标签: java geometry contains ellipse

我试图测试一个点是否在一个圆圈内,如果该点位于周边,它应该包含在结果中。但是,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的价值?

3 个答案:

答案 0 :(得分:9)

您必须决定您的方法将使用哪种容差。虽然您的示例使用了浮点可表示的点,但是椭圆边界上​​有许多点,因此判断点是否“在边界上”并不明确-切。如果你不太在意,那么我建议使用内置的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()。在重写版本中,只需复制代码,但使用<=代替<除外,您应该很好。

答案 1 :(得分:0)

您可以使用方法intersects。正如javadoc所说:测试此Ellipse2D的内部是否与指定矩形区域的内部相交。虽然它不是圆形(最佳表示一个点周围的公差)但效果很好

此代码段应适用于您要检查的任何x,y:

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

它只是一个围绕兴趣点的矩形。更大的尺寸,更大的耐受性

答案 2 :(得分:-1)

也许getDistance()可以帮到你吗?预度计上的点应返回0.