解答:8−2

円周にギザギザをつける場合のプログラムを考えよう。

結果:

          


はっきり言うと下のプログラムが一番良いプログラムだとはわからない。
皆川先生の求めているプログラムとは違うと思う。
先生は、奇数番号目の点と偶数番号目の点とで交互に半径の値を入れ替えるとあるが、
        (→奇数番目の点と偶数番目の点とで交互に半径の値を入れ替えるプログラム)

私のプログラムは、
あらかじめ半径の異なる2つの円を作り、奇数番目の時に外側の円(ここでは半径の円)の点に線を引き、
偶数番目の時に内側の円(半径r2の円)の点に線を引くプログラムである。
注意しなければならないのは、それだけでは i=1 の時に原点( 0,0 )からの線も描かれる事だ。
そこで、作図点を移動させないといけないので、円を描くプログラムの前に

   Canvas.MoveTo( xc+round(r) , yc );

を入れた。これは、円が0ラジアンから描かれる事と、作図点が中心から方向にだけ移動した点である事によって考えた。

このプログラムの他にも色々な方法があると思うので、自分が一番理解しやすいものを覚えるのがいいと思う。


プログラム:

procedure TForm1.Button1Click(Sender: TObject);

   var pai, th, incr, r, r2, x, x2, y, y2 : real;
      i, n_div, xc, yc: integer;
begin

   pai := 3.1415;
   r := 100;
   r2 := 80;
   n_div := 100;
   incr := 2 * pai / n_div;
   xc := 200; yc := 200;

   th := 0;

   Canvas.MoveTo( xc+round(r) , yc );

   for i:= 1 to n_div+1 do begin

      x := r * cos(th);
      y := r * sin(th);
      x2 := r2 * cos(th);
      y2 := r2 * sin(th);


      if i mod 2 <> 0 then begin

         Canvas.LineTo( xc+round(x), yc - round(y) );

      end else

         Canvas.LineTo( xc+round(x2), yc - round(y2) );


      th := th + incr;

   end;

end;

end.