1
+ (in-package :gcode )
2
+
3
+ (defgeneric bounding-box (object))
4
+
5
+ #+ nil
6
+ (defmethod bounding-box ((p point))
7
+ (make-line :a p :b p))
8
+
9
+ (defmethod bounding-box ((l line))
10
+ (with-slots (a b) l
11
+ (let ((min-x (min (2d-point-x a) (2d-point-x b)))
12
+ (min-y (min (2d-point-y a) (2d-point-y b)))
13
+ (max-x (max (2d-point-x a) (2d-point-x b)))
14
+ (max-y (max (2d-point-y a) (2d-point-y b))))
15
+ (make-line :a (2dp min-x min-y) :b (2dp max-x max-y)))))
16
+
17
+ (defmethod bounding-box ((arc arc))
18
+ ; ; XXX billig, stimmt nicht
19
+ (with-slots (a b) arc
20
+ (let ((min-x (min (2d-point-x a) (2d-point-x b)))
21
+ (min-y (min (2d-point-y a) (2d-point-y b)))
22
+ (max-x (max (2d-point-x a) (2d-point-x b)))
23
+ (max-y (max (2d-point-y a) (2d-point-y b))))
24
+ (make-line :a (2dp min-x min-y) :b (2dp max-x max-y)))))
25
+
26
+ (defmethod bounding-box ((bezier bezier))
27
+ ; ; billig founctionniert nicht XXX
28
+ (with-slots (a b) bezier
29
+ (let ((min-x (min (2d-point-x a) (2d-point-x b)))
30
+ (min-y (min (2d-point-y a) (2d-point-y b)))
31
+ (max-x (max (2d-point-x a) (2d-point-x b)))
32
+ (max-y (max (2d-point-y a) (2d-point-y b))))
33
+ (make-line :a (2dp min-x min-y) :b (2dp max-x max-y)))))
34
+
35
+ (defmethod bounding-box ((l list ))
36
+ (let* ((bboxes (mapcar #' bounding-box l))
37
+ (min-x (reduce #' min (mapcar #' (lambda (x) (2d-point-x (line-a x))) bboxes)))
38
+ (min-y (reduce #' min (mapcar #' (lambda (x) (2d-point-y (line-a x))) bboxes)))
39
+ (max-x (reduce #' max (mapcar #' (lambda (x) (2d-point-x (line-b x))) bboxes)))
40
+ (max-y (reduce #' max (mapcar #' (lambda (x) (2d-point-y (line-b x))) bboxes))))
41
+ (make-line :a (2dp min-x min-y) :b (2dp max-x max-y))))
42
+
43
+ (defun rotate-and-bring-to-zero (object angle)
44
+ (let* ((robj (transform-object object (rotation-matrix angle)))
45
+ (bbox (bounding-box robj))
46
+ (bottom (bbox-bottom bbox))
47
+ (left (bbox-left bbox)))
48
+ (transform-object robj (translation-matrix (- left) (- bottom)))))
49
+
50
+ (defun bbox-below-p (obj y)
51
+ (let ((bbox (bounding-box obj)))
52
+ (< (2d-point-y (line-b bbox)) y)))
53
+
54
+ (defun bbox-above-p (obj y)
55
+ (let ((bbox (bounding-box y)))
56
+ (> (2d-point-y (line-a bbox)) y)))
57
+
58
+ (defun bbox-width (bbox)
59
+ (- (2d-point-x (line-b bbox))
60
+ (2d-point-x (line-a bbox))))
61
+
62
+ (defun bbox-height (bbox)
63
+ (- (2d-point-y (line-b bbox))
64
+ (2d-point-y (line-a bbox))))
65
+
66
+ (defun bbox-bottom (bbox)
67
+ (2d-point-y (line-a bbox)))
68
+
69
+ (defun bbox-top (bbox)
70
+ (2d-point-y (line-b bbox)))
71
+
72
+ (defun bbox-left (bbox)
73
+ (2d-point-x (line-a bbox)))
74
+
75
+ (defun bbox-right (bbox)
76
+ (2d-point-x (line-b bbox)))
0 commit comments