1 (define-module (dungeon-master geom triangle)
2 #:use-module (ice-9 receive)
3 #:use-module (srfi srfi-9)
4 #:use-module (dungeon-master geom point)
5 #:export (make-triangle
12 (define-record-type <triangle>
13 (make-raw-triangle points center radius)
15 (points triangle-points)
16 (center triangle-center)
17 (radius triangle-radius))
19 (define (make-triangle p1 p2 p3)
20 (let ((center (circumcenter p1 p2 p3)))
24 (points-distance center p1))))
26 (define (circumcenter p1 p2 p3)
28 (perpendicular-line-from-points p1 p2)
30 (perpendicular-line-from-points p2 p3)
31 (let ((determinant (- (* a f) (* e b))))
33 (/ (- (* f c) (* b g)) determinant)
34 (/ (- (* a g) (* e c)) determinant))))))
36 (define (perpendicular-line-from-points p1 p2)
37 (let ((x1 (point-x p1))
43 (c (+ (* a x1) (* b y2))))
44 (let ((mid-x (/ (+ x1 x2) 2))
45 (mid-y (/ (+ y1 y2) 2)))
48 (+ (* (- b) mid-x) (* a mid-y)))))))
50 (define (triangle-has-edge triangle a b)
51 (let ((points (triangle-points triangle)))
52 (let ((p1 (car points))
55 (or (and (equal? p1 a) (equal? p2 b))
56 (and (equal? p1 b) (equal? p2 a))
57 (and (equal? p2 a) (equal? p3 b))
58 (and (equal? p2 b) (equal? p3 a))
59 (and (equal? p3 a) (equal? p1 b))
60 (and (equal? p3 b) (equal? p1 a))))))