今回はちょっと数学的なお話。
最大公約数を求めます。
ユークリッドの互除法は最大公約数を求める有名なアルゴリズム。
どんな方法かというと、
整数xとyを与えた時に、xをyで割った余り(剰余)をrとすると、xとyとの最大公約数はyとrとの最大公約数と等しい。ただしxと0の最大公約数はxとする。
要するにどういう事かというと、xとyの最大公約数を出すためには、
「y」と「xをyで割ったときの余り」との最大公約数を求めればいいということ。
これを実装するためには再帰を使わなきゃならない。
再帰って言うのは関数が自分自身を呼び出すこと。
再帰は便利だけれども一歩間違うと無限ループになるので危険だったりもする。
まぁ今回は再帰を使わないとできないので以下にコードを示します。
function GetGCD(x,y: Integer): Integer;
var
ReturnVal: Integer;
begin
if y = 0 then
begin
ReturnVal:= x;
end
else
begin
ReturnVal:= GetGCD(y, x mod y);
end;
Result:= ReturnVal;
end;
コードはとてもシンプルです。
yが0の時はxを返し、そうでない時は自分自身を呼び出して引数にyとx mod yを指定する。
x mod yはxをyで割った余りのこと。
これで簡単に最大公約数を求められる。
更に今度はこれを使って画像のアスペクト比を求めてみる。
procedure GetAspectRatio(Width,Height: Integer);
var
GCD,WR,HR: Integer;
begin
GCD:= GetGCD(Width,Height);
WR:= Width div GCD;
HR:= Height div GCD;
ShowMessage('最大公約数:'+IntToStr(GCD)+#13#10+'アスペクト比='+IntToStr(WR)+':'+IntToStr(HR));
end;
GetAspectRatio手続きの引数Width、Heightには画像の幅と高さをそれぞれ指定する。
そして先ほどのGetGCD関数を用いて最大公約数を出し、GCD変数に代入する。
あとはそれぞれ幅と高さを最大公約数で除せばアスペクト比が算出される。
上記サンプルでは算出された最大公約数とアスペクト比をShowMessage手続きで表示している。
例えば800×600だと、最大公約数200、アスペクト比4:3といった具合になる。