基于Geometry3D的3D空间多边形相交计算结果缺失问题求解
Geometry3D库3D凸多边形相交计算结果缺失问题
当前在实现3D空间多边形相交计算功能,基于Geometry3D库开发,部分场景下可以得到正确的相交结果,但特定场景下计算结果不符合预期:
本次测试场景中,绿色立方体侧面与蓝色断裂面多边形预期共有5处相交,但运行代码后仅返回3处相交结果(即图中绘制的红色线段)。
复现代码
from Geometry3D import * # 可根据坐标精度调整浮点判定容差,修复顶点/边位置的相交判定遗漏 # set_epsilon(1e-6) xnw = 393.137; ynw = 457.113; znwT = -1513.557; znwB = -1491.704 xne = 442.273; yne = 296.23; zneT = -1512.28; zneB = -1489.881 xsw = 245.678; ysw = 412.015; zswT = -1517.188; zswB = -1494.628 xse = 294.853; yse = 251.164; zseT = -1516.945; zseB = -1493.935 X1f = 250 X2f = 500 Y1f = 600 Y2f = -600 Z1f = -1520 Z2f = -1520 Z3f = -1500 Z4f = -1500 nwT = Point(xnw,ynw,znwT); nwB = Point(xnw,ynw,znwB) neT = Point(xne,yne,zneT); neB = Point(xne,yne,zneB) swT = Point(xsw,ysw,zswT); swB = Point(xsw,ysw,zswB) seT = Point(xse,yse,zseT); seB = Point(xse,yse,zseB) plane_nw_ne = ConvexPolygon((nwT,neT,nwB,neB)) plane_nw_sw = ConvexPolygon((nwT,swT,nwB,swB)) plane_ne_se = ConvexPolygon((neT,seT,neB,seB)) plane_sw_se = ConvexPolygon((swT,seT,swB,seB)) # 断裂面定义 frac_p1 = Point(X1f, Y1f, Z1f) frac_p2 = Point(X1f, Y2f, Z2f) frac_p3 = Point(X2f, Y1f, Z3f) frac_p4 = Point(X2f, Y2f, Z4f) # 原错误点顺序:(frac_p1, frac_p2, frac_p3, frac_p4) 会生成自交多边形 plane_frac = ConvexPolygon((frac_p1, frac_p2, frac_p4, frac_p3)) # 可视化与相交计算 r = Renderer() inter = intersection(plane_nw_ne,plane_frac) print(inter, 'nwne') if inter is not None: r.add((inter,'r',2),normal_length = 0) inter = intersection(plane_frac, plane_nw_sw) print(inter, 'nwsw') if inter is not None: r.add((inter,'r',2),normal_length = 0) inter = intersection(plane_ne_se,plane_frac) print(inter, 'nese') if inter is not None: r.add((inter,'r',2),normal_length = 0) inter = intersection(plane_sw_se,plane_frac) print(inter, 'swse') if inter is not None: r.add((inter,'r',2),normal_length = 0) r.add((plane_nw_ne,'g',2),normal_length = 0) r.add((plane_nw_sw,'g',2),normal_length = 0) r.add((plane_ne_se,'g',2),normal_length = 0) r.add((plane_sw_se,'g',2),normal_length = 0) r.add((plane_frac,'b',2),normal_length = 0) r.show()
运行效果截图

问题原因与修复方案
- 凸多边形顶点顺序错误:
ConvexPolygon构造要求传入的顶点必须沿多边形边界按顺时针/逆时针连续排列,不能跳点。原代码中断裂面传入的点顺序会构造出自交的非简单多边形,而非预期的四边形平面,直接导致相交计算结果缺失,将顶点顺序调整为连续边界顺序即可修复。 - 浮点数计算容差不匹配:当前使用的坐标量级为数百到数千,Geometry3D默认的浮点判定阈值偏小,当交线恰好经过多边形顶点、边的位置时,容易出现判定遗漏。可根据业务坐标精度调整库的全局epsilon值,适配当前坐标量级。
- 合法性校验缺失:构造完所有
ConvexPolygon后,建议先校验所有多边形的凸性、顶点共面性、顶点顺序合法性,确认构造的几何体符合预期后再开展相交计算,避免几何体构造错误导致的计算结果异常。
内容的提问来源于stack exchange,提问作者user19216144
相关产品推荐
相关产品推荐

