unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Kep3d: TPaintBox;
Alaprajz: TPaintBox;
procedure AlaprajzMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure AlaprajzPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Kep3dPaint(Sender: TObject);
private
public
end;
type T2dtargyak = class(TObject)
private
public
pontjaitomb: array [0..7,0..2] of integer;
pontjaidb: byte;
neve: string;
end;
var
Form1: TForm1;
regiform1szel,regiform1mag,regikep3dszel,regikep3dmag: word;
targy2ddb: integer;
a2dtargyak: array of T2dtargyak;
implementation
{$R *.lfm}
{ TForm1 }
procedure egy2dtargylerako(nev: string; xh: integer; yh: integer);
begin
setlength(a2dtargyak,targy2ddb+1);
a2dtargyak[targy2ddb]:=T2dtargyak.create;
a2dtargyak[targy2ddb].neve:=nev;
case nev of
'kocka': begin //These are the coordinates of the cube (kocka)
a2dtargyak[targy2ddb].pontjaidb:=8;
a2dtargyak[targy2ddb].pontjaitomb[0,0]:=xh; //1. point (bottom left corner down)
a2dtargyak[targy2ddb].pontjaitomb[0,1]:=yh; //Y, height now
a2dtargyak[targy2ddb].pontjaitomb[0,2]:=yh; //Z
a2dtargyak[targy2ddb].pontjaitomb[1,0]:=a2dtargyak[targy2ddb].pontjaitomb[0,0]+14; //2. point (bottom right corner down)
a2dtargyak[targy2ddb].pontjaitomb[1,1]:=a2dtargyak[targy2ddb].pontjaitomb[0,1];
a2dtargyak[targy2ddb].pontjaitomb[1,2]:=a2dtargyak[targy2ddb].pontjaitomb[0,2];
a2dtargyak[targy2ddb].pontjaitomb[2,0]:=a2dtargyak[targy2ddb].pontjaitomb[0,0]+14; //4. point (upper right corner down)
a2dtargyak[targy2ddb].pontjaitomb[2,1]:=a2dtargyak[targy2ddb].pontjaitomb[0,1];
a2dtargyak[targy2ddb].pontjaitomb[2,2]:=a2dtargyak[targy2ddb].pontjaitomb[0,2]-14;
a2dtargyak[targy2ddb].pontjaitomb[3,0]:=a2dtargyak[targy2ddb].pontjaitomb[0,0]; //3. point (upper left corner down)
a2dtargyak[targy2ddb].pontjaitomb[3,1]:=a2dtargyak[targy2ddb].pontjaitomb[0,1];
a2dtargyak[targy2ddb].pontjaitomb[3,2]:=a2dtargyak[targy2ddb].pontjaitomb[0,2]-14;
a2dtargyak[targy2ddb].pontjaitomb[4,0]:=a2dtargyak[targy2ddb].pontjaitomb[0,0]; //5. point (bottom left corner up)
a2dtargyak[targy2ddb].pontjaitomb[4,1]:=a2dtargyak[targy2ddb].pontjaitomb[0,1]+14;
a2dtargyak[targy2ddb].pontjaitomb[4,2]:=a2dtargyak[targy2ddb].pontjaitomb[0,2];
a2dtargyak[targy2ddb].pontjaitomb[5,0]:=a2dtargyak[targy2ddb].pontjaitomb[0,0]+14; //6. point (bottom right corner up)
a2dtargyak[targy2ddb].pontjaitomb[5,1]:=a2dtargyak[targy2ddb].pontjaitomb[0,1]+14;
a2dtargyak[targy2ddb].pontjaitomb[5,2]:=a2dtargyak[targy2ddb].pontjaitomb[0,2];
a2dtargyak[targy2ddb].pontjaitomb[6,0]:=a2dtargyak[targy2ddb].pontjaitomb[0,0]+14; //8. point (upper right corner up)
a2dtargyak[targy2ddb].pontjaitomb[6,1]:=a2dtargyak[targy2ddb].pontjaitomb[0,1]+14;
a2dtargyak[targy2ddb].pontjaitomb[6,2]:=a2dtargyak[targy2ddb].pontjaitomb[0,2]-14;
a2dtargyak[targy2ddb].pontjaitomb[7,0]:=a2dtargyak[targy2ddb].pontjaitomb[0,0]; //7. point (upper left corner up)
a2dtargyak[targy2ddb].pontjaitomb[7,1]:=a2dtargyak[targy2ddb].pontjaitomb[0,1]+14;
a2dtargyak[targy2ddb].pontjaitomb[7,2]:=a2dtargyak[targy2ddb].pontjaitomb[0,2]-14;
end;
end;
inc(targy2ddb,1);
end;
procedure TForm1.FormResize(Sender: TObject);
var ablakxszazalek,ablakyszazalek: real;
i: integer;
j: byte;
begin
Kep3d.left:=8;
Kep3d.top:=8;
//Kep3d.width:=regikep3dszel*round(Form1.width/regiform1szel);
//Kep3d.height:=regikep3dmag*round(Form1.height/regiform1mag);
ablakxszazalek:=(100*Form1.width)/regiform1szel;
ablakyszazalek:=(100*Form1.height)/regiform1mag;
Kep3d.width:=round((regikep3dszel*ablakxszazalek)/100);
Kep3d.height:=round((regikep3dmag*ablakyszazalek)/100);
//
Alaprajz.left:=Kep3d.left+Kep3d.width+8;
Alaprajz.top:=Kep3d.top;
Alaprajz.width:=Kep3d.width;
Alaprajz.height:=Kep3d.height;
//
regiform1szel:=Form1.width;
regiform1mag:=Form1.height;
regikep3dszel:=Kep3d.width;
regikep3dmag:=Kep3d.height;
//
for i:=0 to targy2ddb-1 do
begin //Recalculating the coordinates of 2D object when resizing window:
for j:=0 to a2dtargyak[i].pontjaidb-1 do
begin
a2dtargyak[i].pontjaitomb[j,0]:=round((a2dtargyak[i].pontjaitomb[j,0]*ablakxszazalek)/100);
a2dtargyak[i].pontjaitomb[j,1]:=round((a2dtargyak[i].pontjaitomb[j,1]*ablakyszazalek)/100);
a2dtargyak[i].pontjaitomb[j,2]:=round((a2dtargyak[i].pontjaitomb[j,2]*ablakyszazalek)/100);
end;
end;
end;
procedure TForm1.Kep3dPaint(Sender: TObject);
begin
Kep3d.color:=clGreen;
Kep3d.canvas.fillrect(0,0,Kep3d.width,Kep3d.height);
//This PaintBox will draw the 3D cube later.
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
regiform1szel:=Form1.width; //Old Form1 width
regiform1mag:=Form1.height; //and height.
regikep3dszel:=Kep3d.width;
regikep3dmag:=Kep3d.height;
targy2ddb:=0;
end;
procedure TForm1.AlaprajzPaint(Sender: TObject);
var i: integer;
j:byte;
begin
Alaprajz.color:=clBlue;
Alaprajz.canvas.fillrect(0,0,Alaprajz.width,Alaprajz.height);
Alaprajz.canvas.pen.color:=clBlack;
Alaprajz.canvas.pen.width:=2;
for i:=0 to targy2ddb-1 do
begin
for j:=0 to a2dtargyak[i].pontjaidb-1 do
begin
if j<a2dtargyak[i].pontjaidb-1 then
canvas.Line(Alaprajz.left+a2dtargyak[i].pontjaitomb[j,0],Alaprajz.top+a2dtargyak[i].pontjaitomb[j,2],Alaprajz.left+a2dtargyak[i].pontjaitomb[j+1,0],Alaprajz.top+a2dtargyak[i].pontjaitomb[j+1,2])
else
canvas.Line(Alaprajz.left+a2dtargyak[i].pontjaitomb[j,0],Alaprajz.top+a2dtargyak[i].pontjaitomb[j,2],Alaprajz.left+a2dtargyak[i].pontjaitomb[0,0],Alaprajz.top+a2dtargyak[i].pontjaitomb[0,2]);
end;
end;
end;
procedure TForm1.AlaprajzMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (X>0) and (X<Alaprajz.width) and (Y>0) and (Y<Alaprajz.height) then
begin
egy2dtargylerako('kocka',X,Y); //Here we place a 2D rectangle:
Alaprajz.invalidate;
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
var pt: Tpoint;
begin
pt:=ScreenToClient(mouse.cursorpos);
canvas.textout(1,Form1.height-20,inttostr(Form1.width)+'-'+inttostr(Alaprajz.left)+'-'+inttostr(mouse.cursorpos.X)+'-'+inttostr(pt.X)+'-'+inttostr(targy2ddb));
end;
end.