Hallo Leute!
Im Zuge meiner Informatik-Facharbeit Jgst. 12 habe ich die Aufgabe bekommen mit Delphi den Hidden-Lines-Algorithmus zu programmieren. Als ich das Thema bekommen habe, war ich erstmal etwas perplex, da wir in Delphi zuvor nie viel mehr als ein paar simple Canvas-Spielereien gemachth haben. Aber ich habe jetzt mal angefangen mich dieser Thematik anzunehmen. Erstmal habe ich die Umwandlung von dreidimensionalen Koordinaten auf 2-dimensionale Koordinaten geschrieben. Desweiteren habe ich schon mal ein bisschen mit Verbindungen der Punkte rumgespielt, aber ich denke die ganz normale LineTo-Methode ist nicht sehr geeignet für das was ich vorhabe oder? Da wäre ja viel zu viel Rechenaufwand mit verbunden. Es wäre sicherlich einfacher die Punkte bzw. die zu zeichnenden Polygone vorzusotieren und dann nacheinander übermalen zu lassen. Geritten von dieser Idee habe ich mir mal den Polygon-Befehl angeguckt, aber steige da noch nicht ganz durch, da ich ja dafür irgendwie ein TPoint-Array benutzen muss. Aber über die globale Deklarieung des selbigen komme ich auch garnicht raus. Das Handbuch bzw. die Hilfe gibt da auch nicht sehr viel her. Ich hänge euch mal meinen Code an, ich hoffe ihr steigt da so weit durch, ist bestimmt ein Horror für euch, denn ich bin ungeübt im programmieren muss ich sagen! Bin für alle Tipps dankbar, nicht nur die zum Polygon-Zeichnen, sondern auch was Lesbarkeit, Redundanz, etc. angeht könnt ihr kritisieren was das Zeug hält!
Delphi-Quellcode:
var
Form1: TForm1;
x,xp,y,yp,z,d,h,a:integer;
Ko_X:array [1..100] of Real;
Ko_Y:array [1..100] of Real;
Ko_Z:array [1..100] of Real;
Ko_Xp:array [1..100] of Real;
Ko_Yp:array [1..100] of Real;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
a:=Trunc(Image1.Width/2); // Verschiebt den Ursprung des Koordinatensystems auf der Leinwand
d:=StrToInt(Edit1.Text); // Beschreibt den Abstand des Betrachters zur Bildebene
h:=Trunc(Image1.Height/2); // Verschiebt den Ursprung des Koordinatensystems auf der Leinwand
// Koordinaten der Punkte des Würfels
Ko_X[1]:=(100);
Ko_Y[1]:=(100);
Ko_Z[1]:=(100);
Ko_X[2]:=(100);
Ko_Y[2]:=(100);
Ko_Z[2]:=(200);
Ko_X[3]:=(200);
Ko_Y[3]:=(100);
Ko_Z[3]:=(200);
Ko_X[4]:=(200);
Ko_Y[4]:=(100);
Ko_Z[4]:=(100);
Ko_X[5]:=(100);
Ko_Y[5]:=(200);
Ko_Z[5]:=(100);
Ko_X[6]:=(100);
Ko_Y[6]:=(200);
Ko_Z[6]:=(200);
Ko_X[7]:=(200);
Ko_Y[7]:=(200);
Ko_Z[7]:=(200);
Ko_X[8]:=(200);
Ko_Y[8]:=(200);
Ko_Z[8]:=(100);
with Image1.Canvas do
begin
{ Einstellen der Farbe, in der gezeichnet wird }
Brush.Color := clblack;
Pen.Color := clblack;
{ Umrechnen der gegebenen 3-dimensionalen Koordinaten
in 2-dimensionale Koordinaten auf der Bildebene }
for i:= 1 to 8 do
begin
Ko_Xp[i]:=a+(d/(d+Ko_Z[i]))*Ko_X[i];
Ko_Yp[i]:=h+(d/(d+Ko_Z[i]))*Ko_Y[i];
end;
i:=1;
// Kanten
for j:= 1 to 8 do
begin
moveto(Trunc(Ko_Xp[i]),Trunc(Ko_Yp[i]));
if i=4 then i:=0;
if i=8 then i:=4;
lineto(Trunc(Ko_Xp[i+1]),Trunc(Ko_Yp[i+1]));
if i=0 then i:=5;
i:=i+1;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
// Löschen der Bildebene
begin
with Image1.Canvas do
begin
Brush.Color := clwhite;
Pen.Color := clwhite;
rectangle(0,0,Trunc(Image1.Width),Trunc(Image1.Height));
end;
end;
end.
MfG
Behrendt