lazarus-ccr/examples/noise/noise1d.dpr
2007-01-16 14:24:22 +00:00

113 lines
2.6 KiB
ObjectPascal

program noise1d;
{$ifdef fpc}
{$mode delphi}
{$endif}
uses
{$ifdef fpc}
Interfaces, // this includes the LCL widgetset
{$endif}
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
noise;
type
{ TMainWindow }
TMainWindow = class(TForm)
private
{ private declarations }
SelectInterpolation: TComboBox;
procedure DoPaint(Sender: TObject);
procedure DoRefresh(Sender: TObject);
function NormalizeNoise(x: Double): Integer;
public
{ public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
var
vMainWindow: TMainWindow;
{ TMainWindow }
procedure TMainWindow.DoPaint(Sender: TObject);
var
i, j, interpolation: Integer;
begin
{ Draws rulers }
Canvas.MoveTo(25, 25 );
Canvas.LineTo(25, 275);
Canvas.LineTo(275, 275);
{ Draws 12 points and the interpolation between them }
for i := 0 to 11 do
begin
Canvas.Ellipse(i * 20 + 25 + 1, NormalizeNoise(IntNoise(i)) + 1,
i * 20 + 25 - 1, NormalizeNoise(IntNoise(i)) - 1);
if (i = 11) then Continue;
for j := 1 to 19 do
begin
case SelectInterpolation.ItemIndex of
0: interpolation := NormalizeNoise(Linear_Interpolate(IntNoise(i), IntNoise(i + 1), j / 20));
1: interpolation := NormalizeNoise(Cosine_Interpolate(IntNoise(i), IntNoise(i + 1), j / 20));
else
interpolation := NormalizeNoise(Cubic_Interpolate(IntNoise(i - 1),
IntNoise(i), IntNoise(i + 1), IntNoise(i + 2), j / 20));
end;
Canvas.Pixels[i * 20 + 25 + j, interpolation] := clBlack;
end;
end;
end;
procedure TMainWindow.DoRefresh(Sender: TObject);
begin
Repaint;
end;
function TMainWindow.NormalizeNoise(x: Double): Integer;
begin
Result := Round( 25 + (x + 1.0) * 125 );
end;
constructor TMainWindow.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Position := poScreenCenter;
Width := 300;
Height := 300;
Caption := 'Noise 1D';
OnPaint := DoPaint;
SelectInterpolation := TComboBox.Create(Self);
SelectInterpolation.Parent := Self;
SelectInterpolation.Items.Add('Linear Interpolation');
SelectInterpolation.Items.Add('Cosine Interpolation');
SelectInterpolation.Items.Add('Cubic Interpolation');
SelectInterpolation.Left := 100;
SelectInterpolation.Width := 200;
SelectInterpolation.ItemIndex := 0;
SelectInterpolation.OnChange := DoRefresh;
end;
destructor TMainWindow.Destroy;
begin
inherited Destroy;
end;
begin
Application.Initialize;
Application.CreateForm(TMainWindow, vMainWindow);
Application.Run;
end.