Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Drahtgitteroptimierung evtl. mit Baumstruktur. Wie?

  Alt 14. Jan 2004, 19:22
Delphi-Quellcode:
type
  TVertex = record
    x,
    y,
    z : double;
  end;

  TOBJFace = record
    num : Integer;
    x,
    y,
    z : double;
  end;
Methode zum File-Schreiben:
Delphi-Quellcode:
procedure WriteOBJ(const coords: TVertex);
var Fnum, c, ed : Byte;
    PolyVertex : TVertex;
begin
  TestFileSize;

  Fnum := DeterminPolyCount;
  if Fnum > 0 then
   begin
     for c := 1 to Fnum+1 do
      begin
        MakePolygonIndex(c);
        for ed := 1 to 3 do
         begin
           PolyVertex := MakeWorldCoords(Edges[ind[ed]], coords);
           WriteLn(f, 'v ' + FloatToStrF(PolyVertex.x*10, ffFixed, 16, 3, fset) + ' ' +
                             FloatToStrF(PolyVertex.y*10, ffFixed, 16, 3, fset) + ' ' +
                             FloatToStrF(PolyVertex.z*10, ffFixed, 16, 3, fset));
         end; // ed-Loop
       WriteLn(f, 'f ',cf,'/',cf,' ',cf+1,'/',cf+1,' ',cf+2,'/',cf+2,'');
       inc(cf, 3);
       inc(cf2, 3);
      end; // c-Loop
   end; // If Fnum > 0
end;
Ich habe immer eine Ebene von Würfeln, die die Punkte enthalten (array), allerdings erst noch über einen internen Index. Also muss ich erst noch die "Weltkoordinaten" bestimmen - das bläht den Code so auf. Ferner nehme ich mir jeden Würfel einzeln vor, und schaue nach, wie viele Flächen in ihm errechnet wurden. Es sind IMMER Dreiecke. Dann nehme ich mir eine jede Fläche, und bestimme die Weltkoordinaten der zugehörigen Punkte (anhand von Daten, die hier nicht ersichtlich sind. Nicht wirklich relevant.). Diese werden nacheinander in das File geschrieben, und über das gesamte Drahtgitter mitgezählt. Danach schreibe ich mit der Zeile:
WriteLn(f, 'f ',cf,'/',cf,' ',cf+1,'/',cf+1,' ',cf+2,'/',cf+2,'');
Die Flächendefinition direkt unter die Deklaration der 3 Vertices.
(Das Gedönse mit 'cf' und so kommt deshalb zu stande, weil ich der Größe wegen schon die Ausgabe in mehrere Files splitten muss! Und die Vertex-Zählung beginnt für jedes File von neuem.

... ein kleiner Copy&Paste aus meinem Code

Das an sich ist nicht das Problem!

Zitat von choose:
Wenn Fläche nicht in AusgebeFlächen
erstelle neue Fläche g
Für jeden Punkt p in f
q:= findeOderErzeugePunkt in AusgabePunkte
füge q zu g hinzu
füge g den Ausgabeflächen hinzu
Die fetten Zeilen sind das eigentlich Problem. Ich habe über 1mio Punkte, die ich ALLE auf Redundanz testen müsste. Das ist schon ressourcentechnisch hart an der Grenze, von Rechenzeit mal ganz abgesehen

Von daher dachte ich an eine Baumstruktur, wo jeder Node (=Vertex) auf seine "Mit-Flächen-Erzeuger" zeigt, und ich rekursiv absuche, ab einem Startpunkt, welche Koordinaten zu welcher Fläche gehören. Allerdings entsteht ein Zeiger-Loop, da in einem Dreieck ja jeder Punkt eine Verbindung zu seinen beiden Mitstreitern hat. Somit würde man "im Kreis pointern", und die Rekursion läuft bis in alle Tage...


Sorry, die erste Erklärung war wohl doch etwas knapp in den Details. Es geht letztenendes um das "Marching Cube"-Verfahren, daher die Unterteilung in virtuelle Würfel. Das ist aber für das Problem an sich nicht maßgebend, aber vielleicht hilfreich zu wissen


Dank'schö schonmal, und nochmal,
dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat