![]() |
Re: 3D Matrix darstellen
Jupp, auf den Link von marabu wollte ich auch gerade verweisen.
"3D" Darstellung von Wutrzel aus (x*y)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Matrix: Array [0..100, 0..100] of single; i,x,y: integer; begin // Werte schreiben. (Initzialisierung) for x:=0 to 100 do for y:=0 to 100 do Matrix[x,y]:= sqrt(x * y); // Zeichnen "3D" (1.5 ist ein Zoomwert da werte sonst so klein) for y:=100 downto 0 do begin for x:=0 to 100 do begin Canvas.Pixels[200+x,100+y] := RGB(round(Matrix[x,y]), round(Matrix[x,y]), round(Matrix[x,y])); Canvas.Pixels[round(400+x+i),round(100+y)-Round(Matrix[x,y]*1.5)] := RGB(round(Matrix[x,y]), round(Matrix[x,y]), round(Matrix[x,y])); end; inc(i); end; end; |
Re: 3D Matrix darstellen
Das ganze nennt sich "Heightmap". und die darstellung ist eigentlich ganz einfach. hier mal der OpenGL-Teil für die Displayliste:
Delphi-Quellcode:
hier wird immer ein quad, bestehend aus zwei dreiecken gerendert.
type Single2dArray = array of array of single;
function BuildDL(heightmap: Single2dArray; scalexy,scalez:single): integer; var i,k,t:integer; begin result := glGenLists(1); //eine DL, bitte! glNewlist(result, GL_COMPILE); //jetzt gehts los! t := round((length(heightmap) div 2) * scalexy); gltranslatef(-t,-t,0); // In die Mitte verschieben glbegin(gl_triangles); glcolor3f(255,0,0); for i:=1 to length(heightmap)-2 do // ich greife auch auf i-1 und i+1 zu! for k := 1 to length(heightmap[i])-2 do // ich greife auch auf k-1 und k+1 zu! begin //erstes dreieck glVertex3f(i * scalexy, k * scalexy, heightmap[i,k] * scalez); glVertex3f((i-1) * scalexy, (k) * scalexy, heightmap[i-1,k] * scalez); glVertex3f(i * scalexy, (k+1) * scalexy, heightmap[i,k+1] * scalez); //zweites dreieck glVertex3f((i-1) * scalexy, k * scalexy, heightmap[i-1,k] * scalez); glVertex3f((i-1) * scalexy, (k-1) * scalexy, heightmap[i-1,k-1] * scalez); glVertex3f((i+1) * scalexy, (k+1) * scalexy, heightmap[i+1,k+1] * scalez); end; glend; glcolor3f(255,255,255); glEndList; end; durch glCallist() mit dem rückgabewert der funktion lässt sich das dann auch flott rendern. es gibt noch die interessante funktion ![]() [edit=Luckie]Auf Wunsch Code ausgetuascht. Mfg, Luckie[/edit] |
Re: 3D Matrix darstellen
Hallo,
ich danke euch beiden für die Beiträge. Der Beitrag von Turbopascal hilft mir nicht weiter, soweit waren wir auch schon. Ausserdem hat das mit hidden surface und hidden line nichts zu tun. Den zweiten Beitrag find ich interessant, werde das Ganze Heute noch ausprobieren. Das eine Problem ist die 3D Darstellung, das Andere das interpolieren. Wir müssen eine 10000*10000 Matrix auf den Bildschirm oder eventuell, wenn garnicht anders möglich auf dem Printer darstellen. Das Ganze dient zum berechnen elektrischer Felder in Kondensatoren. Die hohe Auflösung ist wichtig um den mechanischen Aufbau zu optimieren. Rainer |
Re: 3D Matrix darstellen
Zitat:
Wenn Du eine vernünftige Darstellung brauchst must du eine 3D Umgebung schaffen, in der du dann das 2D-Feld mit Höhenangaben zeichnen kannst. Zitat:
Zitat:
also 100.000.000 * 8 Bytes (Real) = 800.000.000 Bytes = 781249,9 KB = 762,93 MB ! also 100.000.000 * 4 Bytes (Single) = 400.000.000 Bytes = 390624,9 KB = 381.46 MB ! Ist ein bissel viel für Delphi. Eine Darstellung von 5000*5000 of Single sind ca 95 MB. Oder hab ich mich verrechnet. :gruebel: |
Re: 3D Matrix darstellen
Jo auf dem Z1013 wird das wohl etwas eng :mrgreen:, aber auf einem 512MB Rechner aufwärts...
Allerdings spricht da schon wirklich vieles dafür sich mal mit Speicherhashtables zu befassen. Grüße // Martin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz