4

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、それぞれ、およびです。origincorner1corner2transform-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)

座標平面上のこれらの点を見ると、結果は正しくないように見えますが、減算が行われる前の元のコーナーの結果は正しくありません。私は何を間違っていますか?

4

1 に答える 1

1

添付の写真を見てください(私の絵のスキルで申し訳ありません:))。私は、変換されたベクトルをm corner1としてマークしました。これは、ペインターが動作する新しいフレームの新しいコーナーとして十分であると言います( m corner1は、corner1ポイントにマップされたm座標変換です)。

ただし、これは正しい位置で「終了」するベクトルであることに注意してください。正しいフレームを取得するには、原点も変換する必要があります。ここで、新しい原点が新しい原点にあり、求める新しい角 (赤い角) が前の 2 つのベクトル差であることを確認してください。

単位正方形にある青いフレームは、赤いフレームにマッピングされます

(写真は、赤いフレームにマッピングされている単位正方形にある青いフレームを示しています)

于 2013-03-21T14:53:49.833 に答える