1. 点与平面
由一系列的点组成的多边形,与另外一个点的关系。如何判断点在平面内,还是平面外,平面的边上?计算出点与平面的最近距离,并计算最近距离的点的位置。
1.1 思路
- 先将多边形进行三角剖分,获得一个三角形
triangle
的集合triangles
; -
《06 - 多边形的三角剖分 - 单调划分》 -
《06 - 多边形的三角剖分 - 耳切法》 -
- 对
triangles
进行遍历,将其中每个三角形和点进行相交性检测 -
《01 - 数据结构定义》 4.3.2.2
1.2 示例代码
非完整
下列方法用返回的 int
值表示相交状态
res == -1
: 点在多边形内部res == 0
: 点在多边形边上res == 1
: 点在多边形外部
- 主算法
1 | public int PointInPolygon(Point p, Polygon polygon){ |
- 判断点与三角形的相交关系(修改)
1 | public int PointInside(Point p) { |
2. 直线与平面
由一系列的点组成的多边形,与另外一条直线的关系。如何判断直线切割平面,在平面外,与平面的边相交?计算出直线与平面的最近距离,并计算最近距离的点的位置。
1.1 思路
- 已知多边形端点的点集
vertices
,对点集中每个点进行遍历,点与直线的关系有三种:- 点在直线左边
- 点在直线右边
- 点在直线上
《01 - 数据结构定义》 3.2.13 public boolean isLeftPoint(Point p);
《01 - 数据结构定义》 3.2.14 public boolean isRightPoint(Point p);
- 之后根据对应的情况来进行判断:
- 左边有点,右边有点:切割
- 仅一边有点:
- 存在部分点在直线上:相交
- 不存在任何点在直线上:平面外
1.2 示例代码
非完整
下列方法用返回的 int
值表示相交状态
res == -1
: 直线切割平面res == 0
: 直线相交平面res == 1
: 直线在平面外部
1 | public int LineInPolygon(Line l, Polygon polygon){ |
3. 线段与平面
由一系列的点组成的多边形,与另外一条线段的关系。如何判断线段切割平面,在平面外,与平面的边相交?计算出线段与平面的最近距离,并计算最近距离的点的位置。
3.1 思路
- 对多边形的各个边维护一个集合
edges
,对边集合中的每个边与线段进行相交性检测
《02 - 两线段是否相交》
- 将多边形进行三角剖分,获得一个三角形
triangle
的集合triangles
; -
《06 - 多边形的三角剖分 - 单调划分》 -
《06 - 多边形的三角剖分 - 耳切法》 -
- 对
triangles
进行遍历,将其中每个三角形和端点进行相交性检测 -
《01 - 数据结构定义》 4.3.2.2
- 具体有以下情况:
- 存在线段与边的相交:
- 两端点均在多边形外部:线段与多边形完全切割
- 两端点一外一内或者两端点均在内部:线段与多边形半切割
- 不存在线段与边的相交:
- 两端点均在外部:线段与多边形相离
- 两端点均在内部:线段在多边形内部
- 存在线段与边的相交:
4. 平面与平面
5、 由一系列的点组成的多边形,与另外一个平面的关系。如何判断平面与平面的关系,相交、分离、包含?计算出平面与平面的最近距离,并计算最近距离的点的位置。
4.1 思路 -
- 将多边形
polygon_01
进行三角剖分,获得一个三角形triangle
的集合triangles_01
; -
《06 - 多边形的三角剖分 - 单调划分》 -
《06 - 多边形的三角剖分 - 耳切法》 -
- 对
triangles_01
进行遍历,将其中每个三角形和多边形polygon_02
顶点集vertices_02
中的顶点两两进行相交性检测 -
《01 - 数据结构定义》 4.3.2.2
-
将
polygon_01
中的边edges_01
与polygon_02
中的边edges_02
进行相交性检测 -
具体有以下情况:
- 边有相交的情况:相交
- 边没有相交的情况:
polygon_02
中的顶点均在polygon_01
中:包含polygon_02
中的顶点均在polygon_01
外:分离
NOTE:必须进行边的相交性检测,因为顶点均在内的情况依旧有可能出现相交