【问题标题】:Determining if a point lies within an ellipse, including the edge确定一个点是否位于椭圆内,包括边缘
【发布时间】:2012-03-13 08:49:21
【问题描述】:

我正在尝试测试一个点是否在一个圆内,如果该点在周长上,它应该包含在结果中。但是,Java 的contains() 实现使用小于而不是小于或等于。例如考虑这个 sn-p:

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 的值?

【问题讨论】:

    标签: java geometry contains ellipse


    【解决方案1】:

    您必须决定您的方法将使用哪种容差。虽然您的示例使用了可以用浮点表示的点,但椭圆的边界上有很多点不会,因此决定一个点是否“在边界上”尚不清楚-切。如果您不太在意,那么我建议使椭圆比您实际想要的稍微“大”一点,并使用内置的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()。在覆盖的版本中,只需复制代码,除了使用&lt;=而不是&lt;,你应该很好。

    【讨论】:

      【解决方案2】:

      也许 getDistance() 可以在这里帮助你? premeter 上的点应该返回 0。

      【讨论】:

        【解决方案3】:

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

        这个 sn-p 应该适用于您要检查的任何 x,y:

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

        它只是兴趣点周围的一个矩形。更大的尺寸,没有宽容

        【讨论】:

          猜你喜欢
          • 2015-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多