Dreidimensionale Funktionen

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
heizkoerper
Beiträge: 24
Registriert: Mo 1. Aug 2011, 14:39
OS, Lazarus, FPC: Windows XP und 7, L 0.9.31, FPC 2.4.4
CPU-Target: 32 und 64 Bit
Wohnort: Hannover
Kontaktdaten:

Dreidimensionale Funktionen

Beitrag von heizkoerper »

Hallo Lazarus-Freunde,

ich habe ein kleines Programm geschrieben, mit dem dreidimensionale Funktionen der Form z=f(x,y) dargestellt werden können.

Dieses ist eigentlich nicht schwierig.

Das eigentliche Problem ist es, dass die nicht sichtbaren Linien nicht mitgezeichnet werden.

Um dies zu unterdrücken, habe ich zwei verschiedene Versionen der Unterdrückung einprogrammiert.

Viel Spaß beim Ausprobieren des Programmes.

Gruß Heizkoerper
Dateianhänge
DreiD.zip
(129.79 KiB) 87-mal heruntergeladen

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Dreidimensionale Funktionen

Beitrag von MAC »

Hallo.
Das ist ein wirklich interessantes Programm, Respekt.

Hier einmal 2 verbesserungsforschläge:

1) Dein Programm zeichnen recht Langsam, das liegt nicht an dem PC, sondern daran, das nach jeder Linie das ganze Bild ausgegeben wird, danach wird noch eine Linie gezeichnet und das Bild wird ausgegeben, u.s.w. . Wenn man das so umschreibt das erst alle Linien gezeichnet und dann ausgegeben wird, so ist das Zeichnen um ein Vielfaches schneller ! Dafür sind nur zwei Zeilen Code in der Zeichenprocedure notwendig:

Code: Alles auswählen

With Image.Canvas Do
  Begin
   Image.Picture.Bitmap.BeginUpdate(True); // Die hier am Anfang des Zeichnens
   Pen.Color:=clWhite;Brush.Color:=clWhite;Font.Color:=clBlack;
   //...
   GitterZeichnen3D;
  Image.Picture.Bitmap.EndUpdate(); // Und die hier am schluss
  End;


2) Das ganze Programm könnte man noch mithilfe der Grafikkarte zeichnen lassen, dadurch musst du nur die 3 Dimensionalen Punkte eingeben und um das Zeichen, und alle 3D effekte kümmert sich die Grafikkarte. Das würde das ganze dann nochmal schneller machen, aber man müsste sich nen bisschen mit OpenGL auseinandersetzen... http://wiki.delphigl.com/index.php/Tutorial


Als Folge, da das Programm jetzt schneller zeichnet, könnte man noch ne Checkbox einbauen, mit einem Direktzeichenmodus. Also das nach jeder Änderung am Code direkt die Zeichenprozedur ausgerufen wird, und man nicht immer den ZeichnenButton drücken muss...

Ich hoffe da waren ein Paar hilfreiche Tipps dabei, viel Spaß noch mit deinem Programm.

Code: Alles auswählen

Signatur := nil;

heizkoerper
Beiträge: 24
Registriert: Mo 1. Aug 2011, 14:39
OS, Lazarus, FPC: Windows XP und 7, L 0.9.31, FPC 2.4.4
CPU-Target: 32 und 64 Bit
Wohnort: Hannover
Kontaktdaten:

Re: Dreidimensionale Funktionen

Beitrag von heizkoerper »

Vielen Dank für die Hinweise und Verbesserungsvorschläge,

ich habe das Unterdrücken von nicht sichtbaren Linien schon vor ca. 30 Jahren programmiert.

Damals hat die Ausgabe auf einem C64 oder einem der ersten PC's teilweise Stunden gedauert.

An ein sehr enges Netz war nur zu denken.

Mir sind die Begriffe OpenGL oder DirecktX geläufig.

Ich bin noch nicht dazu gekommen, diese Möglichkeiten auch in meinen Programmen zu nutzen.

Gruß Heizkoerper

heizkoerper
Beiträge: 24
Registriert: Mo 1. Aug 2011, 14:39
OS, Lazarus, FPC: Windows XP und 7, L 0.9.31, FPC 2.4.4
CPU-Target: 32 und 64 Bit
Wohnort: Hannover
Kontaktdaten:

Re: Dreidimensionale Funktionen

Beitrag von heizkoerper »

So, ich habe einige Tips in das Programm eingearbeitet.

Jetzt fehlt nur noch OpenGL...

Gruß Heizkoerper
Dateianhänge
DreiD.zip
(129.68 KiB) 90-mal heruntergeladen

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Dreidimensionale Funktionen

Beitrag von mschnell »

Ich habe vor einiger Zeit 'mal einige Tests gemacht, um die Grafik-Hardware dazu zu benutzen, um Zoom und Pan für ein 2-D Bild zu machen. Ich habe nicht direkt auf OpenGL aufgesetzt, sondern habe "SDL" als Layer dazwischen verwendet (Es gibt oder gab z.B "Jedi-SDL" für die Pascal-Anbindung von SDL).

Damit kann das Programm dann sowohl mit OpenGL als auch mit Direct-X laufen, weil SDL "nach unten" beide Grafik-Systeme alternativ ansprechen kann.

Ich vermute, für 3D geht so etwas auch.

Gruß,
-Michael

Antworten