SICP の画像言語ではtransform-painter
、手順がどのように機能するかを理解するのに苦労しています。
(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)))))))
具体的には、new-origin による引数フレームのエッジ マッピングのベクトル減算が必要な理由です。新しいコーナー、つまり(m corner1)
とのマッピングは(m corner2)
、変換されたフレームの新しいエッジとして機能すると考えていたでしょう。
私はいくつかの計算を行いましたが、どこが混同されているかを知りたいです。例を挙げるflip-vert
と、
(define (flip-vert painter)
(transform-painter painter
(make-vect 0.0 1.0) ; new origin
(make-vect 1.0 1.0) ; new end of edge1
(make-vect 0.0 0.0))) ; new end of edge2
flip-vert
次の寸法のフレームを引数として取り、
原点 = (0, 0)、エッジ 1 = (4, 0)、エッジ 2 = (0, 4)
したがって、マッピング式は になり(0,0) + x(4,0) + y(0, 4)
ます。
、、およびに引数として渡される場合はflip-vert
、それぞれ、およびです。origin
corner1
corner2
transform-painter
(0,1)
(1,1)
(0,0)
したがって、それらをマッピング式に次々と配置した後、結果が得られます
新しいオリジン = (0,0)+0*(4,0)+1*(0,4) = (0,4)
マップされたコーナー 1 = (0,0)+1*(4,0)+1*(0,4) = (4,4)
マップされたコーナー 2 = (0,0)
ここで、transform-painter
は最後の 2 つの結果を取得し、それらを で減算しnew-origin
て新しいフレームを作成し、次の寸法のフレームを作成します。
原点 = (0,4)、新しいコーナー 1 = (4,0)、新しいコーナー 2 = (0,-4)
座標平面上のこれらの点を見ると、結果は正しくないように見えますが、減算が行われる前の元のコーナーの結果は正しくありません。私は何を間違っていますか?