SICP 연습문제 2.50 친절한 풀이

문제

페인터를 수평으로 뒤집어 변환하는 flip-horiz 프로시저를 정의하라. 페인터를 시계 반대 방향으로 180도, 270도 돌리는 프로시저도 정의해 보라.

문제로 부터 얻은 것

페인터 데이터를 추상화한 방식이 얼마나 효율적으로 다른 프로시저들을 만들 수 있는 지를 확인할 수 있었습니다.
페인터를 감싼 틀을 비튼다는 방식은 수많은 변형을 쉽게 가능하게 해주었습니다.
데이터를 잘 추상화하면 이렇게 좋다는 것을 보고 갑니다.

문제풀이

책의 설명을 잘 이해했다면 transform-painter의 사용은 그렇게 어렵지 않을 것 같습니다. 이 프로시저도 그전의 프로시저와 마찬가지로 기본으로 내장된 프로시저이니 따로 구현할 필요 없습니다.

#lang sicp 
(#%require sicp-pict)

결국 어떤 페이터의 틀을 조작하는 것은 그 틀의 origin의 좌표와 x축 좌표의 끝, y축 좌표의 끝를 조작하는 것입니다. 그림틀을 원하는 형태로 바꿨을 때 이 세 좌표가 새로운 그림틀의 어느 위치에 있는 지를 알면 쉽게 변형을 할 수 있습니다.

a. flip-horiz

(define (flip-horiz painter)
(transform-painter painter
(vect 1.0 0.0)
(vect 0.0 0.0)
(vect 1.0 1.0)))

수평으로 반전된 아인슈타인



b. rotate180

(define (rotate180 painter)
(transform-painter painter
(vect 1.0 1.0)
(vect 0.0 1.0)
(vect 1.0 0.0)))

180도 회전한 아인슈타인


c. rotate270

(define (rotate270 painter)
(transform-painter painter
(vect 0.0 1.0)
(vect 1.0 1.0)
(vect 0.0 0.0)))

반시계 방향으로 270도 회전한 아인슈타인



읽어주셔서 감사합니다.