2D图形SVG工具添加了通过选项属性显示交点的功能。
PaladinDu:2D图形SVG化工具0 赞同 · 0 评论文章
在这个工具中,已经定义的数据结构有点,线段,有向线段,射线,直线,多边形,和圆。
其中点不参与交点检测;
线段,有向线段,射线,直线本质都是线段;
多边形由多个线段组成;
所以求交点的问题被减少为:
1.线段与线段;2.圆与圆;3.线段与圆求交点的问题。
线段与线段求交点
两个线段之间的关系可以分为以下几种:
不相交,相交且交点为端点,一般相交,相交且平行
由于工具默认显示线段的端点,对于 相交且平行 和 相交且交点为端点 的情况不在添加交点。
这样就只需要处理完全相交的情况,问题变得简单了许多。
这里用到的算法也比较简单,代码与流程解析如下:
class LineSegment:
def __init__(self,start:Position,end:Position):
self.start = start
self.end = end
def is_collision(self,other): # 通过叉乘检测两个线段是否都满足端点在另一个线段的两侧
self_dir = self.end.reduce(self.start)
if self_dir.cross(other.start.reduce(self.start)) * self_dir.cross(other.e