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