−トップへ−

時計を作る
その2 文字盤を作る2

目盛をつける

 前回に文字盤を作りましたが,今回はそれに目盛を付けてみます。
 
 目盛を付けるには,真上から,右回りに6度ずつの場所にしるしを付けていかなくてはなりません。この点は,下のような数式で求めることができます。
 
 まず中心となる点(size,size)から真上の地点を0度として,右回りに1度,2度,…と数えていくことにして角度がd度のとき,中心からlenポイント離れた座標は
   X座標 size+round(d*sin(len*pi/180))
   Y座標 size+round(d*cos(len*pi/180))
 という式で求めることができます。三角関数のsinやcosの角度はラジアンのため,一般的な角度(degree)を使う場合は,上記のようになります。

 この式をプロシージャの中で直接使っても構わないのですが,これは長針や短針を表示するときにも使うので,関数にしておきます。


 これを,記述すると下記のようになります。

 type
  TForm1 = class(TForm)
  Image1: TImage;
  procedure makeban; //←これを記述して,[Shift]+[Ctrl]+[C]を押すと新しいプロシージャが生成されます
  procedure FormCreate(Sender: TObject);
 private
  { Private 宣言 }
  size:integer; //sizeは時計の文字盤の半径の大きさにします
 public
  { Public 宣言 }
 end;
  :
  :
//関数=====================================================
function GetPoint(Center: TPoint; deg: Integer; len: Integer): TPoint;
begin
 Result.x := Center.x + Round(deg * sin(len * pi /180));
 Result.y := Center.y - Round(deg * cos(len * pi /180));
end;
//=========================================================
 
 この関数では,中心の座標をポイント型の変数(center),角度を整数型の変数(deg),中心からの長さを整数型の変数(len)として代入します。
 すると,中心から[len]ポイント離れ,[deg]度傾いた座標をポイント型の変数で返してくれます。
 

  :
  :

procedure TForm1.makeban; //これが新しく生成されたプロシージャです
 var
  w,i:integer; //変数wを整数宣言します(文字盤の枠の太さを表すために使用します)
                      //変数iを整数宣言します
  center:TPoint; //centerをポイント型の変数として宣言します
 begin
  w:=size div 30; //wの大きさをsizeの30分の1にしてみます
  with image1.Canvas do begin
   brush.Color:=clred; //ブラシの色を赤にして
   fillrect(image1.ClientRect); //image1のcanvasを赤で塗りつぶします(これで透明になります)
   brush.Color:=$fafafa; //次にブラシの色を灰色っぽい白にして
   brush.Style:=bssolid; //ブラシの塗りつぶしのスタイルを「bssolid」にします
   pen.color:=$cccccc; //ペンの色を灰色にします(これが枠の色になります)
   pen.width:=w * 2; //ペンの太さを変数「w」の2倍にします
   Ellipse(w,w,image1.Width-w,image1.Height-w); //円を描きます

    //目盛を刻む
   w:=size *86 div 100; //目盛を書き込む場所をsizeの長さの86%にしてみます
   cent.X:=size; //中心のX座標をsizeにする
   cent.Y:=size; //中心のY座標をsizeにする
   pen.Width:=1; //目盛を書き込む太さを1にする
   pen.Color:=clblack; //目盛の色を黒にする
   for i:=1 to 60 do begin
    moveto(getpoint(cent,w,i*6).X,getpoint(cent,w,i*6).Y);
    lineto(getpoint(cent,w+3,i*6).x,getpoint(cent,w+3,i*6).y);
   end;
   w:=size *84 div 100; //目盛を書き込む場所をsizeの長さの84%にしてみます
   pen.Width:=round(size*3 / 100); //目盛の太さをsizeの3%にする
   for i:=0 to 11 do begin
    moveto(getpoint(cent,w,i*30).X,getpoint(cent,w,i*30).Y);
    lineto(getpoint(cent,w+4,i*30).x,getpoint(cent,w+4,i*30).y);
   end;
  end;
 end;

 end.

これを実行すると,下のようになります。



 次回は針を書き込み,時刻を表示できるようにします。

−トップへ−