多边形布尔运算(2) 本文给出多边形布尔运算的实现,采用的算法在一文介绍。首先定义MarkedPoint结构体作为辅助数据结构,其定义如下:其中original表示多边形原始的点,即非交点;value是点的几何数。
多边形布尔运算(1) 两平面向量交点的几何数的绝对值取1,这两个向量在该交点处各有一个几何数,其正负号由向量的旋向决定——记这两个平面向量分别为P1和P2,若从P2旋转到P1为逆时针,则P1在该交点处的几何数为-1,则P2在该交点处的几何数为+1;其中O(n1×n2)是关键的复杂度,算法的主要开销在计算交点,交点计算的复杂度决定了整个算法的复杂度,算法的优化也取决于交点计算,尽量避免不必要的交点计算操作是很重要的。一般地,当其中一个多边形的环中无几何数不为0的点时,即一个多边形的环中无交点时,便是计算得到了所有的环。
相交判断算法 提供参数inside决定一个AABB矩形包含在另一个AABB矩形中时是否算相交。提供inside参数决定多边形包含在圆内部或圆包含在多边形内部是否算相交。提供inside参数决定一个多边形包含在另一个多边形内部是否算相交。多边形完全在AABB矩形内或AABB矩形完全在多边形内也算相交。提供inside参数决定多段线完全在多边形内部时是否算相交。提供inside参数决定一个圆包含在另一个圆中是否算相交。圆完全在AABB矩形内或AABB矩形完全在圆内也算相交。多段线完全在AABB矩形内也算相交。
判断在几何对象内算法 判断一个三角形是否完全在另一个三角形内部:与三角形相交或有顶点在三角形上均不算在三角形内部。判断有限长线段是否完全在三角形内:线段与三角形相交或有端点在三角形上均不算在三角形内部。判断点是否在多边形内:coincide决定是否包含点在多边形上的情况。判断点是否在三角形内:coincide决定是否包含点在三角形上的情况。判断点是否在AABB矩形内:coincide决定是否包含点在AABB矩形上的情况。判断点是否在圆内:coincide决定是否包含点在圆上的情况。
距离算法 点到直线距离:如果为有限长线段且垂足不在线段上,则计算点到线段端点距离。点到多段线距离:计算点到每一段有限长线段的距离,取最近距离。点到多边形距离:计算点到每一段有限长线段的距离,取最近距离。
基本几何对象(9)——Bezier 定义Bezier类,这是为了能绘制曲线才定义的类。Bezier对象中有一个Polyline对象来表示贝塞尔曲线的形状,而Bezier本身的点则表示控制点。为了降低性能开销,仅在构造Bezier和修改Bezier控制点时重新计算贝塞尔曲线的形状,变换Bezier时,分别对Bezier本身的点和其中的Polyline的点做变换,而不重新计算形状。下面给出Bezier的声明。下面给出Bezier的实现。
基本几何对象(5)——Polygon 定义Polygon类,作为多边形,这是一个常用的几何对象。Polygon是有相同首尾点的Polyline,因此我选择在Polyline的尾部添加一个和头部点相同的点作为尾部点,而非像某些实现那样在获取第尾部点时返回头部点。下面给出Polygon的声明。下面给出Polygon的实现。
基本几何对象(1)——Geometry 定义基础的Geometry类,作为所有几何类的基类,方便用Geometry指针进行统一操作:长度、空判别、清空、克隆、变换、旋转、平移、缩放、凸包、外接AABB矩形、最小外界矩形。Geometry定义了type()虚函数,返回一个枚举值,表示Geometry指针所指向对象的实际类型,下面给出枚举值的定义。另外,在计算时还依赖如圆周率这样的常数,下面列出所有用到的常数。下面给出Geometry的声明。下面给出Geometry的实现。
Mask图像与json文件相互转换 做机器学习处理图像时,需要标注图像,其中一种标注是标出图像中的某些区域,生成Mask图像或记录下这些区域的轮廓点坐标。通常,标注直接生成其中一种文件,即只生成json文件或只生成Mask图像。故在此贴出Mask图像与json文件相互转换的Python代码。如果输入文件夹,则会将文件夹下所有json文件或mask图片转成对应文件输出到指定路径中。python json_to_mask.py 文件夹或json文件 输出文件夹。python mask_to_json.py 文件夹或mask图片 输出文件夹。