Skip to content

Commit 4b57600

Browse files
committed
Refactor SSX intersection logic: simplify curve evaluation, improve parameter initialization, add overlap deduplication, and optimize branch interpolation with centripetal method.
1 parent b518f6d commit 4b57600

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed

mmcore/numeric/intersection/ssx/_ssx4.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1792,8 +1792,8 @@ def compute_branch_curves_hermite(branch: SSXBranch, surface1:NURBSSurfaceTuple,
17921792
def _eval_curve(t):
17931793
stuv = evaluate_nurbs_curve(branch.curve, t, d_order=0)["C"]
17941794
se1=evaluate_nurbs_surface(surface1,stuv[0],stuv[1],d_order=0)
1795-
se2=evaluate_nurbs_surface(surface2,stuv[2],stuv[3],d_order=0)
1796-
return (se2['S']-se1['S'])*0.5+se1['S']
1795+
1796+
return se1['S']
17971797

17981798
eval_curve_ders=fdm(_eval_curve)
17991799
_points = []
@@ -1802,16 +1802,15 @@ def _eval_curve(t):
18021802
params=_greville_abscissae(branch.curve.knot, branch.curve.degree)
18031803
# params=np.unique(branch.curve.knot)
18041804
#p_cur=0
1805-
1805+
params=branch.curve.control_points
18061806
for s in params:
18071807
#d1=eval_curve_ders(s)
18081808
#d1/=np.linalg.norm(d1)
18091809

18101810
#_ders.append(d1)
1811-
_points.append(_eval_curve(s))
18121811

1813-
# p_cur+=np.dot(d1 ,d1)
18141812

1813+
_points.append(evaluate_nurbs_surface(surface1, s[0], s[1], d_order=0)['S'])
18151814

18161815

18171816
#from more_itertools import pairwise
@@ -1822,7 +1821,7 @@ def _eval_curve(t):
18221821
#
18231822
#
18241823
# crvs.append(bern_to_nurbs_bezier(np.array([ps,ps+ds*h,pe-ds*h,pe]),interval=(ts,te),rational=False))
1825-
branch.curve_xyz=interpolate_nurbs_curve(np.array(_points),branch.curve.degree)
1824+
branch.curve_xyz=interpolate_nurbs_curve(np.array(_points),degree=branch.curve.degree,use_centripetal=True,method='lu',remove_duplicates=True,tol=atol)
18261825
#branch.curve_xyz=remove_knots_after_merge(crv,interior,atol)
18271826

18281827
def compute_branch_curves(branch: SSXBranch, surface1:NURBSSurfaceTuple, surface2:NURBSSurfaceTuple,**kwargs):
@@ -1840,6 +1839,7 @@ def compute_branch_curves(branch: SSXBranch, surface1:NURBSSurfaceTuple, surface
18401839

18411840
def compute_point_xyz(point:SSXPoint, surface1:NURBSSurfaceTuple, surface2:NURBSSurfaceTuple,**kwargs):
18421841
point.xyz=evaluate_nurbs_surface(surface1,point.stuv[0],point.stuv[1],d_order=0)['S']
1842+
18431843
def bez_ssx(H1: NDArray[np.float64], H2: NDArray[np.float64], *, atol: float = 0.001, angle_tol: float = 0.052,
18441844
tol: float = 1e-8, gjk_max_iter: int = 64, gm_eps: float = 1e-5, gm_tol: float = 1e-8, max_depth: int = 24,
18451845
magic_start_depth: int = 6, flat_angle: float = 0.015, march_samples: int = 8,
@@ -1864,7 +1864,9 @@ def nurbs_ssx(surf1, surf2, *, atol: float = 0.001, angle_tol: float = 0.052, to
18641864
deflate_hard_case: bool = True) -> tuple[list[SSXBranch], list[SSXPoint]]:
18651865
s1 = surf1
18661866
s2 =surf2
1867-
1867+
if s1.control_points.shape ==s2.control_points.shape:
1868+
if np.allclose(s1.control_points,s2.control_points):
1869+
return
18681870
s1d = decompose_surface(s1)
18691871
s2d = decompose_surface(s2)
18701872

mmcore/numeric/intersection/ssx/trace_inter_segm.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -689,28 +689,39 @@ def adaptive_refine_bruteforce(
689689

690690
stuv_start.next=new_node
691691
stuv_end.prev=new_node
692+
xyzs = evaluate_nurbs_surface(s1, stuv_start.s_eval['stuv'][0], stuv_start.s_eval['stuv'][1], d_order=0)['S']
693+
xyze = evaluate_nurbs_surface(s1, stuv_end.s_eval['stuv'][0], stuv_end.s_eval['stuv'][1], d_order=0)['S']
692694

693695
new_node.compute_normals_tangent_and_curvature()
694-
T = (new_node.s_eval['s1']["S"] - stuv_start.s_eval['s1']["S"]) / 2
695-
dT=np.linalg.norm(T)
696696

697697
s = np.sqrt(8.0 * spt / np.linalg.norm(new_node.s_eval['K']))
698698

699+
delta = np.linalg.norm(p_eval['S'] - xyz1)
700+
s=np.clip(s,spt,np.linalg.norm(xyzs-xyze))
699701

702+
if delta< spt:
703+
704+
continue
705+
xyzs = evaluate_nurbs_surface(s1, stuv_start.s_eval['stuv'] [0], stuv_start.s_eval['stuv'] [1], d_order=0)['S']
706+
xyze = evaluate_nurbs_surface(s1, stuv_end.s_eval['stuv'] [0], stuv_end.s_eval['stuv'] [1], d_order=0)['S']
707+
dT1=np.linalg.norm(xyzs-p_eval['S'])
708+
dT2=np.linalg.norm(xyze - p_eval['S'])
709+
if dT1 <s or dT2<s:
710+
711+
continue
712+
713+
stack.append((stuv_start, new_node, cur_depth + 1, delta))
714+
715+
stack.append((new_node, stuv_end, cur_depth + 1, delta))
700716
#print(s,dT)
701-
if dT<=s:
702-
continue
703-
delta=np.linalg.norm(p_eval['S']-xyz1)
704717

705718

706719

707-
if delta>= spt:
708720

709-
stack.append((stuv_start,new_node,cur_depth+1,delta))
710-
stack.append((new_node,stuv_end,cur_depth+1,delta))
711-
else:
712-
continue
721+
722+
713723
ll=list(node_a)
724+
714725
#print(len(ll))
715726
return interpolate_nurbs_curve(np.array(ll),degree=min(len(ll)-1,3))
716727

0 commit comments

Comments
 (0)