3

SICP でのフレームの実装について理解できないようです。

本の状態

単位正方形 (0< x,y< 1) の座標を使用して画像を指定します

画像は座標としてどのように表現されますか? 私が納得できる唯一の解釈は、線であるすべての画像は、境界が単位正方形の境界を超えてはならないフレームにのみマッピングできるということです。しかし、「フレーム座標マップ」を説明している本の次の行で、

マップは、ベクトル v = (x,y) をベクトル和 Origin(Frame) + x*Edge1(Frame) + y*Edge2(Frame) にマッピングすることにより、単位正方形をフレームに変換します。

ベクトル (0,0) がフレームの原点にマップされ、(1,1) が原点の対角線上にある頂点にマップされていることは、私の混乱を助長するだけです。これらのベクトルは何ですか? 画像の由来とか?

私はこれを理解することができず、この概念に基づいて構築された後に議論されるすべてのものとして、テキストにさらに進むことを妨げています. この本を読んだ人がこの考えをどのように理解したかについて詳細な説明を得ることができれば、非常に役立つと思います.

4

2 に答える 2

10

画像の解釈は正しいです。画像は、原点(0、0)が左下隅、(1、1)が右上隅である単位正方形の線分で構成されています。

デフォルトのフレームに描かれたアインシュタイン

画家は、質問で与えられた変換を使用して、画像をフレームにマッピングします。上のeinsten画像はデフォルトのフレーム(単位正方形)で描画されているため、正常に表示されます。

SICP Picture Languageを使用して、次の3つのステップで画像を作成および表示できます。

  • 線分のリストを定義する
  • それらの線分からセグメントペインタを作成します
  • 新しいセグメントペインターでペイントを呼び出す

私はブログ投稿SICP2.49:プリミティブペインターの定義によるいくつかの簡単な画像でこれを行います。2つの線分だけを使用した簡単な例を次に示します。

; The painter that draws an 'X' by connecting opposite corners of the frame.
(define x-segments
 (list
  (make-segment
   (make-vect 0.0 0.0)
   (make-vect 0.99 0.99))
  (make-segment
   (make-vect 0.0 0.99)
   (make-vect 0.99 0.0))))

(define x-painter (segments->painter x-segments))

(paint x-painter)

DrRacketで最後のコマンドを実行したときの結果は次のとおりです。

シンプルな画家

画像を描画するための新しいフレームを作成することで、画像を反転および回転させることができます。

フレームは次の3つのベクトルで定義されます。

  • 起源
  • 下端(edge1)
  • 左端(edge2)

ここに画像の説明を入力してください

テキスト(ペインターの変換と結合というタイトルのセクション)に示されている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)))))))

たとえば、左に45度回転した元のアインシュタイン画像を描画する場合は、einsteinセグメントペインタを新しい原点、下端、左エッジとともに渡すだけでtransform-painter、新しいセグメントペインタが返されます。つまり、transform-painter画像の左下、右下、左上隅を描画する場所を指定する必要があります。これにより、元のセグメントペインタですべての線分が変換されます。

; rotate an image 45 degrees to the left
(define (rotate-45 painter)
  ((transform-painter (make-vect 0.5 0.0)
                      (make-vect 1.0 0.5)
                      (make-vect 0.0 0.5))
   painter))

コマンドを実行して(paint (rotate-45 einstein))、回転した画像を表示できます。

アインシュタインは45度回転しました

于 2013-03-20T15:09:58.063 に答える
0

私が覚えている限り、フレームは単位正方形に対する座標で定義されたベクトル画像であり、そこからスケーリング、マッピング、および一般に、指定された原点とサイズの座標系に変換できます。それはすべて「フレーム」セクションの下の本の中にあります。

すべての画像が単位正方形に含まれていると正しく仮定できます。ただし、これはまったく制限ではありません。単位正方形には無限の数の座標点があり、夢見ることができるあらゆる画像がそこに収まります。座標が [0, 1] の範囲内にあると定義するのは、慣習の問題です。それらが [1, 1000] の範囲内にある場合は同じです。小数点を移動することで、ある座標系から別の座標系にマッピングできます。

于 2013-03-20T13:55:28.377 に答える