Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 3D Matrix darstellen (https://www.delphipraxis.net/57825-3d-matrix-darstellen.html)

runger 27. Nov 2005 12:32


3D Matrix darstellen
 
Hallo,

wir müssen 3D Felder darstellen. Es existiert eine 10000 * 10000 Matrix.
In jedem Wert steht ein Wert der einem Potential an einer bestimmten Stelle eines Feldes entspricht. Wir haben alles mögliche ausprobiert, sogar OpenGL. Aber eine befriedigende Lösung haben wir nicht gefunden.
Das Ziel: 3D Matrix auf Bildschirm darstellen.

Rainer

turboPASCAL 27. Nov 2005 12:39

Re: 3D Matrix darstellen
 
Zitat:

Zitat von runger
Hallo,

wir müssen 3D Felder darstellen. Es existiert eine 10000 * 10000 Matrix.
In jedem Wert steht ein Wert der einem Potential an einer bestimmten Stelle eines Feldes entspricht. Wir haben alles mögliche ausprobiert, sogar OpenGL. Aber eine befriedigende Lösung haben wir nicht gefunden.
Das Ziel: 3D Matrix auf Bildschirm darstellen.

Rainer

:gruebel: und wo die Tiefe "Z"

Delphi-Quellcode:
var
Matrix: Array [0..10000-1,0..10000-1, 0..10000-1] of ...
Was soll denn wie dargestellt werden ?

runger 27. Nov 2005 12:44

Re: 3D Matrix darstellen
 
Hallo,

erklärt sich von selbst array[1..10000,1..10000] of real;
Klar wo z steht?
Darstellung als 3D Bild.

Rainer

faux 27. Nov 2005 12:46

Re: 3D Matrix darstellen
 
Zitat:

Zitat von runger
Hallo,
erklärt sich von selbst array[1..10000,1..10000] of real;
Klar wo z steht?
Darstellung als 3D Bild.
Rainer

Du deklarierst aber nur eine 2D Matrix. Wie willst du die 3. Dimension darstellen?

Grüße
Faux

runger 27. Nov 2005 12:48

Re: 3D Matrix darstellen
 
Hallo

zu jedem x,y gehört ein dritter Wert der in der Matrix steht.

Matrix[23,25]:=100;
x --> 23
y --> 25
z --> 100

ist doch easy oder? Das ist eine 3D Matrix.

Rainer

Der_Unwissende 27. Nov 2005 12:52

Re: 3D Matrix darstellen
 
Zitat:

Zitat von runger
Hallo,
Wir haben alles mögliche ausprobiert, sogar OpenGL. Aber eine befriedigende Lösung haben wir nicht gefunden.
Das Ziel: 3D Matrix auf Bildschirm darstellen.

Woran genau seit ihr denn gescheitert? Bzw. was wäre befriedigend?

Gruß Der Unwissende

sniper_w 27. Nov 2005 12:53

Re: 3D Matrix darstellen
 
Zitat:

Das ist eine 3D Matrix.
Nein. DAS ist eine 2D Matrix. Du hast x, y und WERT an der Stelle von x, y.

turboPASCAL 27. Nov 2005 12:54

Re: 3D Matrix darstellen
 
Naja, das ist ja eher Pseudo 3D. ;)

Wichtig ist, was du darstellen möchtest. Ein 3D-Object ?

So wie du es mit der Matrix jetzt hast lässt sich zB. eine Fläche mit Höhenangaben anzeigen oder nur bestimmte Punkte.

runger 27. Nov 2005 12:57

Re: 3D Matrix darstellen
 
Hallo sniper_w

ich hab keine Lust darüber zu debattieren.
das ist eine Funktion f(x,y)=.....
Das Ganze stellt eine Funktion im 3 dimensionalen Raum dar. Deshalb 3D Matrix.

Reichen würde uns eine Gitterdarstellung mit hidden line oder hidden surface.
( Ich will aber nicht diskutieren was das ist. )

Rainer

marabu 27. Nov 2005 13:26

Re: 3D Matrix darstellen
 
Hallo Rainer,

schau mal, ob du damit etwas anfangen kannst: Surface 3D von Earl F. Glynn

Freundliche Grüße vom marabu

turboPASCAL 27. Nov 2005 13:44

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;

DGL-luke 27. Nov 2005 15:51

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:
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;
hier wird immer ein quad, bestehend aus zwei dreiecken gerendert.

durch glCallist() mit dem rückgabewert der funktion lässt sich das dann auch flott rendern.

es gibt noch die interessante funktion glpolygonmode(), mit der man den gittermodus ein-/auschalten kann.

[edit=Luckie]Auf Wunsch Code ausgetuascht. Mfg, Luckie[/edit]

runger 28. Nov 2005 05:49

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

turboPASCAL 29. Nov 2005 09:47

Re: 3D Matrix darstellen
 
Zitat:

Zitat von runger
Der Beitrag von turboPascal hilft mir nicht weiter, soweit waren wir auch schon.

Das ist und bleibt ja nun mal ein Beispiel für die Darstellung von "Pseudo 3D".

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:

Ausserdem hat das mit hidden surface und hidden line nichts zu tun. [...]

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.
Das wäre im ersten Beitrag eine grosse Hilfe gewesen.

Zitat:

Es existiert eine 10000 * 10000 Matrix [...]
array[1..10000,1..10000] of real;
10.000 * 10.000 = 100.000.000

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:

mschaefer 29. Nov 2005 10:58

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 00:11 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