【问题标题】:Using polygon contains使用多边形包含
【发布时间】:2015-05-21 09:34:12
【问题描述】:

Polygon#contains(Point) 有问题。我正在测试一个点是否在多边形内。

Polygon 是这样构造的:

Polygon p = new Polygon(new int[]{300, 300, 500, 500}, new int[]{200, 400, 400, 200}, 4);

对于顶点(300,400),输出是false,这就是我想要的:

System.out.println(p.contains(new Point(300,400))); //prints "false"

但是,对于第一个顶点 ((300,200)),它会打印 true

System.out.println(p.contains(new Point(300,200))); // prints "true"

根据第一条语句,它也应该打印false

为什么结果不同?

【问题讨论】:

    标签: java polygon contains


    【解决方案1】:

    奇怪的行为。可能会观察到来自definition of insideness 的一些特殊情况(见下文,从文档中复制)。另一种解释可能是双精度值。

    insideness 的定义:当且仅当,一个点被认为位于 Shape 内:

    • 它完全位于形状边界内或
    • 它正好位于 Shape 边界上,并且在增加的 X 方向上紧邻该点的空间完全在边界内或
    • 它正好位于水平边界段上,并且在 Y 方向上与该点紧邻的空间位于边界内。

    点 (300, 400) 位于水平边界上,但 Y 方向上紧邻的空间不在边界内 => 包含将返回 false。

    然而,点 (300, 200) 位于水平边界上(也在形状边界上),并且在 Y 和 X 方向上紧邻它的空间在边界内 => contains 将返回 true。

    【讨论】:

    • +1 表示正确答案,尽管这与双精度完全无关 - 正如您所指出的,这是由于“内部”的定义(过于简化)包括顶部和左侧边缘,但不包括底部和右侧边缘。
    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 2020-01-15
    • 2016-12-08
    • 1970-01-01
    • 2010-10-24
    • 2023-03-22
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多