Draw a rotating cube: Difference between revisions

Content added Content deleted
m (→‎{{header|Phix}}: IupCloseOnEscape no longer needed)
(Added Delphi example)
Line 605: Line 605:
}
}
}</lang>
}</lang>
=={{header|Delphi}}==
{{libheader| Winapi.Windows}}
{{libheader| Vcl.Graphics}}
{{libheader| Vcl.Controls}}
{{libheader| Vcl.Forms}}
{{libheader| Vcl.ExtCtrls}}
{{libheader| System.Math}}
{{libheader| System.Classes}}
{{Trans|Javascript}}
<lang Delphi>
unit main;

interface

uses
Winapi.Windows, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.ExtCtrls,
System.Math, System.Classes;

type
TForm1 = class(TForm)
tmr1: TTimer;
procedure FormCreate(Sender: TObject);
procedure tmr1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
nodes: TArray<TArray<double>> = [[-1, -1, -1], [-1, -1, 1], [-1, 1, -1], [-1,
1, 1], [1, -1, -1], [1, -1, 1], [1, 1, -1], [1, 1, 1]];
edges: TArray<TArray<Integer>> = [[0, 1], [1, 3], [3, 2], [2, 0], [4, 5], [5,
7], [7, 6], [6, 4], [0, 4], [1, 5], [2, 6], [3, 7]];

implementation

{$R *.dfm}

procedure Scale(factor: TArray<double>);
begin
if Length(factor) <> 3 then
exit;
for var i := 0 to High(nodes) do
for var f := 0 to High(factor) do
nodes[i][f] := nodes[i][f] * factor[f];
end;

procedure RotateCuboid(angleX, angleY: double);
begin
var sinX := sin(angleX);
var cosX := cos(angleX);
var sinY := sin(angleY);
var cosY := cos(angleY);

for var i := 0 to High(nodes) do
begin
var x := nodes[i][0];
var y := nodes[i][1];
var z := nodes[i][2];

nodes[i][0] := x * cosX - z * sinX;
nodes[i][2] := z * cosX + x * sinX;

z := nodes[i][2];

nodes[i][1] := y * cosY - z * sinY;
nodes[i][2] := z * cosY + y * sinY;
end;
end;

function DrawCuboid(x, y, w, h: Integer): TBitmap;
var
offset: TPoint;
begin
Result := TBitmap.Create;
Result.SetSize(w, h);
rotateCuboid(PI / 180, 0);
offset := TPoint.Create(x, y);
with Result.canvas do
begin
Brush.Color := clBlack;
Pen.Color := clWhite;

Lock;
FillRect(ClipRect);

for var edge in edges do
begin
var p1 := (nodes[edge[0]]);
var p2 := (nodes[edge[1]]);
moveTo(trunc(p1[0]) + offset.x, trunc(p1[1]) + offset.y);
lineTo(trunc(p2[0]) + offset.x, trunc(p2[1]) + offset.y);
end;
Unlock;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ClientHeight := 360;
ClientWidth := 640;
DoubleBuffered := true;
scale([100, 100, 100]);
rotateCuboid(PI / 4, ArcTan(sqrt(2)));
end;

procedure TForm1.tmr1Timer(Sender: TObject);
var
buffer: TBitmap;
begin
buffer := DrawCuboid(ClientWidth div 2, ClientHeight div 2, ClientWidth, ClientHeight);
Canvas.Draw(0, 0, buffer);
buffer.Free;
end;

end.</lang>
Resource Form
<lang Delphi>
object Form1: TForm1
OnCreate = FormCreate
object tmr1: TTimer
Interval = 17
OnTimer = tmr1Timer
end
end
</lang>



=={{header|EasyLang}}==
=={{header|EasyLang}}==