AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Hidden-Lines-Algorithmus
Thema durchsuchen
Ansicht
Themen-Optionen

Hidden-Lines-Algorithmus

Ein Thema von Behrendt · begonnen am 7. Feb 2008 · letzter Beitrag vom 3. Mär 2008
 
Behrendt

Registriert seit: 21. Jan 2008
Ort: Remscheid
7 Beiträge
 
Delphi 2005 Personal
 
#1

Hidden-Lines-Algorithmus

  Alt 7. Feb 2008, 16:55
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
Christian
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz