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