-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrectangles.rkt
66 lines (55 loc) · 1.93 KB
/
rectangles.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#lang racket
(define (square x) (* x x))
(define (hypot x y)
(sqrt (+ (square x) (square y))))
(define (make-segment start end)
(cons start end))
(define (start-segment x) (car x))
(define (end-segment x) (cdr x))
(define (components-segment s)
(make-point (- (x-point (end-segment s))
(x-point (start-segment s)))
(- (y-point (end-segment s))
(y-point (start-segment s)))))
(define (magnitude-segment s)
(let ((comps (components-segment s)))
(hypot (car comps) (cdr comps))))
(define (dot-segment s1 s2)
(dot (components-segment s1)
(components-segment s2)))
(define (dot v1 v2)
(let ((x1 (car v1))
(x2 (car v2))
(y1 (cdr v1))
(y2 (cdr v2)))
(sqrt (+ (* x1 x2) (* y1 y2)))))
(define (make-point x y) (cons x y))
(define (x-point p) (car p))
(define (y-point p) (cdr p))
(define (equal-point p1 p2)
(and (= (x-point p1) (x-point p2))
(= (y-point p1) (y-point p2))))
(define (make-rectangle seg1 seg2)
(if (not (= (dot-segment seg1 seg2) 0))
(error "MAKE-RECTANGLE -- non-perpendicular line segments"
seg1
seg2)
(let ((p1 (start-segment seg1))
(p2 (end-segment seg1))
(p3 (start-segment seg2))
(p4 (end-segment seg2)))
(cond ((equal-point p1 p3) #f)
((equal-point p1 p4) #f)
((equal-point p2 p3) #f)
((equal-point p2 p4) #f)
(else (error ("MAKE-RECTANGLE -- non-intersecting line segments"
seg1
seg2)))))))
; Representation 2 - scale, translate, rotate unit square
(define (make-rectangle-v2 w h rads orig) #f)
(define a (make-segment (make-point 2 2)
(make-point 5 -2)))
(define b (make-segment (make-point 2 2)
(make-point 4 4)))
(define c (make-segment (make-point 2 2)
(make-point 4 0)))