1 ! Copyright (C) 2010 Slava Pestov.
2 USING: accessors combinators fry kernel locals namespaces
3 game.models.half-edge euler.b-rep sequences typed math
7 ERROR: edges-not-incident ;
9 : assert-incident ( e1 e2 -- )
10 incident? [ edges-not-incident ] unless ;
12 ERROR: should-not-be-equal obj1 obj2 ;
14 : assert-not= ( obj1 obj2 -- )
15 2dup eq? [ should-not-be-equal ] [ 2drop ] if ;
17 ERROR: edges-in-different-faces ;
19 : assert-same-face ( e1 e2 -- )
20 same-face? [ edges-in-different-faces ] unless ;
22 ERROR: edges-in-same-face ;
24 : assert-different-faces ( e1 e2 -- )
25 same-face? [ edges-in-same-face ] when ;
27 : assert-isolated-component ( edge -- )
28 [ [ opposite-edge>> ] [ next-edge>> ] bi assert= ]
29 [ dup opposite-edge>> assert-same-face ]
32 ERROR: not-a-base-face face ;
34 : assert-base-face ( face -- )
35 dup base-face? [ drop ] [ not-a-base-face ] if ;
37 ERROR: has-rings face ;
39 : assert-no-rings ( face -- )
40 dup next-ring>> [ has-rings ] [ drop ] if ;
42 : assert-ring-of ( ring face -- )
43 [ base-face>> ] dip assert= ;
45 : with-b-rep ( b-rep quot -- )
46 [ b-rep ] dip with-variable ; inline
48 : make-b-rep ( quot -- b-rep )
49 <b-rep> [ swap with-b-rep ] [ finish-b-rep ] [ ] tri ; inline
53 :: make-loop ( vertex face -- edge )
54 b-rep get new-edge :> edge
61 : make-loop-face ( vertex -- edge )
66 :: make-edge ( vertex next-edge -- edge )
67 b-rep get new-edge :> edge
69 next-edge edge next-edge<<
70 next-edge face>> edge face<<
74 : opposite-edges ( e1 e2 -- )
75 [ opposite-edge<< ] [ swap opposite-edge<< ] 2bi ;
80 INSTANCE: sequence point
81 INSTANCE: number point
83 TYPED:: make-vefs ( pos1: point pos2: point -- edge: b-edge )
86 pos1 b-rep new-vertex :> v1
87 v1 make-loop-face :> e1
89 pos2 b-rep new-vertex :> v2
97 TYPED:: make-ev-one ( edge: b-edge point: point -- edge: b-edge )
98 point b-rep get new-vertex :> v
99 v edge make-edge :> e1'
101 edge vertex>> e1' make-edge :> e2'
103 e2' edge face-cw next-edge<<
104 e1' e2' opposite-edges
110 :: subdivide-vertex-cycle ( e1 e2 v -- )
113 e1 vertex-cw e2 v subdivide-vertex-cycle
116 :: (make-ev) ( e1 e2 point -- edge )
117 e1 e2 assert-incident
119 point b-rep get new-vertex :> v'
120 v' e2 make-edge :> e1'
124 v e1 make-edge :> e2'
126 e1 e2 v' subdivide-vertex-cycle
130 e1 opposite-edge>> :> e1m
137 e1' e2' opposite-edges
143 TYPED:: make-ev ( e1: b-edge e2: b-edge point: point -- edge: b-edge )
145 [ e1 point make-ev-one ] [ e1 e2 point (make-ev) ] if ;
149 : subdivide-edge-cycle ( face e1 e2 -- )
152 [ [ next-edge>> ] dip subdivide-edge-cycle ] 3bi
157 TYPED:: make-ef ( e1: b-edge e2: b-edge -- edge: b-edge )
158 e1 e2 assert-same-face
160 e2 vertex>> make-loop-face :> e1'
161 e1 vertex>> e2 make-edge :> e2'
162 e1' e2' opposite-edges
169 e1' face>> e1 e2 subdivide-edge-cycle
178 TYPED:: make-e-kill-r ( edge-ring: b-edge edge-face: b-edge -- edge: b-edge )
179 edge-ring face>> :> ring
180 edge-face face>> :> face
181 ring face assert-ring-of
183 edge-ring [ face >>face drop ] each-face-edge
185 edge-ring vertex>> edge-face make-edge :> e1
186 edge-face vertex>> edge-ring make-edge :> e2
188 ring face delete-ring
189 ring b-rep get delete-face
191 e2 edge-face face-cw next-edge<<
192 e1 edge-ring face-cw next-edge<<
198 TYPED:: make-f-kill-rh ( edge-ring: b-edge -- )
199 edge-ring face>> :> ring
200 ring base-face>> :> base-face
201 ring base-face delete-ring
202 ring ring base-face<< ;
204 TYPED:: kill-vefs ( edge: b-edge -- )
205 edge assert-isolated-component
208 edge dup opposite-edge>> :> ( e2 e1 )
213 e1 face>> b-rep delete-face
217 v1 b-rep delete-vertex
218 v2 b-rep delete-vertex ;
220 TYPED:: kill-ev ( edge: b-edge -- )
224 edge opposite-edge>> :> edge'
227 edge [ v' >>vertex drop ] each-vertex-edge
229 edge face-cw :> edgep
230 edge' face-cw :> edge'p
232 edge next-edge>> edgep next-edge<<
233 edge' next-edge>> edge'p next-edge<<
235 v b-rep delete-vertex
236 edge b-rep delete-edge
237 edge' b-rep delete-edge ;
239 TYPED:: kill-ef ( edge: b-edge -- )
243 edge opposite-edge>> :> e2
245 e1 e2 assert-different-faces
253 e1 [ f2 >>face drop ] each-face-edge
257 e2 next-edge>> e2p next-edge<<
260 e2 next-edge>> e1p next-edge<<
261 e1 next-edge>> e2p next-edge<<
265 e2 b-rep delete-edge ;
267 TYPED:: kill-e-make-r ( edge: b-edge -- edge-ring: b-edge )
270 edge opposite-edge>> :> edge'
271 edge' next-edge>> :> edge-ring
272 edge-ring opposite-edge>> :> edge-ring'
274 edge edge' assert-same-face
275 edge edge-ring assert-same-face
276 edge edge-ring' assert-different-faces
278 b-rep new-face :> ring
280 ring edge face>> base-face>> add-ring
281 ring edge' edge subdivide-edge-cycle
283 edge b-rep delete-edge
284 edge' b-rep delete-edge
288 TYPED:: kill-f-make-rh ( edge-face: b-edge edge-base-face: b-edge -- )
289 edge-face face>> :> face
290 edge-base-face face>> :> base-face
292 face assert-base-face
293 base-face assert-base-face
294 edge-face edge-base-face assert-different-faces
296 face base-face add-ring ;
298 TYPED: move-v ( edge: b-edge point: point -- )
299 swap vertex>> position<< ;
301 TYPED: move-e ( edge: b-edge offset: point -- )
302 [ dup opposite-edge>> ] dip
303 '[ vertex>> [ _ v+ ] change-position drop ] bi@ ;
305 TYPED: move-f ( edge: b-edge offset: point -- )
306 '[ vertex>> [ _ v+ ] change-position drop ] each-face-edge ;
308 TYPED: sharp-e ( edge: b-edge sharp?: boolean -- )
311 TYPED: sharp-f ( edge: b-edge sharp?: boolean -- )
312 '[ _ sharp-e ] each-face-edge ;
314 TYPED: sharp-v ( edge: b-edge sharp?: boolean -- )
315 '[ _ sharp-e ] each-vertex-edge ;
317 TYPED: material-f ( edge: b-edge material -- ) 2drop ;