AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi 3D Matrix darstellen
Thema durchsuchen
Ansicht
Themen-Optionen

3D Matrix darstellen

Ein Thema von runger · begonnen am 27. Nov 2005 · letzter Beitrag vom 29. Nov 2005
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#11

Re: 3D Matrix darstellen

  Alt 27. Nov 2005, 14:44
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;
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#12

Re: 3D Matrix darstellen

  Alt 27. Nov 2005, 16:51
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]
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
runger
(Gast)

n/a Beiträge
 
#13

Re: 3D Matrix darstellen

  Alt 28. Nov 2005, 06:49
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
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#14

Re: 3D Matrix darstellen

  Alt 29. Nov 2005, 10:47
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#15

Re: 3D Matrix darstellen

  Alt 29. Nov 2005, 11:58
Jo auf dem Z1013 wird das wohl etwas eng , aber auf einem 512MB Rechner aufwärts...
Allerdings spricht da schon wirklich vieles dafür sich mal mit Speicherhashtables zu befassen.

Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 07:42 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