绘制赛道折线时怎样区分交叉接触与重叠:规则验证第06组
折线画出的路线可能在非相邻路段间穿过自己,也可能只是碰到旧顶点或沿旧路走了一段。把这三种情况混成同一个交叉标志,会让关卡编辑器难以给出准确提示。
本例采用的规则
本例开放折线由八个顶点依序连接,只比较不相邻的两段。先用二维叉积判断四个端点相对另一条直线的位置;严格位于两侧才是内部交叉。共线时投影到变化更大的坐标轴,检查投影区间是无交集、单点还是有正长度重合。
独立输入与结果
八个顶点依次为[(0, 1), (18, 19), (0, 19), (18, 1), (9, 28), (6, 25), (6, 4), (0, 13)];线段i连接顶点i和i加一。
非相邻段编号 | 检测类别 0、2 | 内部交叉 0、3 | 内部交叉 0、4 | 无 0、5 | 内部交叉 0、6 | 内部交叉 1、3 | 内部交叉 1、4 | 无 1、5 | 内部交叉 1、6 | 无 2、4 | 无 2、5 | 内部交叉 2、6 | 无 3、5 | 无 3、6 | 无 4、6 | 无 需留意的段对:[[0, 2, '内部交叉'], [0, 3, '内部交叉'], [0, 5, '内部交叉'], [0, 6, '内部交叉'], [1, 3, '内部交叉'], [1, 5, '内部交叉'], [2, 5, '内部交叉']]
表中的编号仅用于区分当前案例里的对象,不能与数值大小或另一份记录中的身份混淆。先核对输入、单位和边界约定,再跟随过程检查输出。空列表、不存在和数值零各有不同含义,分数则保留精确形式便于复算。
检查与练习
端点落在另一段上属于接触,正长度共线交集属于重叠,不应当作普通穿越。相邻路段的公共端点被本例排除,否则每个正常拐弯都会被报成问题;非相邻路段共享顶点仍要记录。
对每个被标出的线段对,重新计算参数交点并检查是否在两段范围内。整数坐标仍应注意运算范围,叉积值可能大于输入坐标很多。先明确端点接触是否允许,再据检测类别决定是否提示,而不是把所有接触一律删除。
结论适用范围
这里只做二维几何检测,不知道桥梁、隧道或不同高度层是否允许交叉。零长度线段在本例输入中排除。真正的赛道合法性还可能要求最小间距和曲率,这些不由相交检测一项保证。
这是一份可重复演算的游戏知识记录,结论只对写明的输入与规则成立。练习时可以先改变一个条件,再对照中间记录寻找变化从哪一步开始。若结果不同,应先确认操作顺序和边界定义,而不是只改最后一个数字;原始输入与完整过程应一起保留。
