线段自交叉(Intersections)规避功能触发Infinite Loop Issue问题求助
问题根因与修复方案
核心错误点
- 自相交检测逻辑完全错误
Line1.intersection(Line1)计算的是线段和自身的交集,返回结果永远等于Line1本身,所以Line1 == intersection1的判断永远为True,循环不可能正常退出。shapely中检测线要素自相交的正确属性是is_simple:当Line1.is_simple返回False时,才代表线段存在自交叉。 - 循环逻辑完全失效
外层循环内只执行了reload tkinter、打印日志、continue操作,全程没有修改Line1、intersection1的取值,判断条件永远成立,直接锁死无限循环。另外你写的内层while循环位于continue之后,属于永远不会被执行的死代码。 - 线段构造逻辑不符合预期
Python中or是布尔运算,非空列表的布尔值永远为True,所以你写的LineString([...] or [...] or [...])永远只会取第一个两点线段的参数,后续多段曲线的分支完全不会触发,同理create_line中的or逻辑也是完全无效的。 - 冗余操作无意义
循环内反复importlib.reload(tkinter)和线段生成、自相交检测没有任何关联,属于完全无用的冗余操作。
修复后的核心逻辑示例
# 正确构造随机多段线:随机生成2~4个控制点,对应1~3段的曲线 def generate_random_line(start_x, start_y, end_x, end_y): point_num = random.randint(2, 4) points = [(start_x, start_y)] # 生成中间控制点 for _ in range(point_num - 2): points.append((random.randint(10, 490), random.randint(10, 490))) points.append((end_x, end_y)) return LineString(points), points # 第一次生成线段 Line1, line_points = generate_random_line(xC, yC, xC2, yC2) # 正确的自相交重试逻辑 while not Line1.is_simple: Line1, line_points = generate_random_line(xC, yC, xC2, yC2) print('failed attempt') print('successful attempt') # 绘制合法线段 Line1show = w.create_line([c for p in line_points for c in p], smooth='1', width="2")
其他冗余问题清理
- 不需要导入
pip,全程没有用到该库 - 导入语句可以合并,比如
import random之后无需单独from random import randint,import tkinter之后也无需冗余的from tkinter import * - 无需在循环外提前计算交集,原有的
intersection1相关代码可以完全删除
内容的提问来源于stack exchange,提问作者Eithan Ackerman
相关产品推荐
相关产品推荐

