![]() |
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 |
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?
|
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 |
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 |
Re: Fläche berechnen
Ich hab mal das hier gemacht und hoffe es kommt deinen Vorstellungen nahe:
![]() 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... |
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 |
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] |
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 |
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:
da brauch man sogar nur 2 projektionen...
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; 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:
so, die if abfrage:
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; 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 05:10 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