時計を作る
その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.
これを実行すると,下のようになります。

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