You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 19:18:40