Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Fläche berechnen (https://www.delphipraxis.net/27562-flaeche-berechnen.html)

Eggimaa 12. Aug 2004 09:20


Fläche berechnen
 
Hallo Leute
Ich hab da mal wieder ein Problem.
Ich habe von einem 3D-Körper die Projektionen in die XY, XZ und YZ Ebene. (Parallelprojektion).
(als Grafik!!)
Wie kann ich nun jedem Punkt der Ebene XY seine Höhe Z zuordnen??
:?:

Danke für eure Hilfe

Alexander Roth 14. Aug 2004 08:38

Re: Fläche berechnen
 
Hab mich mit 3d Figuren noch nicht auseinandergesetzt. Vielleicht verstehe ich deine Frage auch nicht richtig, aber würde dir vielleicht ein 3d Array helfen?

menschjens 14. Aug 2004 09:01

Re: Fläche berechnen
 
Soll dein Programm aus 3 Grafik-Dateien (3 Ansichten eines Körpers) einen 3D-Körper erstellen? Verstehe ich dich da richtig? Das wäre dann nicht so einfach! Zeig mal ein Beispiel!

Jens

digleu 14. Aug 2004 16:42

Re: Fläche berechnen
 
bevor ich mir jetzt ein Blatt Papier nehme und anfange ein wenig mein, durch übermäßigen Genussmittelgenuß schon stark verdunkeltes, Wissen über Vektorrechnung rauszukrame möchte ich nur fragen ob ich dich richtig verstanden habe:
Du hast eine Grafik von der Projektion in die XY-Ebene. Sind die Punkte in dieser Ebene dann durchnummeriert und lassen sich in den anderen Projektionen so eindeutig zuordnen oder muss das das Programm auchnoch machen? Dann soll für jeden Punkt auf der XY-Grafik die zugehörige Z-Komponente berechnet werden. Hast du die Ebenen (bzw. die (Projektions-)Punkte auf diesen) denn schon als (2d)-Arrays vorliegen oder musst du auchnoch die Graphiken zu solchen umwandeln? Kann ich mal 3 Beispielgraphiken sehen??

lg Lars

Tabak 16. Aug 2004 22:54

Re: Fläche berechnen
 
Ich hab mal das hier gemacht und hoffe es kommt deinen Vorstellungen nahe: http://www.8ung.at/tabak/Delphi/Delphi.JPG
Mal angenommen du siehst nur Bild 1, dann ist es unmöglich zu sagen auf welcher "Höhe" sich der Punkt befindet, da man ja nicht mal erkennen kann ob er sich auf der Ober oder Unter-seite der Kugel befindet. Wie das auf einem "flachem" Gegenstand aussieht weiß ich nicht :gruebel: , aber vielleicht kann dir jetzt ein anderer weiter helfen...

dizzy 16. Aug 2004 23:42

Re: Fläche berechnen
 
[ot]Hey Tabak! Das sieht aus wie mein lieblings-C4D :thuimb:[/ot]

Zum Thema:
Hab grad google heftigst durchforstet und bin auf keine Standardlösung gestoßen.
Das wird wahrlich nicht einfach. Ein Problem ist z.B. dass du evtl. Feinstrukturen nicht mehr extrahieren kannst, die bei der Projektion unwiederbringlich verloren gegangen sind. Aber auch "nur" die 3 Ansichten zu vereinen ist nicht wirklich einfach, da du ja vermutlich eine (mathematisch) willkürliche Form vorliegen hast. Zudem ist bei einer Kugel das Verhalten von Flächen zu Volumina deutlich anders als z.B. bei Würfeln, und von daher kann's schwierig werden, da sich da keine allgemeine Gesetzmäßigkeit finden lässt.
Die einzige Möglichkeit besteht darin, aus den Projektionen wieder einen 3D-Körper zu machen. In diesem Fall einen Datenwürfel, also im Wesentlichen eine Voxel-Ansammlung. Dann kannst du die Voxel zählen (die Voxelauflösung müsste dann fest sein um ein Standardmaß zu erhalten), und die Anzahl der zum Körper gehörenden Voxel machen das Volumen aus.
Der eigentlich schwere Schritt ist die Berechnung eines Datenwürfels anhand der Seitenansichten - hab ich spontan keine Lösung für parat, aber das sollte sich (hoffe ich) mit etwas Hirnschmalz machen lassen.

Hoffe das hilft ein wenig,
dizzy

atreju2oo0 17. Aug 2004 08:59

Re: Fläche berechnen
 
Im allgemeinen braucht man für Oberflächenberechnungen im 3D oder mehr die Integralrechnung...
Da das sicherlich zu schwer wird musst Du auf Sonderfälle zurückführen. Bei einer Kugel
und Würfeln und so stehen die Formeln im Tafelwerk. Sobald Du jedoch unregelmäßige Körper hast brauchst Du genaues
Wissen über Splines, Bogendifferenzial und Umlaufintegrale. Sollte da noch Informationsbedarf bestehen hätte ich
noch ein paar Blätter von meinem Prof...

[edit] Nachdem ich das geschrieben hatte wird mir irgendwie klar das ich die Frage genau andersrum beantwortet hab! Sorry :| [/edit]

menschjens 17. Aug 2004 19:00

Re: Fläche berechnen
 
Also wenn ich dein Problem richtig verstehe, möchtest programmtechnisch aus 3 Parallelprojektionen (vermutlich Bitmap-Grafiken o.ä.) von (wie auch immer gearteten) Körpern ein 3D-Modell des Körpers generieren. Dabei stößt du auf die folgenden Probleme:

1. Du möchtest jedem Punkt der XY-Ebene einen Z-Wert zuordnen. Das ist so für Körper nicht machbar, da jedem Punkt der XY-Ebene immer mindestens 2 Z-Werte zugeordnet werden müssten (Ober- und Unterseite). Bei "eingestülpten" Körpern wären es sogar mehr als 2 (z.B. 4 oder 6...) Z-Werte.

2. Dein Programm müsste sich aus den einzelnen Ansichten die jeweils ablesbaren Koordinaten der einzelnen Oberflächenpunkte zusammensuchen. Aufgrund der Verdeckung großer Oberflächenabschnitte sind aber nur die wenigsten Punkte in allen 3 Ansichten zu sehen. Ausreichen würde auch, wenn jeder Punkt in mindestens 2 Ansichten sichtbar wäre, aber selbst das ist lange nicht bei allen Punkten der Fall. Dieses Problem würde sich einfacher gestalten, wenn der in den Ansichten dargestellte Körper ein "durchsichtiges" Netz wäre. Vielleicht ist das ja der Fall.

3. Für die Punkte, die man also in mindestens 2 Ansichten sieht, besteht jetzt noch das Problem, herauszufinden, wo sich ein Punkt der einen Ansicht in der 2. bzw. 3. Ansicht wiederfindet. Das ist für dich und mich relativ einfach, für dein Programm aber in den meisten Fällen sehr schwierig. Der Grund ist, dass die Punkte der Körperoberfläche sich vermutlich nicht sehr stark voneinander unterscheiden. Selbst, wenn der Körper kunterbunt ist, wird es deinem Programm sehr schwer fallen, z.B. einen hellroten Punkt in einer der anderen Ansichten zweifelsfrei wieder zu erkennen. Hierzu wären z.B. Programme mit künstlichen neuronalen Netzen in der Lage, da diese Oberflächenmuster wieder erkennen könnten. Problem dabei ist, dass diese Muster in den verschiedenen Ansichten
aus unterschiedlichen Richtungen auch unterschiedlich verzerrt zu sehen sind.

4. Wenn aber die Probleme 1 bis 3 gelöst wären, hättest du als ideales Ergebnis eine innen hohle 3D-Punktewolke. Also streng genommen noch immer keinen 3D-Körper. Aber ich will mal nicht noch weiter ins Detail gehen. Vielleicht hab ich ja auch deine Frage ganz falsch verstanden... :gruebel:

Zusammenfassend würde ich sagen, dass es - so wie ich deine Frage verstehe - wie ich schon sagte nicht so einfach ist. Aber frisch ans Werk! Einfach mit Problem 1 anfangen und dann langsam durchackern. :wink:

Gruß Jens

glkgereon 17. Aug 2004 19:44

Re: Fläche berechnen
 
hmm, versteh ich das problem nicht, oder wie?

das einzige problem ist ja wohl, aus den 3 graphiken die koordinaten rauszukriegen

danach isses einfach

hier meine lösung:

Delphi-Quellcode:
procedure get3Dpoints(pxy, pxz, pyz: array[1..2,1..1000]; var p3d: array[1..3,1..1000]);
var
i:integer;
begin
for i:=1 to 1000 do
  begin
  p3d[1,i]:=pxy[1,i];
  p3d[2,i]:=pxy[2,i];
  p3d[3,i]:=pxz[2,i];
  end;
end;
da brauch man sogar nur 2 projektionen...

das problem ist jetzt, die koordinaten zu kriegen, aber das ist ja kein mathematisches problem, sondern eher ein farb-erkennungsproblem...

man könnte das so in etwa machen:

Delphi-Quellcode:
function getpoints(bild:TPicture):array[1..2,1..1000];
var
i, j, panz:integer;
points:array[1..2,1..1000];
begin
for i:=1 to bild.width do                //breite
  for j:=1 to bild .heigth do            //höhe
    begin
    if bild.Pixels[i,j]:=clBlack         //wenn punkt bestandteil eines objektes
    then begin
         if    ((bild.Pixels[i-1,j]) xor (bild.Pixels[i+1,j]))
             or ((bild.Pixels[i,j-1]) xor (bild.Pixels[i,j+1]))
             or ((bild.Pixels[i-1,j-1]) xor (bild.Pixels[i+1,j+1]))
             or ((bild.Pixels[i+1,j-1]) xor (bild.Pixels[i-1,j+1]))
         then begin                       //Wenn die linie nicht gerade über den punkt verläuft
              panz:=panz+1;               //dann isser ein eckpunkt
              points[1,panz]:=i;          //anzahl+1 
              points[2,panz]:=j;          //in array eintragen
              end;
         end;
    end;
getpoints:=points;                         //rückgabewert
end;
so, die if abfrage:

es wird geguckt ob die linie nicht gerade drüber verläuft
-> gerade drüber wäre statt xor immer and
-> wenns bei einer zutrifft reichts, daher or

es werden 4 richtungen geprüft:

nummer 1: -
nummer 2: |
nummer 3: \
nummer 4: /

man könnte das in ne schleife packen, aber das hab ich (noch) nicht parat...

ich hoffe das hilft erst mal


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:08 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