You are on page 1of 9

Facultad de Ciencias de la Computación

Docente

Laura Cuayahuitl Romero

Trabajo

Segundero

Estudiante

Joshua Nathaniel Tecamachaltzi Carmona

19 de noviembre de 2022
Código:
unit UCubo;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
TFcubo3d = class(TForm)
img: TImage;
pn1: TPanel;
Bzmenos: TButton;
Bzmas: TButton;
Bxmenos: TButton;
Bxmas: TButton;
Bymenos: TButton;
Bymas: TButton;
Bdib: TButton;
Blimp: TButton;
procedure FormCreate(Sender: TObject);
procedure IniciarFigura();
procedure EscalarFigura(Numx : Integer; Numy : Integer; NumZ : Integer);
procedure DibujarFigura(Sender : TObject);
procedure TrasladarMedioPantalla(Sender : TObject);
procedure BdibClick(Sender: TObject);
procedure Limpiar(Sender : TObject);
procedure RotarZmas(Sender : TObject);
procedure RotarZmenos(Sender : TObject);
procedure RotarXmas(Sender : TObject);
procedure RotarXmenos(Sender : TObject);
procedure RotarYmas(Sender : TObject);
procedure RotarYmenos(Sender : TObject);
procedure BzmenosClick(Sender: TObject);
procedure BzmasClick(Sender: TObject);
procedure BxmenosClick(Sender: TObject);
procedure BxmasClick(Sender: TObject);
procedure BymenosClick(Sender: TObject);
procedure BymasClick(Sender: TObject);
procedure BlimpClick(Sender: TObject);
procedure ProyParalela( x, y, z: Real; var xP, yP : Integer );
private
{ Private declarations }
public
{ Public declarations }
end;

type
TPoint3D = packed record
x : Real;
y : Real;
z : Real;
end;

var
Fcubo3d: TFcubo3d;
var
Cubo : Array [1..10] of TPoint3D;
P, Q : TPoint;
xaux, yaux, zaux : Real;
i, angulo : Integer;
alfa: Real;
xm, ym : Integer;
implementation

{$R *.dfm}

procedure TFcubo3d.FormCreate(Sender: TObject);


begin
IniciarFigura();
EscalarFigura(20, 20, 20);
TrasladarMedioPantalla(Sender);
angulo := 6;
end;

procedure TFCubo3d.IniciarFigura();
begin

Cubo[1].x := 1; Cubo[1].y := -1; Cubo[1].z := 1;


Cubo[2].x := 1; Cubo[2].y := 1; Cubo[2].z := 1;
Cubo[3].x := -1; Cubo[3].y := 1; Cubo[3].z := 1;
Cubo[4].x := -1; Cubo[4].y := -1; Cubo[4].z := 1;
//Cara Trasera
Cubo[5].x := 1; Cubo[5].y := -1; Cubo[5].z := -1;
Cubo[6].x := 1; Cubo[6].y := 1; Cubo[6].z := -1;
Cubo[7].x := -1; Cubo[7].y := 1; Cubo[7].z := -1;
Cubo[8].x := -1; Cubo[8].y := -1; Cubo[8].z := -1;
end;

procedure TFcubo3d.BdibClick(Sender: TObject);


begin
Limpiar(Sender);
DibujarFigura(Sender);
end;

procedure TFcubo3d.BlimpClick(Sender: TObject);


begin
IniciarFigura();
EscalarFigura(20, 20, 20);
TrasladarMedioPantalla(Sender);
angulo := 6;
Limpiar(Sender);
end;

procedure TFcubo3d.BxmasClick(Sender: TObject);


begin
Limpiar(Sender);
RotarXmas(Sender);
end;

procedure TFcubo3d.BxmenosClick(Sender: TObject);


begin
Limpiar(Sender);
RotarXmenos(Sender);
end;

procedure TFcubo3d.BymasClick(Sender: TObject);


begin
Limpiar(Sender);
RotarYmas(Sender);
end;

procedure TFcubo3d.BymenosClick(Sender: TObject);


begin
Limpiar(Sender);
RotarYmenos(Sender);
end;
procedure TFcubo3d.BzmasClick(Sender: TObject);
begin
Limpiar(Sender);
RotarZmas(Sender);
end;

procedure TFcubo3d.BzmenosClick(Sender: TObject);


begin
Limpiar(Sender);
RotarZmenos(Sender);
end;

procedure TFcubo3d.ProyParalela(x: Real; y: Real; z: Real; var xP: Integer; var yP: Integer);
begin
xP := Round( x ) + xm;
yP := Round( y ) + ym;
end;

procedure TFCubo3d.DibujarFigura(Sender: TObject);


begin

img.Canvas.Pen.Color := clblue;
img.Canvas.Brush.Color := clblue;
for i := 5 to 8 do
begin
if i = 8 then
begin
ProyParalela( Cubo[i].x, Cubo[i].y, Cubo[i].z, P.x, P.y );
ProyParalela( Cubo[5].x, Cubo[5].y, Cubo[5].z, Q.x, Q.y );
img.Canvas.MoveTo(P.X, P.Y);
img.Canvas.LineTo(Q.X, Q.Y);
end
else
begin
ProyParalela( Cubo[i].x, Cubo[i].y, Cubo[i].z, P.x, P.y );
ProyParalela( Cubo[i+1].x, Cubo[i+1].y, Cubo[i+1].z, Q.x, Q.y );
img.Canvas.MoveTo(P.X, P.Y);
img.Canvas.LineTo(Q.X, Q.Y);
end;
end;
img.Canvas.Pen.Color := clblack;
img.Canvas.Brush.Color := clblack;
img.Canvas.Pen.Color := clred;
img.Canvas.Brush.Color := clred;
for i := 1 to 4 do
begin
if i = 4 then
begin
ProyParalela( Cubo[i].x, Cubo[i].y, Cubo[i].z, P.x, P.y );
ProyParalela( Cubo[1].x, Cubo[1].y, Cubo[1].z, Q.x, Q.y );
img.Canvas.MoveTo(P.X, P.Y);
img.Canvas.LineTo(Q.X, Q.Y);
end
else
begin
ProyParalela( Cubo[i].x, Cubo[i].y, Cubo[i].z, P.x, P.y );
ProyParalela( Cubo[i+1].x, Cubo[i+1].y, Cubo[i+1].z, Q.x, Q.y );
img.Canvas.MoveTo(P.X, P.Y);
img.Canvas.LineTo(Q.X, Q.Y);
end;

end;
img.Canvas.Pen.Color := clblack;
img.Canvas.Brush.Color := clblack;

img.Canvas.Pen.Color := clgreen;
img.Canvas.Brush.Color := clgreen;
for i := 1 to 4 do
begin
ProyParalela( Cubo[i].x, Cubo[i].y, Cubo[i].z, P.x, P.y );
ProyParalela( Cubo[i+4].x, Cubo[i+4].y, Cubo[i+4].z, Q.x, Q.y );
img.Canvas.MoveTo(P.X, P.Y);
img.Canvas.LineTo(Q.X, Q.Y);
end;
img.Canvas.Pen.Color := clblack;
img.Canvas.Brush.Color := clblack;
end;

procedure TFCubo3d.Limpiar(Sender: TObject);


begin
img.Canvas.Brush.Color := ClWhite;
img.Canvas.Pen.Color := ClWhite;
Img.Canvas.Rectangle(0, 0, img.Width, img.Height);
end;
procedure TFcubo3d.EscalarFigura(Numx : Integer; Numy : Integer; NumZ : Integer);
var
Sx, Sy, Sz : Integer;
begin
Sx := Numx;
Sy := NumY;
Sz := NumZ;
for i := 1 to 8 do
begin
Cubo[i].X := Cubo[i].X * Sx;
Cubo[i].Y := Cubo[i].Y * Sy;
Cubo[i].Z := Cubo[i].z * Sz;
//Showmessage('X: ' + InttoStr(Cubo[i].x) + 'Y: ' + InttoStr(Cubo[i].y));
end
end;

procedure TFCubo3d.TrasladarMedioPantalla(Sender: TObject);


begin
Xm := round((img.Width)/(2));
Ym := round((img.Height)/(2));
end;

procedure TFcubo3d.RotarZmas(Sender: TObject);


begin
alfa := ((angulo*PI)/(180));
for i := 1 to 8 do
begin
xaux := Cubo[i].X * cos(-alfa) + Cubo[i].y * sin(-alfa);
yaux := -Cubo[i].X * sin(-alfa) + Cubo[i].Y * cos(-alfa);
Cubo[i].X := Round(xaux);
Cubo[i].Y := Round(yaux);
end;
Limpiar(Sender);
DibujarFigura(Sender);
end;

procedure TFcubo3d.RotarZmenos(Sender: TObject);


begin
alfa := ((angulo*PI)/(180));
for i := 1 to 8 do
begin
xaux := Cubo[i].X * cos(alfa) + Cubo[i].y * sin(alfa);
yaux := -Cubo[i].X * sin(alfa) + Cubo[i].Y * cos(alfa);
Cubo[i].X := Round(xaux);
Cubo[i].Y := Round(yaux);
end;
DibujarFigura(Sender);
end;

procedure TFcubo3d.RotarXmas(Sender: TObject);


begin
alfa := ((angulo*PI)/(180));
for i := 1 to 8 do
begin
yaux := Cubo[i].Y * cos(alfa) + Cubo[i].Z * sin(alfa);
zaux := -Cubo[i].Y * sin(alfa) + Cubo[i].Z * cos(alfa);
Cubo[i].Z := Round(zaux);
Cubo[i].Y := Round(yaux);
end;
DibujarFigura(Sender);
end;

procedure TFcubo3d.RotarXmenos(Sender: TObject);


begin
alfa := ((angulo*PI)/(180));
for i := 1 to 8 do
begin
yaux := Cubo[i].Y * cos(-alfa) + Cubo[i].Z * sin(-alfa);
zaux := -Cubo[i].Y * sin(-alfa) + Cubo[i].Z * cos(-alfa);
Cubo[i].Z := Round(zaux);
Cubo[i].Y := Round(yaux);
end;
DibujarFigura(Sender);
end;

procedure TFcubo3d.RotarYmas(Sender: TObject);


begin
alfa := ((angulo*PI)/(180));
for i := 1 to 8 do
begin
Zaux := Cubo[i].Z * cos(alfa) + Cubo[i].X * sin(alfa);
Xaux := -Cubo[i].Z * sin(alfa) + Cubo[i].X * cos(alfa);
Cubo[i].X := Round(xaux);
Cubo[i].Z := Round(Zaux);
end;
DibujarFigura(Sender);
end;
procedure TFcubo3d.RotarYmenos(Sender: TObject);
begin
alfa := ((angulo*PI)/(180));
for i := 1 to 8 do
begin
Zaux := Cubo[i].Z * cos(-alfa) + Cubo[i].X * sin(-alfa);
Xaux := -Cubo[i].Z * sin(-alfa) + Cubo[i].X * cos(-alfa);
Cubo[i].X := Round(xaux);
Cubo[i].Z := Round(Zaux);
end;
DibujarFigura(Sender);
end;

end.

Link al video de ejecución:

https://youtu.be/PMlbWkiGAlY

You might also like