Skip to content

2.49

; Use segments->painter to define the following primitive painters
; a. The painter that draws the outline of the designated frame.
; b. The painter that draws an “X” byconnecting opposite corners of the frame.
; c. The painter that draws a diamond shape by connecting the midpoints of the sides of the frame.
; d. The wave painter.
#lang racket
(require (planet "sicp.ss" ("soegaard" "sicp.plt" 2 1)))

; NOTE: Procedure `segments->painter` is already preset in "soegaard" package

(define (make-vect x y) (cons x y))
(define (xcor-vect v) (car v))
(define (ycor-vect v) (cdr v))

(define (make-segment v1 v2) (cons v1 v2))
(define (start-segment segment) (car segment))
(define (end-segment segment) (cdr segment))

; (a) Outline of a frame (unit square)
; For some reason, giving "1.0" does not render a few edges, hence using 0.99 instead
(define outline-list
  (list
   (make-segment (make-vect 0 0) (make-vect 0 0.99))
   (make-segment (make-vect 0 0) (make-vect 0.99 0))
   (make-segment (make-vect 0.99 0) (make-vect 0.99 0.99))
   (make-segment (make-vect 0 0.99) (make-vect 0.99 0.99))))
(define outline (segments->painter outline-list))
(display "Outline of frame\n")
(paint outline)

; (b) "X" mark
(define x-list
  (list
   (make-segment (make-vect 0 0) (make-vect 1 1))
   (make-segment (make-vect 0 1) (make-vect 1 0))))
(define x-mark (segments->painter x-list))
(display "\nX-mark\n")
(paint x-mark)

; (c) Diamond
(define diamond-list
  (list
   (make-segment (make-vect 0   0.5) (make-vect 0.5   0))
   (make-segment (make-vect 0   0.5) (make-vect 0.5   1))
   (make-segment (make-vect 0.5   1) (make-vect 1   0.5))
   (make-segment (make-vect 1   0.5) (make-vect 0.5   0))))
(define diamond (segments->painter diamond-list))
(display "\nDiamond\n")
(paint diamond)

; (d) Wave shape
; Suggestion: Draw the shape on 0-100 rough scale and figure out line segments :)
; Also, excuse me for the wierd shape

(define wave-list
  (list
   (make-segment (make-vect  0.01 0.8) (make-vect  0.1 0.56))
   (make-segment (make-vect  0.1 0.56) (make-vect  0.2 0.6))
   (make-segment (make-vect  0.2 0.6) (make-vect 0.3 0.58))
   (make-segment (make-vect  0.3 0.58) (make-vect  0.2 0.75))
   (make-segment (make-vect  0.2 0.75) (make-vect  0.4 1))
   (make-segment (make-vect  0.6 1) (make-vect  0.8 0.75))
   (make-segment (make-vect  0.8 0.75) (make-vect  0.7 0.58))
   (make-segment (make-vect  0.7 0.58) (make-vect  0.8 0.6))
   (make-segment (make-vect  0.8 0.6) (make-vect  1 0.4))
   (make-segment (make-vect  0 0.61) (make-vect  0.1 0.35))
   (make-segment (make-vect  0.1 0.35) (make-vect  0.2 0.5))
   (make-segment (make-vect  0.2 0.5) (make-vect  0.3 0.35))
   (make-segment (make-vect  0.3 0.35) (make-vect  0.2 0))
   (make-segment (make-vect  0.3 0) (make-vect 0.5 0.25))
   (make-segment (make-vect  0.5 0.25) (make-vect 0.65 0))
   (make-segment (make-vect  0.75 0) (make-vect  0.6 0.4))
   (make-segment (make-vect  0.6 0.4) (make-vect  1 0.2))))
(define wave (segments->painter wave-list))
(display "\nWave\n")
(paint wave)