Skip to content

Commit 0894df9

Browse files
committed
added spirals and stuff
1 parent cca2200 commit 0894df9

File tree

11 files changed

+667
-479
lines changed

11 files changed

+667
-479
lines changed

bbox.lisp

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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

Comments
 (0)