Skip to content

Commit d95b8a6

Browse files
authored
Merge pull request #60 from LIHPC-Computational-Geometry/59-quad-env
59 quad env
2 parents 018b517 + d03b829 commit d95b8a6

File tree

151 files changed

+2345
-488
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

151 files changed

+2345
-488
lines changed
File renamed without changes.
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
from __future__ import annotations
2+
3+
from mesh_model.mesh_struct.mesh import Mesh
4+
from 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
7+
8+
9+
def flip_edge_ids(mesh: Mesh, id1: int, id2: int) -> True:
10+
return flip_edge(mesh, Node(mesh, id1), Node(mesh, id2))
11+
12+
13+
def flip_edge(mesh: Mesh, n1: Node, n2: Node) -> (True, True, True):
14+
found, d = mesh.find_inner_edge(n1, n2)
15+
16+
if found:
17+
topo, geo = isFlipOk(d)
18+
if not geo or not topo:
19+
return False, topo, geo
20+
else:
21+
return False, False, False
22+
23+
d2, d1, d11, d111, d21, d211, d2111, n1, n2, n3, n4, n5, n6 = mesh.active_quadrangles(d)
24+
25+
f1 = d.get_face()
26+
f2 = d2.get_face()
27+
28+
# Update beta 1
29+
d.set_beta(1, d11)
30+
d111.set_beta(1, d21)
31+
d21.set_beta(1, d)
32+
d2.set_beta(1, d211)
33+
d2111.set_beta(1, d1)
34+
d1.set_beta(1, d2)
35+
36+
37+
if n1.get_dart().id == d.id:
38+
n1.set_dart(d21)
39+
if n2.get_dart().id == d2.id:
40+
n2.set_dart(d1)
41+
42+
if f1.get_dart().id == d1.id:
43+
f1.set_dart(d)
44+
45+
if f2.get_dart().id == d21.id:
46+
f2.set_dart(d2)
47+
48+
d.set_node(n5)
49+
d2.set_node(n3)
50+
d21.set_face(f1)
51+
d1.set_face(f2)
52+
53+
return True, topo, geo
54+
55+
56+
def split_edge_ids(mesh: Mesh, id1: int, id2: int) -> True:
57+
return split_edge(mesh, Node(mesh, id1), Node(mesh, id2))
58+
59+
60+
def split_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
61+
found, d = mesh.find_inner_edge(n1, n2)
62+
63+
if found:
64+
topo, geo = isSplitOk(d)
65+
if not geo or not topo:
66+
return False, topo, geo
67+
else:
68+
return False, True, False
69+
70+
d2, d1, d11, d111, d21, d211, d2111, n1, n2, n3, n4, n5, n6 = mesh.active_quadrangles(d)
71+
d1112 = d111.get_beta(2)
72+
d212 = d21.get_beta(2)
73+
74+
# create a new node in the middle of [n1, n2]
75+
N10 = mesh.add_node((n1.x() + n2.x()) / 2, (n1.y() + n2.y()) / 2)
76+
77+
# modify existing triangles
78+
d.set_node(N10)
79+
d21.set_node(N10)
80+
81+
# create a new quadrangle
82+
f5 = mesh.add_quad(n1, n5, N10, n4)
83+
84+
# update beta2 relations
85+
mesh.set_face_beta2(f5,[d111,d1112,d21,d212])
86+
87+
return True, topo, geo
88+
89+
90+
def collapse_edge_ids(mesh: Mesh, id1: int, id2: int) -> True:
91+
return collapse_edge(mesh, Node(mesh, id1), Node(mesh, id2))
92+
93+
94+
def collapse_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
95+
found, d = mesh.find_inner_edge(n1, n2)
96+
if found:
97+
topo, geo = isCollapseOk(d)
98+
if not geo or not topo:
99+
return False, topo, geo
100+
else:
101+
return False, False, False
102+
103+
d2, d1, d11, d111, d21, d211, d2111, n1, n2, n3, n4, n5, n6 = mesh.active_quadrangles(d)
104+
105+
d1112 = d111.get_beta(2)
106+
d12 = d1.get_beta(2)
107+
d112 = d11.get_beta(2)
108+
109+
# Move n3 node in the middle of [n3, n1]
110+
n3.set_xy((n3.x() + n1.x()) / 2, (n1.y() + n3.y()) / 2)
111+
112+
#Delete the face F5
113+
f5 = d.get_face()
114+
mesh.del_quad(d, d1, d11, d111, f5)
115+
116+
n_from = n1
117+
n_to = n3
118+
adj_darts = adjacent_darts(n_from)
119+
120+
for d in adj_darts:
121+
if d.get_node() == n_from:
122+
d.set_node(n_to)
123+
mesh.del_node(n_from)
124+
125+
#Update beta2 relations
126+
if d2 is not None:
127+
d2.set_beta(2, d12)
128+
d21 = d2.get_beta(1)
129+
d21.set_node(n3)
130+
if d1112 is not None:
131+
d1112.set_beta(2, d112)
132+
d1112.set_node(n3)
133+
if d12 is not None:
134+
d12.set_beta(2, d2)
135+
if d112 is not None:
136+
d112.set_beta(2, d1112)
137+
138+
return mesh_check(mesh), topo, geo
139+
140+
141+
def cleanup_edge_ids(mesh: Mesh, id1: int, id2: int) -> True:
142+
return cleanup_edge(mesh, Node(mesh, id1), Node(mesh, id2))
143+
144+
def cleanup_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
145+
found, d = mesh.find_inner_edge(n1, n2)
146+
if found:
147+
topo, geo = isCleanupOk(d)
148+
if not geo or not topo:
149+
return False, topo, geo
150+
else:
151+
return False, False, False
152+
153+
parallel_darts = mesh.find_parallel_darts(d)
154+
155+
last_dart = parallel_darts[-1]
156+
ld1 = last_dart.get_beta(1)
157+
ld11 = ld1.get_beta(1)
158+
ld111 = ld11.get_beta(1)
159+
last_node = ld111.get_node()
160+
node_to = ld11.get_node()
161+
adj_darts = adjacent_darts(last_node)
162+
mesh.del_node(last_node)
163+
164+
for da in adj_darts:
165+
if da.get_node() == last_node:
166+
da.set_node(node_to)
167+
168+
for d in parallel_darts:
169+
f = d.get_face()
170+
d1 = d.get_beta(1)
171+
d11 = d1.get_beta(1)
172+
d111 = d11.get_beta(1)
173+
174+
n_from = d.get_node()
175+
n_to = d1.get_node()
176+
177+
# update beta 2 relations
178+
d12 = d1.get_beta(2)
179+
d1112 = d111.get_beta(2)
180+
if d1112 is not None:
181+
d1112.set_beta(2, d12)
182+
if d12 is not None:
183+
d12.set_beta(2, d1112)
184+
185+
mesh.del_quad(d, d1, d11, d111, f)
186+
187+
adj_darts = adjacent_darts(n_from)
188+
189+
for d in adj_darts:
190+
if d.get_node() == n_from:
191+
d.set_node(n_to)
192+
mesh.del_node(n_from)
193+
194+
return mesh_check(mesh), topo, geo
195+
196+

environment/actions/smoothing.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from __future__ import annotations
2+
3+
from mesh_model.mesh_struct.mesh import Mesh
4+
from mesh_model.mesh_struct.mesh_elements import Node
5+
from mesh_model.mesh_analysis.global_mesh_analysis import adjacent_darts, on_boundary
6+
7+
def smoothing_mean(mesh: Mesh) -> True:
8+
for i in range (20):
9+
#plot_mesh(mesh)
10+
for i, n_info in enumerate (mesh.nodes, start=0):
11+
if n_info[2] >=0:
12+
node_to_smooth = Node(mesh, i)
13+
if not on_boundary(node_to_smooth):
14+
list_darts = adjacent_darts(node_to_smooth)
15+
sum_x = 0.0
16+
sum_y = 0.0
17+
nb_nodes = 0.0
18+
for d in list_darts:
19+
n = d.get_node()
20+
if n != node_to_smooth:
21+
sum_x += n.x()
22+
sum_y += n.y()
23+
nb_nodes += 1
24+
node_to_smooth.set_xy(sum_x/nb_nodes, sum_y/nb_nodes)

actions/triangular_actions.py renamed to environment/actions/triangular_actions.py

Lines changed: 5 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from __future__ import annotations
22

33
from mesh_model.mesh_struct.mesh import Mesh
4-
from mesh_model.mesh_struct.mesh_elements import Dart, Node
5-
from mesh_model.mesh_analysis import isFlipOk, isCollapseOk, isSplitOk
4+
from mesh_model.mesh_struct.mesh_elements import Node
5+
from mesh_model.mesh_analysis.global_mesh_analysis import mesh_check
6+
from mesh_model.mesh_analysis.trimesh_analysis import isFlipOk, isCollapseOk, isSplitOk
67

78

89
def flip_edge_ids(mesh: Mesh, id1: int, id2: int) -> True:
@@ -78,11 +79,11 @@ def split_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
7879
F4 = mesh.add_triangle(N5, n1, n4)
7980

8081
# update beta2 relations
81-
mesh.set_face_beta2(F3, (d1, d2))
82+
mesh.set_face_beta2(F3, [d1, d2])
8283
d2b2 = d2.get_beta(2)
8384
d2b21 = d2b2.get_beta(1)
8485
mesh.set_beta2(d2b21)
85-
mesh.set_face_beta2(F4, (d, d21))
86+
mesh.set_face_beta2(F4, [d, d21])
8687
db2 = d.get_beta(2)
8788
db21 = db2.get_beta(1)
8889
mesh.set_beta2(db21)
@@ -157,45 +158,3 @@ def collapse_edge(mesh: Mesh, n1: Node, n2: Node) -> True:
157158
mesh.del_node(n2)
158159

159160
return mesh_check(mesh), topo, geo
160-
161-
162-
def check_beta2_relation(mesh: Mesh) -> bool:
163-
for dart_info in mesh.active_darts():
164-
d = dart_info[0]
165-
d2 = dart_info[2]
166-
if d2 >= 0 and mesh.dart_info[d2, 0] < 0:
167-
raise ValueError("error beta2")
168-
elif d2 >= 0 and mesh.dart_info[d2, 2] != d:
169-
raise ValueError("error beta2")
170-
return True
171-
172-
173-
def check_double(mesh: Mesh) -> bool:
174-
for dart_info in mesh.active_darts():
175-
d = Dart(mesh, dart_info[0])
176-
d2 = Dart(mesh, dart_info[2]) if dart_info[2] >= 0 else None
177-
n1 = dart_info[3]
178-
if d2 is None:
179-
d1 = d.get_beta(1)
180-
n2 = d1.get_node().id
181-
else:
182-
n2 = d2.get_node().id
183-
for dart_info2 in mesh.active_darts():
184-
ds = Dart(mesh, dart_info2[0])
185-
ds2 = Dart(mesh, dart_info2[2]) if dart_info2[2] >= 0 else None
186-
if d != ds and d != ds2:
187-
ns1 = dart_info2[3]
188-
if ds2 is None:
189-
ds1 = ds.get_beta(1)
190-
ns2 = ds1.get_node().id
191-
else:
192-
ns2 = ds2.get_node().id
193-
194-
if n1 == ns1 and n2 == ns2:
195-
raise ValueError("double error")
196-
elif n2 == ns1 and n1 == ns2:
197-
return False
198-
return True
199-
200-
def mesh_check(mesh: Mesh) -> bool:
201-
return check_double(mesh) and check_beta2_relation(mesh)
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{
2-
"env_name": "Trimesh-v0",
2+
"env_name": "Quadmesh-v0",
33
"mesh_size": 16,
44
"max_episode_steps": 30,
5-
"n_darts_selected": 20,
6-
"deep": 3,
5+
"n_darts_selected": 10,
6+
"deep": 8,
77
"action_restriction": false,
88
"with_degree_observation": false
99
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from gymnasium.envs.registration import register
2+
from environment.gymnasium_envs.quadmesh_env.envs.quadmesh import QuadMeshEnv
3+
4+
register(
5+
id="Quadmesh-v0",
6+
entry_point="environment.gymnasium_envs.quadmesh_env.envs:QuadMeshEnv",
7+
max_episode_steps=100,
8+
kwargs={"mesh": None, "n_darts_selected": 20, "deep": 6, "with_degree_obs": True, "action_restriction": False},
9+
)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from environment.gymnasium_envs.quadmesh_env.envs.quadmesh import QuadMeshEnv

0 commit comments

Comments
 (0)