使用多边形包含

Using polygon contains

我对 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

为什么结果不同?

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

Definition of insideness: A point is considered to lie inside a Shape if and only if:

  • it lies completely inside theShape boundary or
  • it lies exactly on the Shape boundary and the space immediately adjacent to the point in the increasing X direction is entirely inside the boundary or
  • it lies exactly on a horizontal boundary segment and the space immediately adjacent to the point in the increasing Y direction is inside the boundary.

点 (300, 400) 位于水平边界上,但在 Y 方向上紧邻的 space 不在边界内 = > contains 将 return false.

然而,点 (300, 200) 位于水平边界上(也在形状边界上)并且在 Y 和 X 方向上紧邻它的 spaces 在边界内 => 包含将 return 为真。