X-Git-Url: https://git.jsancho.org/?p=dungeon-master.git;a=blobdiff_plain;f=mods%2Fdefault%2Fvoronoi.scm;fp=mods%2Fdefault%2Fvoronoi.scm;h=0000000000000000000000000000000000000000;hp=424f2d71a6f2117e9771be91e7254e9a8ec0885d;hb=695ecf94f5bb10ced4e66b0b4d036de9965c02ca;hpb=4e1254800a1c453aba76b8ccd5b632f38a71aed7 diff --git a/mods/default/voronoi.scm b/mods/default/voronoi.scm deleted file mode 100644 index 424f2d7..0000000 --- a/mods/default/voronoi.scm +++ /dev/null @@ -1,130 +0,0 @@ -(define-module (dungeon-master geom voronoi) - #:use-module (ice-9 receive) - #:use-module (srfi srfi-1) - #:use-module (srfi srfi-9) - #:use-module (dungeon-master geom point) - #:use-module (dungeon-master geom triangle) - #:export (make-voronoi-mesh - voronoi-mesh? - voronoi-mesh-triangles - voronoi-mesh-points - voronoi-mesh-frame)) - -"https://github.com/watabou/TownGeneratorOS/blob/master/Source/com/watabou/geom/Voronoi.hx" - -(define-record-type - (make-raw-voronoi-mesh triangles points frame) - voronoi-mesh? - (triangles voronoi-mesh-triangles set-voronoi-mesh-triangles!) - (points voronoi-mesh-points set-voronoi-mesh-points!) - (frame voronoi-mesh-frame set-voronoi-mesh-frame!)) - -(define (make-voronoi-mesh vertices) - (receive (minx miny maxx maxy) - (calculate-mesh-limits vertices) - (let ((c1 (make-point minx miny)) - (c2 (make-point minx maxy)) - (c3 (make-point maxx miny)) - (c4 (make-point maxx maxy))) - (let ((frame (list c1 c2 c3 c4)) - (points (list c1 c2 c3 c4)) - (triangles (list (make-triangle c1 c2 c3) - (make-triangle c2 c3 c4)))) - '())))) - -(define (calculate-mesh-limits vertices) - (let ((xs (map (lambda (p) (point-x p)) vertices)) - (ys (map (lambda (p) (point-y p)) vertices))) - (let ((minx (apply min (cons (expt 10 10) xs))) - (miny (apply min (cons (expt 10 10) ys))) - (maxx (apply max (cons (- (expt 10 9)) xs))) - (maxy (apply max (cons (- (expt 10 9)) ys)))) - (let ((dx (* (- maxx minx) 0.5)) - (dy (* (- maxy miny) 0.5))) - (values (- minx (/ dx 2)) - (- miny (/ dy 2)) - (+ maxx (/ dx 2)) - (+ maxy (/ dy 2))))))) - -(define (calculate-mesh points triangles vertices) - (cond ((null? vertices) - (values points triangles)) - (else - (let ((vertice (car vertices))) - (receive (to-split to-keep) - (triangles-contains-point triangles vertice) - (cond ((null? to-split) - (calculate-mesh points triangles (cdr vertices))) - (else - (calculate-mesh (cons vertice points) - (concatenate (calculate-new-triangles to-split vertice) - to-keep) - (cdr vertices))))))))) - -(define (calculate-new-triangles to-split p1) - (let ((vertices (calculate-new-vertices to-split))) - (let* ((a (car vertices)) - (b (cadr vertices)) - (len (length a))) - (let loop ((sublist-a a) - (triangles '())) - (cond (sublist-a - (let ((p2 (car sublist-a)) - (p3 (list-ref b (- len (length sublist-a))))) - (loop (member p3 a) - (cons (make-triangle p1 p2 p3) triangles)))) - (else - triangles)))))) - -(define* (calculate-new-vertices triangles #:optional (original-t triangles) (a '()) (b '())) - (cond ((null? triangles) - (list a b)) - (else - (let* ((triangle (car triangles)) - (common-edge (triangles-has-common-edge triangle original-t))) - (let ((points (triangle-points triangle))) - (let ((p1 (car points)) - (p2 (cadr points)) - (p3 (caddr points)) - (e1 (car common-edge)) - (e2 (cadr common-edge)) - (e3 (caddr common-edge))) - (cond (e1 - (set! a (cons p1 a)) - (set! b (cons p2 b)))) - (cond (e2 - (set! a (cons p2 a)) - (set! b (cons p3 b)))) - (cond (e3 - (set! a (cons p3 a)) - (set! b (cons p1 b)))) - (calculate-new-vertices (cdr triangles) original-t a b))))))) - -(define* (triangles-has-common-edge triangle triangles #:optional (e1 #t) (e2 #t) (e3 #t)) - (cond ((not (or e1 e2 e3)) - (list e1 e2 e3)) - ((null? triangles) - (list e1 e2 e3)) - (else - (let ((t (car triangles))) - (cond ((equal? t triangle) - (triangles-has-common-edge triangle (cdr triangles) e1 e2 e3)) - (else - (let ((points (triangle-points triangle))) - (let ((p1 (car points)) - (p2 (cadr points)) - (p3 (caddr points))) - (when (and e1 (triangle-has-edge t p2 p1)) - (set! e1 #f)) - (when (and e2 (triangle-has-edge t p3 p2)) - (set! e2 #f)) - (when (and e3 (triangle-has-edge t p1 p3)) - (set! e3 #f)))) - (triangles-has-common-edge triangle (cdr triangles) e1 e2 e3))))))) - -(define (triangles-contains-point triangles point) - (partition - (lambda (triangle) - (< (points-distance point (triangle-center triangle)) - (triangle-radius triangle))) - triangles))