python凹多边形分割_凹多边形分割成凸多边形

来源于:计算机图形学的算法基础一书P172页

这种算法的分割结果不是最优的分割,即生成的凸多边形数目不是最少。

算法可表述为:

1、对多边形的一个顶点Vi,平移多边形使Vi位于坐标原点;

2、绕原点旋转多边形,使Vi+1落在X轴的正半轴上;

3、检查第i+2个顶点y坐标分量的符号。如果符号为正或零,那么多边形在该边处是凸的;反之,则是凹的。分割多边形。

4、分割多边形的时候,检查第i+2个顶点后面的各顶点的y坐标分量,直至发现一个顶点的y坐标分量大于或等于零。这个顶点在x轴的上方,或恰好落在x轴上,记为Vi+j。那么,分割下来的多边形为Vi+1Vi+2...Vi+jVi,剩下的多边形为ViVi+1Vi+j...Vi。

5、多分割的多边形再次使用该算法,直到它们都为凸多边形。

这个算法也可以以一边为参考,判断其他顶点在这一边的方向(左、右)来确定多边形的凹凸性;分割多边形时步骤

1、以多边形的一边AB为参考,判断其他点在AB的那一边,直到一点反向(比如这一点为点C),然后连接BC对多边形进行分割;

2、再根据此算法对分割出来的多边形继续进行分割。

在geotools中,可以使用TriangulationBuilder类来生泰森多边形边界。具体步骤如下: 1. 创建Point集合 ```python List<Point> points = new ArrayList<>(); ``` 2. 将要生泰森多边形的点添加到Point集合中 ```python points.add(new GeometryFactory().createPoint(new Coordinate(0, 0))); points.add(new GeometryFactory().createPoint(new Coordinate(10, 0))); points.add(new GeometryFactory().createPoint(new Coordinate(10, 10))); points.add(new GeometryFactory().createPoint(new Coordinate(0, 10))); ``` 3. 创建TriangulationBuilder对象并设置点集合 ```python TriangulationBuilder tb = new TriangulationBuilder(); tb.setSites(points); ``` 4. 生Delaunay三角网 ```python Geometry triangulation = tb.getTriangles(new GeometryFactory()); ``` 5. 生泰森多边形边界 ```python Geometry boundary = triangulation.convexHull(); ``` 完整示例代码如下: ```python import java.util.ArrayList; import java.util.List; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.triangulate.ConformingDelaunayTriangulationBuilder; import org.locationtech.jts.triangulate.TriangulationBuilder; public class Main { public static void main(String[] args) { List<Point> points = new ArrayList<>(); points.add(new GeometryFactory().createPoint(new Coordinate(0, 0))); points.add(new GeometryFactory().createPoint(new Coordinate(10, 0))); points.add(new GeometryFactory().createPoint(new Coordinate(10, 10))); points.add(new GeometryFactory().createPoint(new Coordinate(0, 10))); TriangulationBuilder tb = new ConformingDelaunayTriangulationBuilder(); tb.setSites(points); Geometry triangulation = tb.getTriangles(new GeometryFactory()); Geometry boundary = triangulation.convexHull(); System.out.println(boundary); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值