blob: 6c711efd953e7617df62178f000efa9a2210ac26 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
|
%
% Based on Paul Bourke's implementation
% http://paulbourke.net/geometry/polygonise/
%
%% Manuel Luque/ Herbert Voß
%
%% version 0.01 2016/12/10
%
SolidesDict begin% Part of pst-solides3d
%
/MarchingCubes {
% 10 dict begin
/edgeTable[0 265 515 778 1030 1295 1541 1804
2060 2309 2575 2822 3082 3331 3593 3840
400 153 915 666 1430 1183 1941 1692
2460 2197 2975 2710 3482 3219 3993 3728
560 825 51 314 1590 1855 1077 1340
2620 2869 2111 2358 3642 3891 3129 3376
928 681 419 170 1958 1711 1445 1196
2988 2725 2479 2214 4010 3747 3497 3232
1120 1385 1635 1898 102 367 613 876
3180 3429 3695 3942 2154 2403 2665 2912
1520 1273 2035 1786 502 255 1013 764
3580 3317 4095 3830 2554 2291 3065 2800
1616 1881 1107 1370 598 863 85 348
3676 3925 3167 3414 2650 2899 2137 2384
1984 1737 1475 1226 966 719 453 204
4044 3781 3535 3270 3018 2755 2505 2240
2240 2505 2755 3018 3270 3535 3781 4044
204 453 719 966 1226 1475 1737 1984
2384 2137 2899 2650 3414 3167 3925 3676
348 85 863 598 1370 1107 1881 1616
2800 3065 2291 2554 3830 4095 3317 3580
764 1013 255 502 1786 2035 1273 1520
2912 2665 2403 2154 3942 3695 3429 3180
876 613 367 102 1898 1635 1385 1120
3232 3497 3747 4010 2214 2479 2725 2988
1196 1445 1711 1958 170 419 681 928
3376 3129 3891 3642 2358 2111 2869 2620
1340 1077 1855 1590 314 51 825 560
3728 3993 3219 3482 2710 2975 2197 2460
1692 1941 1183 1430 666 915 153 400
3840 3593 3331 3082 2822 2575 2309 2060
1804 1541 1295 1030 778 515 265 0] def
/triTable [
[]
[0 8 3]
[0 1 9]
[1 8 3 9 8 1]
[1 2 10]
[0 8 3 1 2 10]
[9 2 10 0 2 9]
[2 8 3 2 10 8 10 9 8]
[3 11 2]
[0 11 2 8 11 0]
[1 9 0 2 3 11]
[1 11 2 1 9 11 9 8 11]
[3 10 1 11 10 3]
[0 10 1 0 8 10 8 11 10]
[3 9 0 3 11 9 11 10 9]
[9 8 10 10 8 11]
[4 7 8]
[4 3 0 7 3 4]
[0 1 9 8 4 7]
[4 1 9 4 7 1 7 3 1]
[1 2 10 8 4 7]
[3 4 7 3 0 4 1 2 10]
[9 2 10 9 0 2 8 4 7]
[2 10 9 2 9 7 2 7 3 7 9 4]
[8 4 7 3 11 2]
[11 4 7 11 2 4 2 0 4]
[9 0 1 8 4 7 2 3 11]
[4 7 11 9 4 11 9 11 2 9 2 1]
[3 10 1 3 11 10 7 8 4]
[1 11 10 1 4 11 1 0 4 7 11 4]
[4 7 8 9 0 11 9 11 10 11 0 3]
[4 7 11 4 11 9 9 11 10]
[9 5 4]
[9 5 4 0 8 3]
[0 5 4 1 5 0]
[8 5 4 8 3 5 3 1 5]
[1 2 10 9 5 4]
[3 0 8 1 2 10 4 9 5]
[5 2 10 5 4 2 4 0 2]
[2 10 5 3 2 5 3 5 4 3 4 8]
[9 5 4 2 3 11]
[0 11 2 0 8 11 4 9 5]
[0 5 4 0 1 5 2 3 11]
[2 1 5 2 5 8 2 8 11 4 8 5]
[10 3 11 10 1 3 9 5 4]
[4 9 5 0 8 1 8 10 1 8 11 10]
[5 4 0 5 0 11 5 11 10 11 0 3]
[5 4 8 5 8 10 10 8 11]
[9 7 8 5 7 9]
[9 3 0 9 5 3 5 7 3]
[0 7 8 0 1 7 1 5 7]
[1 5 3 3 5 7]
[9 7 8 9 5 7 10 1 2]
[10 1 2 9 5 0 5 3 0 5 7 3]
[8 0 2 8 2 5 8 5 7 10 5 2]
[2 10 5 2 5 3 3 5 7]
[7 9 5 7 8 9 3 11 2]
[9 5 7 9 7 2 9 2 0 2 7 11]
[2 3 11 0 1 8 1 7 8 1 5 7]
[11 2 1 11 1 7 7 1 5]
[9 5 8 8 5 7 10 1 3 10 3 11]
[5 7 0 5 0 9 7 11 0 1 0 10 11 10 0]
[11 10 0 11 0 3 10 5 0 8 0 7 5 7 0]
[11 10 5 7 11 5]
[10 6 5]
[0 8 3 5 10 6]
[9 0 1 5 10 6]
[1 8 3 1 9 8 5 10 6]
[1 6 5 2 6 1]
[1 6 5 1 2 6 3 0 8]
[9 6 5 9 0 6 0 2 6]
[5 9 8 5 8 2 5 2 6 3 2 8]
[2 3 11 10 6 5]
[11 0 8 11 2 0 10 6 5]
[0 1 9 2 3 11 5 10 6]
[5 10 6 1 9 2 9 11 2 9 8 11]
[6 3 11 6 5 3 5 1 3]
[0 8 11 0 11 5 0 5 1 5 11 6]
[3 11 6 0 3 6 0 6 5 0 5 9]
[6 5 9 6 9 11 11 9 8]
[5 10 6 4 7 8]
[4 3 0 4 7 3 6 5 10]
[1 9 0 5 10 6 8 4 7]
[10 6 5 1 9 7 1 7 3 7 9 4]
[6 1 2 6 5 1 4 7 8]
[1 2 5 5 2 6 3 0 4 3 4 7]
[8 4 7 9 0 5 0 6 5 0 2 6]
[7 3 9 7 9 4 3 2 9 5 9 6 2 6 9]
[3 11 2 7 8 4 10 6 5]
[5 10 6 4 7 2 4 2 0 2 7 11]
[0 1 9 4 7 8 2 3 11 5 10 6]
[9 2 1 9 11 2 9 4 11 7 11 4 5 10 6]
[8 4 7 3 11 5 3 5 1 5 11 6]
[5 1 11 5 11 6 1 0 11 7 11 4 0 4 11]
[0 5 9 0 6 5 0 3 6 11 6 3 8 4 7]
[6 5 9 6 9 11 4 7 9 7 11 9]
[10 4 9 6 4 10]
[4 10 6 4 9 10 0 8 3]
[10 0 1 10 6 0 6 4 0]
[8 3 1 8 1 6 8 6 4 6 1 10]
[1 4 9 1 2 4 2 6 4]
[3 0 8 1 2 9 2 4 9 2 6 4]
[0 2 4 4 2 6]
[8 3 2 8 2 4 4 2 6]
[10 4 9 10 6 4 11 2 3]
[0 8 2 2 8 11 4 9 10 4 10 6]
[3 11 2 0 1 6 0 6 4 6 1 10]
[6 4 1 6 1 10 4 8 1 2 1 11 8 11 1]
[9 6 4 9 3 6 9 1 3 11 6 3]
[8 11 1 8 1 0 11 6 1 9 1 4 6 4 1]
[3 11 6 3 6 0 0 6 4]
[6 4 8 11 6 8]
[7 10 6 7 8 10 8 9 10]
[0 7 3 0 10 7 0 9 10 6 7 10]
[10 6 7 1 10 7 1 7 8 1 8 0]
[10 6 7 10 7 1 1 7 3]
[1 2 6 1 6 8 1 8 9 8 6 7]
[2 6 9 2 9 1 6 7 9 0 9 3 7 3 9]
[7 8 0 7 0 6 6 0 2]
[7 3 2 6 7 2]
[2 3 11 10 6 8 10 8 9 8 6 7]
[2 0 7 2 7 11 0 9 7 6 7 10 9 10 7]
[1 8 0 1 7 8 1 10 7 6 7 10 2 3 11]
[11 2 1 11 1 7 10 6 1 6 7 1]
[8 9 6 8 6 7 9 1 6 11 6 3 1 3 6]
[0 9 1 11 6 7]
[7 8 0 7 0 6 3 11 0 11 6 0]
[7 11 6]
[7 6 11]
[3 0 8 11 7 6]
[0 1 9 11 7 6]
[8 1 9 8 3 1 11 7 6]
[10 1 2 6 11 7]
[1 2 10 3 0 8 6 11 7]
[2 9 0 2 10 9 6 11 7]
[6 11 7 2 10 3 10 8 3 10 9 8]
[7 2 3 6 2 7]
[7 0 8 7 6 0 6 2 0]
[2 7 6 2 3 7 0 1 9]
[1 6 2 1 8 6 1 9 8 8 7 6]
[10 7 6 10 1 7 1 3 7]
[10 7 6 1 7 10 1 8 7 1 0 8]
[0 3 7 0 7 10 0 10 9 6 10 7]
[7 6 10 7 10 8 8 10 9]
[6 8 4 11 8 6]
[3 6 11 3 0 6 0 4 6]
[8 6 11 8 4 6 9 0 1]
[9 4 6 9 6 3 9 3 1 11 3 6]
[6 8 4 6 11 8 2 10 1]
[1 2 10 3 0 11 0 6 11 0 4 6]
[4 11 8 4 6 11 0 2 9 2 10 9]
[10 9 3 10 3 2 9 4 3 11 3 6 4 6 3]
[8 2 3 8 4 2 4 6 2]
[0 4 2 4 6 2]
[1 9 0 2 3 4 2 4 6 4 3 8]
[1 9 4 1 4 2 2 4 6]
[8 1 3 8 6 1 8 4 6 6 10 1]
[10 1 0 10 0 6 6 0 4]
[4 6 3 4 3 8 6 10 3 0 3 9 10 9 3]
[10 9 4 6 10 4]
[4 9 5 7 6 11]
[0 8 3 4 9 5 11 7 6]
[5 0 1 5 4 0 7 6 11]
[11 7 6 8 3 4 3 5 4 3 1 5]
[9 5 4 10 1 2 7 6 11]
[6 11 7 1 2 10 0 8 3 4 9 5]
[7 6 11 5 4 10 4 2 10 4 0 2]
[3 4 8 3 5 4 3 2 5 10 5 2 11 7 6]
[7 2 3 7 6 2 5 4 9]
[9 5 4 0 8 6 0 6 2 6 8 7]
[3 6 2 3 7 6 1 5 0 5 4 0]
[6 2 8 6 8 7 2 1 8 4 8 5 1 5 8]
[9 5 4 10 1 6 1 7 6 1 3 7]
[1 6 10 1 7 6 1 0 7 8 7 0 9 5 4]
[4 0 10 4 10 5 0 3 10 6 10 7 3 7 10]
[7 6 10 7 10 8 5 4 10 4 8 10]
[6 9 5 6 11 9 11 8 9]
[3 6 11 0 6 3 0 5 6 0 9 5]
[0 11 8 0 5 11 0 1 5 5 6 11]
[6 11 3 6 3 5 5 3 1]
[1 2 10 9 5 11 9 11 8 11 5 6]
[0 11 3 0 6 11 0 9 6 5 6 9 1 2 10]
[11 8 5 11 5 6 8 0 5 10 5 2 0 2 5]
[6 11 3 6 3 5 2 10 3 10 5 3]
[5 8 9 5 2 8 5 6 2 3 8 2]
[9 5 6 9 6 0 0 6 2]
[1 5 8 1 8 0 5 6 8 3 8 2 6 2 8]
[1 5 6 2 1 6]
[1 3 6 1 6 10 3 8 6 5 6 9 8 9 6]
[10 1 0 10 0 6 9 5 0 5 6 0]
[0 3 8 5 6 10]
[10 5 6]
[11 5 10 7 5 11]
[11 5 10 11 7 5 8 3 0]
[5 11 7 5 10 11 1 9 0]
[10 7 5 10 11 7 9 8 1 8 3 1]
[11 1 2 11 7 1 7 5 1]
[0 8 3 1 2 7 1 7 5 7 2 11]
[9 7 5 9 2 7 9 0 2 2 11 7]
[7 5 2 7 2 11 5 9 2 3 2 8 9 8 2]
[2 5 10 2 3 5 3 7 5]
[8 2 0 8 5 2 8 7 5 10 2 5]
[9 0 1 5 10 3 5 3 7 3 10 2]
[9 8 2 9 2 1 8 7 2 10 2 5 7 5 2]
[1 3 5 3 7 5]
[0 8 7 0 7 1 1 7 5]
[9 0 3 9 3 5 5 3 7]
[9 8 7 5 9 7]
[5 8 4 5 10 8 10 11 8]
[5 0 4 5 11 0 5 10 11 11 3 0]
[0 1 9 8 4 10 8 10 11 10 4 5]
[10 11 4 10 4 5 11 3 4 9 4 1 3 1 4]
[2 5 1 2 8 5 2 11 8 4 5 8]
[0 4 11 0 11 3 4 5 11 2 11 1 5 1 11]
[0 2 5 0 5 9 2 11 5 4 5 8 11 8 5]
[9 4 5 2 11 3]
[2 5 10 3 5 2 3 4 5 3 8 4]
[5 10 2 5 2 4 4 2 0]
[3 10 2 3 5 10 3 8 5 4 5 8 0 1 9]
[5 10 2 5 2 4 1 9 2 9 4 2]
[8 4 5 8 5 3 3 5 1]
[0 4 5 1 0 5]
[8 4 5 8 5 3 9 0 5 0 3 5]
[9 4 5]
[4 11 7 4 9 11 9 10 11]
[0 8 3 4 9 7 9 11 7 9 10 11]
[1 10 11 1 11 4 1 4 0 7 4 11]
[3 1 4 3 4 8 1 10 4 7 4 11 10 11 4]
[4 11 7 9 11 4 9 2 11 9 1 2]
[9 7 4 9 11 7 9 1 11 2 11 1 0 8 3]
[11 7 4 11 4 2 2 4 0]
[11 7 4 11 4 2 8 3 4 3 2 4]
[2 9 10 2 7 9 2 3 7 7 4 9]
[9 10 7 9 7 4 10 2 7 8 7 0 2 0 7]
[3 7 10 3 10 2 7 4 10 1 10 0 4 0 10]
[1 10 2 8 7 4]
[4 9 1 4 1 7 7 1 3]
[4 9 1 4 1 7 0 8 1 8 7 1]
[4 0 3 7 4 3]
[4 8 7]
[9 10 8 10 11 8]
[3 0 9 3 9 11 11 9 10]
[0 1 10 0 10 8 8 10 11]
[3 1 10 11 3 10]
[1 2 11 1 11 9 9 11 8]
[3 0 9 3 9 11 1 2 9 2 11 9]
[0 2 11 8 0 11]
[3 2 11]
[2 3 8 2 8 10 10 8 9]
[9 10 2 0 9 2]
[2 3 8 2 8 10 0 1 8 1 10 8]
[1 10 2]
[1 3 8 9 1 8]
[0 9 1]
[0 3 8]
[]
] def
% les 10 arêtes du cube : numéros des sommets des extrémités Paul Bourke
/edgeIndex[ [0 1] [1 2] [2 3] [3 0] [4 5] [5 6] [6 7] [7 4] [0 4] [1 5] [2 6] [3 7] ] def
%
/makeVolume {% isosurface => min & max & dt (extraire les plages de variations et les pas)
/baseX plagesXYZ 0 get def
/xMin baseX 0 get def
/xMax baseX 1 get def
/dx baseX 2 get def
/baseY plagesXYZ 1 get def
/yMin baseY 0 get def
/yMax baseY 1 get def
/dy baseY 2 get def
/baseZ plagesXYZ 2 get def
/zMin baseZ 0 get def
/zMax baseZ 1 get def
/dz baseZ 2 get def
} def
%
/calculs {
20 dict begin
makeVolume
% les cubes
/cubes [% les sommets
zMin dz zMax { /z exch def
yMin dy yMax { /y exch def
xMin dx xMax {
/x exch def
[% un cube
[x y z] % 0
[x y dy add z ] % 1
[x dx add y dy add z] % 2
[x dx add y z] % 3
[x y z dz add] % 4
[x y dy add z dz add] % 5
[x dx add y dy add z dz add] % 6
[x dx add y z dz add] % 7
]
} for
} for
} for
] def
%
/valeurs [% les isovaleurs
zMin dz zMax {/z exch def
yMin dy yMax {/y exch def
xMin dx xMax {/x exch def
[ x y z function % 0
x y dy add z function % 1
x dx add y dy add z function % 2
x dx add y z function % 3
x y z dz add function % 4
x y dy add z dz add function % 5
x dx add y dy add z dz add function % 6
x dx add y z dz add function % 7
]
} for
} for
} for
] def
% quelques idées du codage ont été prises à https://mikolalysenko.github.io/Isosurface/
/aretes 12 array def % 12 aretes
/sommets[] def
/Faces[] def
% parcourir tous les mini-cubes
0 1 cubes length 1 sub {
/i exch def
/cube cubes i get def % le cube et les 8 sommets
/valeur valeurs i get def % les valeurs des sommets
/cube_index 0 def
0 1 7 {
/j exch def
/v valeur j get def
v 0 gt { /cube_index cube_index 2 j exp cvi or def} if %
} for
/edge_mask edgeTable cube_index get cvi def
edge_mask 0 ne {
0 1 11 {
/k exch def
edge_mask 2 k exp cvi and 0 ne {
aretes k sommets length cvi put
/nv [0 0 0] def
/e edgeIndex k get def
/p0 cube e 0 get get def
/p1 cube e 1 get get def
/v0 valeur e 0 get get def
/v1 valeur e 1 get get def
/dv v0 v1 sub def
/mu 0 def
dv abs 1e-6 gt { /mu v0 dv div def } if
0 1 2 {
/J exch def
nv J p0 J get mu p1 J get p0 J get sub mul add put
} for
[ sommets aload pop nv ] /sommets exch def
} if
} for
} if
% add faces
/f triTable cube_index get def
0 3 f length 3 sub {
/I exch def
[ Faces aload pop [ aretes f I 2 add get get aretes f I 1 add get get aretes f I get get ]]
/Faces exch def
} for
} for
Faces
sommets
end
} def % end /calculs
} def % end /MarchingCubes
%
end % SolidesDict
|