個人の目次へ - 全体の目次へ
前の章へ

X 謝辞、参考文献

 この論文と研究内容「CG(前期)論教材Webページ」の作成にあたって、ゼミの森田先生、CG論を教え、配布プリントを使う事を許可してくれた皆川教授、ゼミで一緒に学んできたゼミ生の皆さん、そして大学へと行かせてくれた親、親族の皆さんにここで感謝の意を表します。

参考文献

文献[1] 高作義明・浅輪洋子(2000) 『はじめてのホームページ・ビルダー2001』ナツメ社
文献[2] 札幌学院大学社会情報学部(2000)『プログラミングB−Delphi入門−』
文献[3] 札幌学院大学皆川教授『コンピュータグラフィックス論 講義資料(1)〜(9)』

「三角比の計算(8章)」の解説:――――――――――――――――――――――

解説:8−1

ほとんどの人が知っていると思うが、三角比の復習をしよう。


同じように、c=30 の時のbの値を求めてみよう。
ここで使うのは cosの方である事はわかるだろう。

   cosA = b/c より b = c×cosA

よって、b = 10√3     となる。

覚えておくことは、ここで求めたaはyの値であって、bはxの値である事である。

半径をrとすると、
   ( x,y ) = ( r×cosA , r×sinA )
という事になる。ちなみに、
   sin(0) = 0 , cos(90) = 0

である。

「花のCG(10章)」の 関数: の解説――――――――――――――――

解説:10−1

今回のプログラムには以前使った手続き function が使われている。

プログラムの前半部分 (procedure TForm1.Button1Click(Sender: TObject);) はここではもう詳しく説明しない。今までと同じ事をしているからである。只、y2 の値が function の部分で求められ、返ってきて線を引くプログラムである。 

次のようにプログラムを変えて、それぞれの値がどのように変わっていくかを見ていこう(分かりやすいように4分割にした)。

var
Form1: TForm1;

function power_calc( n:integer; x:real ): real ;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var i , pw, xc, yc, n_div: integer;
  scale, dx, x1, y1, x2, y2 : real;

begin

   xc := 50;
   yc := 450;

   scale := 400;
   n_div := 4;

   dx := 1 / n_div;

   for pw := 1 to 2 do begin

      x1 := 0;
      y1 := 0;

      for i := 1 to n_div do begin

        x2 := x1 + dx;
        y2 := power_calc( pw, x2 );

        Canvas.MoveTo( xc + round(x1*scale), yc-round(y1*scale) );
        Canvas.LineTo( xc + round(x2*scale), yc-round(y2*scale) );

        y1 := y2;
        x1 := x1 + dx;

      end;

   end;

end;

function power_calc( n:integer; x:real ) : real;

var i : integer;
val : real;

begin

   val := 1;

   for i := 1 to n do begin
     val := val * x;
   end;

   power_calc := val;

end;

end.

結果:

     

pw=2の時を例に取り値を考える。

1、まず dx には 1/4 が入るので x2 は 1/4 が入る(普通に考えると作図点から数え

1つ目の頂点の座標を求めようとしている)
2、pw は 2
3、手続き function に行く( n には pw 、x には x2 が入る)
4、val は 1 に初期化されている
5、i = 1 の時( i は 1 から 2 まで)は、val := val * x より、val は x2 となる
6、i = 2 の時は、val := val * x より、val は x2 * x2 、つまり x2 の二乗となる
7、val の値が power_calc に返される( val の値はここでは 1/16 )
8、x2 ⇒ 1/4 、y2 ⇒ 1/16 となっている
9、Canvas.MoveTo の命令で、x座標は ⇒ xc + round( x1 * scale ) ⇒ 50
               y座標は ⇒ yc - round( y1 * scale ) ⇒ 450

座標( 50,450 )に移動する
10、Canvas.LineTo の命令で、x座標は ⇒ xc + round( x2 * scale ) ⇒ 150
               y座標は ⇒ yc - round( y2 * scale ) ⇒ 450 - 25 = 425

座標( 150,425 ) まで線を引く
11、y1 := y2; と、x1 := x1 + dx; のプログラムにより x1 と y1 の値が変わり、そしてま

た計算し始める
12、座標( 150,425 ) から 座標( 250,350 ) まで線を引く( i が2の時の値)
13、後はこの繰り返し : i = 3 の時 ⇒ ( 350.225 ) まで、 i = 4 の時 ⇒ ( 450,50 ) ま

で線を引く

このように頂点を繋いでいく絵を、分割数を大きくすればxの二乗の絵が描ける

(100分割)

     

「正方形で絵を描く(4-1)」講義資料[3]の内容――――――――――――――――

4−1 ピラミッド型の作図

正方形を並べて下図のようなピラミッド型を描いてみよう。

         

これまでの知識を利用して、この図形を描く。まず、縦横に正方形を並べることを基本とし、指定された条件が満たされた場合には、その位置で正方形を描き、それ以外の場合には描かない。プログラミングを行なう上では、繰返しのfor文を2重にしておき、その中で必要な条件文を入れることになる。

      

この図形の場合には、行数が増加するごとに、四角形を描く領域の幅が左右に正方形1個分ずつずれていっているので、このことを表現すればよい。プログラムは次のようになる。

プログラム)

procedure TForm1.Button1Click(Sender: TObject);

  var x, y, w, i, j , p1, p2 : integer;

begin

  x := 100;
  y := 100;
  w := 20;

  Canvas.Brush.Color := clGreen;

  p1 := 10;          (左の描き始め位置初期化)
  p2 := 10;          (右の描き始め位置初期化)

  for i := 1 to 10 do begin

    for j := 1 to 19 do begin

      if ( j >= p1 ) AND ( j <= p2 ) then begin      (描く範囲に関する条件)

        Canvas.Polygon( [ Point(x,y),
                   Point(x+w,y),
                   Point(x+w,y+w),
                   Point(x,y+w) ] );

      end;

      x := x + w;

    end;

    p1 := p1 - 1;          (左の描き始め位置を左に1個分移動)
    p2 := p2 + 1;          (右の描き始め位置を右に1個分移動)

    x := 100;
    y := y + w;

  end;

end;

「再帰を用いた作図(7-5)」講義資料[6]の内容――――――――――――――――

7−5 再帰を用いた簡単な作図例(図形の座標系から画面座標系への変換)

以下の例で、図形の原点と画面上の原点との対応付けを復習しておこう。

        

この図を描くためのプログラムは次の通りである。

(先頭部分省略)

var

 Form1: TForm1;

 xc, yc : integer;       (作図の中心位置)

 procedure rectangle_draw(xs, ys: integer; len:real);     (長方形を描く手続きの宣言)

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

  var  len : real;
     xs, ys : integer;

begin

  xc := 300;
  yc := 300;

  len := 200;
  xs := 0;
  ys := 0;

  rectangle_draw(xs, ys, len);

end;

procedure rectangle_draw(xs, ys : integer; len:real);

var xe, ye, w : integer;

begin

  w := round(len);
  xe := xs + w;
  ye := ys + w;

  if ( len > 3 ) then begin

    Form1.Canvas.Rectangle(xs+xc,yc-ys,xe+xc,yc-ye);

    len := len / 2;

    rectangle_draw(xs,ys,len);

  end;

end;

end.

  ※ Canvas.Rectangleの座標の与え方が、前回の例とは異なっていることに注意しよう。