1 (define-module (dungeon-master geom voronoi)
2 #:use-module (ice-9 receive)
3 #:use-module (srfi srfi-1)
4 #:use-module (srfi srfi-9)
5 #:use-module (dungeon-master geom point)
6 #:use-module (dungeon-master geom triangle)
7 #:use-module (dungeon-master geom bowyer-watson)
8 #:export (make-voronoi-mesh
10 voronoi-mesh-triangles
13 voronoi-mesh-regions))
15 "https://github.com/watabou/TownGeneratorOS/blob/master/Source/com/watabou/geom/Voronoi.hx"
17 (define-record-type <voronoi-region>
18 (make-voronoi-region seed vertices)
20 (seed voronoi-region-seed)
21 (vertices voronoi-region-vertices))
23 (define-record-type <voronoi-mesh>
24 (make-raw-voronoi-mesh triangles points frame regions)
26 (triangles voronoi-mesh-triangles)
27 (points voronoi-mesh-points)
28 (frame voronoi-mesh-frame)
29 (regions voronoi-mesh-regions))
31 (define* (make-voronoi-mesh vertices #:optional (relax-steps 3))
32 ; Delaunay triangulation
33 (receive (triangles points frame)
34 (bowyer-watson vertices)
35 ; Relaxing central wards
36 ;; (let relax ((step relax-steps))
38 ;; (relax (- step 1)))
41 (make-raw-voronoi-mesh
45 (make-regions points triangles))))
47 (define* (make-regions points triangles #:optional (regions '()))
51 (let* ((p (car points))
53 (lambda (tr) (member p (triangle-points tr)))
56 (make-regions (cdr points)
58 (cons (make-voronoi-region p vertices) regions))))))