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

Tyl*_*ton 2 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));
Run Code Online (Sandbox Code Playgroud)

这打印出以下内容:

false
false
false
false
true
Run Code Online (Sandbox Code Playgroud)

如何实现true所有这些案例的价值?

dle*_*lev 9

您必须决定您的方法将使用哪种容差.虽然您的示例使用了浮点可表示的点,但椭圆边界上​​有许多点不会,因此判断点是否"在边界上"并不明确.如果你不太在意,那么我建议使用比内置contains()方法略微"更大"的椭圆.

如果你想编写自己的方法,就像采用椭圆的公式,插入你想要测试的点的X和Y值,并观察结果一样简单:

bool isInsideOfOrOnBorderOfEllipse = ((x*x)/(a*a) + (y*y)/(b*b)) <= 1;
Run Code Online (Sandbox Code Playgroud)

请注意,这仍然会遇到不可表示点的问题,因此您认为应该"在边界上"的某些点不会.

更新:假设您只是使用内置椭圆对象(因此指定高度/宽度而不是一般椭圆参数),那么在contains()这里查看源代码是值得的:http://hg.openjdk .java.net/JDK6/JDK6/JDK /文件/ ffa98eed5766/src目录/股/班/ JAVA/AWT/GEOM/Ellipse2D.java

派生一个新类,然后覆盖contains().在重写版本中,只需复制代码,除了使用<=而不是,<你应该是好的.