判断一个点是否在椭圆内部,包括边缘

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
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()。在重写的版本中,只需复制代码,除了使用<=代替<,那么你就可以了。

0
你可以使用方法intersects。如javadoc所述:测试此Ellipse2D的内部是否与指定矩形区域的内部相交。虽然它不是一个圆(最好的表示点周围公差的方法),但效果还不错。
这段代码片段适用于任何你想检查的x,y:
int size = 2;
...
ellipse.intersects(x - (size/2), y - (size/2), size, size);

它只是围绕着感兴趣的点的矩形。尺寸越大,容差越大。


-1
也许 getDistance() 可以帮助你?边缘上的点应该返回 0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接