私はDelphi 2007を使用していて、いくつかのプレゼンテーションソフトウェアで作業しています。私が取り組んでいる現在のモジュールは、ビデオのトランジションフィルタです。私が使用しているトランジションコード(TPicShowのPSEffectsユニット)には、フレームのサイズとトランジションの進行状況に基づいてX値とY値が必要です。ここでは、コードMulDivは、既知の値を保存して他のコードで数学を行うよりも効率が悪くなる可能性があります
Type
TPercent = 0..100;
var
ATo : TBitmap; //
Prog : Integer; //Progress of the transition
if ATo.Width >= ATo.Height then
begin
X := MulDiv(ATo.Width, Prog, High(TPercent));
Y := MulDiv(X, ATo.Height, ATo.Width);
end
else
begin
Y := MulDiv(ATo.Height, Prog, High(TPercent));
X := MulDiv(Y, ATo.Width, ATo.Height);
end;
は、私はこれを最適化しようとしていると私は(ATO変化の大きさになるまで)一定になる計算を保存し、2つの分割の計算に各フレームを削除することができることを見ました。
だから、
{All of these are calculated when the dimensions of ATo Change}
WDP : real; // width divided by High(TPercent)
HDW : real; // Height divided by width
HDP : real; // Height divided by High(TPercent)
WDH : real; // Width divided by Height
if ATo.Width >= ATo.Height then
begin
X := Trunc(WDP * Prog);
Y := Trunc(HDW * X);
end
else
begin
Y := Trunc(HDP * Prog);
X := Trunc(WDH * Y);
end;
ようなものになるだろうそれは良い音が、私は必ずカントMulDivの実際のコードを持っていません。それは単に(非常に単純化された)
MulDiv(a,b,c : Integer)
begin
Round((A*B)/C);
end
を行う場合、私はその後、私はありません(私はそれがかもしれないものをいただきたいもの)MulDiv機能を最適化すると非常にクールなものを行うがあれば、私の変更は、より効率的になります知っています私の変更が私に何かをネットするかどうか確かめてください。
私の変更はより効率的でしょうか?
編集:私はまだこれを実装していない、私はただの観念を楽しんでいる。
「Y」の値は実際には「X」に依存しないことに注意してください。あなたは 'MulDiv(X、ATo.Height、ATo.Width)'として 'Y'を計算しますが、' MulDiv(ATo.Height、Prog、100) 'として直接計算することができます。一度これを行うと、幅が高さよりも大きいかどうかに関係なく、 'X'と' Y'の計算が*同一*であることがわかります。 –
@Rob:ありがとうございます – Tim