使用多边形包含
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 为真。
我对 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 为真。