Skip to content

2.50

; Define the transformation flip-horiz, which flips painters horizontally, 
; and transformations that rotate painters counterclockwise by 180 degrees 
; and 270 degrees.
#lang racket
(require (planet "sicp.ss" ("soegaard" "sicp.plt" 2 1)))

; Helpers
(define (xcor-vect v) (car v))
(define (ycor-vect v) (cdr v))
(define (sub-vect v1 v2)
    (make-vect 
        (- (xcor-vect v1) (xcor-vect v2))
        (- (ycor-vect v1) (ycor-vect v2))))

(define (transform-painter painter origin corner1 corner2)
  (lambda (frame)
    (let ((m (frame-coord-map frame)))
      (let ((new-origin (m origin)))
        (painter (make-frame
                   new-origin
                   (sub-vect (m corner1) new-origin)
                   (sub-vect (m corner2) new-origin)))))))

; (i) Flip horizontally
(define (flip-horiz painter)
  (transform-painter painter
                     (make-vect 1 0)
                     (make-vect 0 0)
                     (make-vect 1 1)))

; Test horizontal flip
(define f1-list (list (make-segment (make-vect 0.3 0.3) (make-vect 0.3 0.7))
                      (make-segment (make-vect 0.3 0.7) (make-vect 0.7 0.5))
                      (make-segment (make-vect 0.7 0.5) (make-vect 0.3 0.3))))
(define f1 (segments->painter f1-list))
(display "\nFrame f1\n")
(paint f1)

(display "\nFrame flipped horizontally f1\n")
(paint (flip-horiz f1))

; (ii) Counterclockwise 180deg
(define (rotate180 painter)
  (transform-painter painter
                     (make-vect 1 1)
                     (make-vect 0 1)
                     (make-vect 1 0)))
(display "\nFrame rotate counter clockwise 180deg f1\n")
(paint (rotate180 f1))

; (iii) Counterclockwise 270deg
(define (rotate270 painter)
  (transform-painter painter
                     (make-vect 0 1)
                     (make-vect 0 0)
                     (make-vect 1 1)))
(display "\nFrame rotate counter clockwise 270deg f1\n")
(paint (rotate270 f1))