RDA代码解读
1. 重要函数
def is_convex_and_ordered(self, points: NDArray[np.float64]) -> tuple[bool, str]
这个函数的作用是判断按照顺序排列的顶点是否构成凸集,并判断点是顺时针排列"CW"还是逆时针排列"CCW"
实现思路:按顺序取三个点,判断和的叉积,如果所有叉积同号则说明点在的外侧,那么所有内角都为凸角,同时根据叉积的正负还可以判断点是顺时针排列(负)还是逆时针排列(正)
def gen_inequal_global(self, vertex: NDArray[np.float64])-> tuple[NDArray[np.float64], NDArray[np.float64]]
此函数的作用是根据顶点生成半空间不等式
实现思路:先判断顶点的凸性和排列顺序,统一为逆时针排列。随后按顺序遍历相邻的两个顶点,计算半空间表达式
每个超平面可以表达为,即与的连线与垂直的点,因此为法向量;为超平面上的点。变换后为,变为不等号即得到半空间
计算半空间的过程
- 求直线向量,向量指向顺时针方向
- 令与的叉乘结果为负,可以求连线左侧的法向向量。注意,对于凸多边形,由于表达式是,因此法向量必须指向多边形外侧
- 用求解
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 雯欂の修仙笔记!