22
33from mesh_model .mesh_struct .mesh import Mesh
44from mesh_model .mesh_struct .mesh_elements import Node
5- from mesh_model .mesh_analysis .global_mesh_analysis import adjacent_darts , degree , mesh_check
6- from mesh_model .mesh_analysis .quadmesh_analysis import isFlipOk , isCollapseOk , isSplitOk , isCleanupOk
5+ from mesh_model .mesh_analysis .global_mesh_analysis import adjacent_darts , degree , mesh_check , on_boundary
6+ from mesh_model .mesh_analysis .quadmesh_analysis import isFlipCCWOk , isFlipCWOk , isCollapseOk , isSplitOk , isCleanupOk
77
88
9- def flip_edge_ids (mesh : Mesh , id1 : int , id2 : int ) -> True :
10- return flip_edge (mesh , Node (mesh , id1 ), Node (mesh , id2 ))
9+ def flip_edge_cntcw_ids (mesh : Mesh , id1 : int , id2 : int ) -> True :
10+ return flip_edge_cntcw (mesh , Node (mesh , id1 ), Node (mesh , id2 ))
1111
1212
13- def flip_edge (mesh : Mesh , n1 : Node , n2 : Node ) -> (True , True , True ):
13+ def flip_edge_cntcw (mesh : Mesh , n1 : Node , n2 : Node ) -> (True , True , True ):
1414 found , d = mesh .find_inner_edge (n1 , n2 )
1515
1616 if found :
17- topo , geo = isFlipOk (d )
17+ topo , geo = isFlipCCWOk (d )
1818 if not geo or not topo :
1919 return False , topo , geo
2020 else :
@@ -52,6 +52,53 @@ def flip_edge(mesh: Mesh, n1: Node, n2: Node) -> (True, True, True):
5252
5353 return True , topo , geo
5454
55+ def flip_edge_cw_ids (mesh : Mesh , id1 : int , id2 : int ) -> True :
56+ return flip_edge_cw (mesh , Node (mesh , id1 ), Node (mesh , id2 ))
57+
58+
59+ def flip_edge_cw (mesh : Mesh , n1 : Node , n2 : Node ) -> (True , True , True ):
60+ found , d = mesh .find_inner_edge (n1 , n2 )
61+
62+ if found :
63+ topo , geo = isFlipCWOk (d )
64+ if not geo or not topo :
65+ return False , topo , geo
66+ else :
67+ return False , False , False
68+
69+ d2 , d1 , d11 , d111 , d21 , d211 , d2111 , n1 , n2 , n3 , n4 , n5 , n6 = mesh .active_quadrangles (d )
70+
71+ f1 = d .get_face ()
72+ f2 = d2 .get_face ()
73+
74+ # Update beta 1
75+ d .set_beta (1 , d2111 )
76+ d2111 .set_beta (1 , d1 )
77+ d11 .set_beta (1 , d )
78+
79+ d111 .set_beta (1 , d21 )
80+ d211 .set_beta (1 , d2 )
81+ d2 .set_beta (1 , d111 )
82+
83+
84+ if n1 .get_dart ().id == d .id :
85+ n1 .set_dart (d21 )
86+ if n2 .get_dart ().id == d2 .id :
87+ n2 .set_dart (d1 )
88+
89+ if f1 .get_dart ().id == d111 .id :
90+ f1 .set_dart (d )
91+
92+ if f2 .get_dart ().id == d2111 .id :
93+ f2 .set_dart (d2 )
94+
95+ d .set_node (n4 )
96+ d2 .set_node (n6 )
97+ d2111 .set_face (f1 )
98+ d111 .set_face (f2 )
99+
100+ return True , topo , geo
101+
55102
56103def split_edge_ids (mesh : Mesh , id1 : int , id2 : int ) -> True :
57104 return split_edge (mesh , Node (mesh , id1 ), Node (mesh , id2 ))
@@ -107,7 +154,8 @@ def collapse_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
107154 d112 = d11 .get_beta (2 )
108155
109156 # Move n3 node in the middle of [n3, n1]
110- n3 .set_xy ((n3 .x () + n1 .x ()) / 2 , (n1 .y () + n3 .y ()) / 2 )
157+ if not on_boundary (n3 ):
158+ n3 .set_xy ((n3 .x () + n1 .x ()) / 2 , (n1 .y () + n3 .y ()) / 2 )
111159
112160 #Delete the face F5
113161 f5 = d .get_face ()
@@ -120,6 +168,7 @@ def collapse_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
120168 for d in adj_darts :
121169 if d .get_node () == n_from :
122170 d .set_node (n_to )
171+
123172 mesh .del_node (n_from )
124173
125174 #Update beta2 relations
0 commit comments