AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Volumen und Mittelpunkt von einem 3D-Raum berechnen?
Thema durchsuchen
Ansicht
Themen-Optionen

Volumen und Mittelpunkt von einem 3D-Raum berechnen?

Ein Thema von Maiky · begonnen am 11. Feb 2018 · letzter Beitrag vom 13. Feb 2018
Antwort Antwort
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?

  Alt 12. Feb 2018, 08:55
Ist quasi ein räumliches N-Eck (Polyeder). Die Eingabe ist etwas aufwendiger als beim 2D N-Eck weil man zusätzlich die Begrenzungsebenen eingeben muss. Die Begrenzungsebenen müssen mathematisch positiv eingegeben werden.

Beispiel Würfel:
Delphi-Quellcode:
procedure TPolyederForm.TestButton3Click(Sender: TObject);
begin
  FPolyeder.Clear;

  FPolyeder.AddPoint(0, 0, 0);
  FPolyeder.AddPoint(8, 0, 0);
  FPolyeder.AddPoint(0, 5, 0);
  FPolyeder.AddPoint(8, 5, 0);
  FPolyeder.AddPoint(0, 0, 3);
  FPolyeder.AddPoint(8, 0, 3);
  FPolyeder.AddPoint(0, 5, 3);
  FPolyeder.AddPoint(8, 5, 3);

  FPolyeder.AddPlane([0, 2, 3, 1]);
  FPolyeder.AddPlane([4, 5, 7, 6]);
  FPolyeder.AddPlane([0, 1, 5, 4]);
  FPolyeder.AddPlane([2, 6, 7, 3]);
  FPolyeder.AddPlane([1, 3, 7, 5]);
  FPolyeder.AddPlane([0, 4, 6, 2]);

  FPolyeder.Calc;
end;
TPolyeder:
Delphi-Quellcode:
function TPolyeder.Determinant(const A, B, C: integer): double;
begin
  Result := FPoints[A].X * (FPoints[B].Y * FPoints[C].Z - FPoints[B].Z * FPoints[C].Y)
    - FPoints[A].Y * (FPoints[B].X * FPoints[C].Z - FPoints[B].Z * FPoints[C].X)
    + FPoints[A].Z * (FPoints[B].X * FPoints[C].Y - FPoints[B].Y * FPoints[C].X);
end;

procedure TPolyeder.Calc;
var
  I, J, A, B, C: integer;
  Det: double;
begin
  FVolumen := 0;
  FCenter.X := 0;
  FCenter.Y := 0;
  FCenter.Z := 0;
  for I := 0 to FPlanes.Count - 1 do
  begin
    A := FPlanes[I].Items[0];
    B := FPlanes[I].Items[1];
    for J := 2 to FPlanes[I].Count - 1 do
    begin
      C := FPlanes[I].Items[J];
      Det := Determinant(A, B, C);
      FVolumen := FVolumen + Det;
      FCenter.X := FCenter.X + (FPoints[A].X + FPoints[B].X + FPoints[C].X) * Det;
      FCenter.Y := FCenter.Y + (FPoints[A].Y + FPoints[B].Y + FPoints[C].Y) * Det;
      FCenter.Z := FCenter.Z + (FPoints[A].Z + FPoints[B].Z + FPoints[C].Z) * Det;
      B := C;
    end;
  end;
  if FVolumen <> 0 then
  begin
    FVolumen := FVolumen / 6;
    FCenter.X := FCenter.X / 24 / FVolumen;
    FCenter.Y := FCenter.Y / 24 / FVolumen;
    FCenter.Z := FCenter.Z / 24 / FVolumen;
  end
  else
  begin
    FCenter.X := 0;
    FCenter.Y := 0;
    FCenter.Z := 0;
  end;
end;
LG Thomas
  Mit Zitat antworten Zitat
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#2

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?

  Alt 12. Feb 2018, 09:53
Danke für die vielen Antworten. Ja, ich meine natürlich den Schwerpunkt des Raumes.

Bei meinem Ansatz mit 4x2 hat man mich wohl missverstanden. Das ist die einfachste Möglichkeit zur Darstellung eines Raumes, aber diese Punkte müssen weder Parallel zueinander liegen noch auf acht beschränkt sein. Bei dieser Grafik bitte einfach die Fenster und Türen weg denken, sowie das dort der Inhalt in kleinere Räume aufgeteilt ist. Ich meine nur die Außenhülle. Der Aufbau des Objektes wäre dann eine komplexere Alternative: http://www.hausplaner.net/s/cc_image...g?t=1504023186 genauso könnten da noch viele Schrägen enthalten sein oder sowas https://blog.nupis.de/wp-content/upl...2_14h46_26.png

Ich habe die Koordinaten der Außenpunkte und könnte diese wie benötigt wohl auch aufbereiten. AutoCad kann die beiden Werte wohl berechnen, siehe: https://blog.nupis.de/wp-content/upl...2_14h47_25.png Ich habe in meinem Fall aber niemals etwas "Rundes". Das abgebildete Loch da könnte maximal grob Eckig sein.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#3

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?

  Alt 12. Feb 2018, 14:03
AutoCad macht sowas sicherlich mit einem Mesh. Also einem Volumen, welches aus Dreiecken zusammengesetzt ist. Ich glaube, dass es sehr aufwendig ist, dort ein Volumen und einen Mittelpunkt zu errechnen.
Vllt solltest Du einen anderen, einfacheren Weg gehen:
Bei einem Grundriss eines Wohnraum könntest Du ja einfach die senkrechte Höhe nehmen.
Wenn Du Dachschrägen im Grundriss hast, könntest Du vllt den Vorschlag von Bjoerk prüfen oder ggf Dachschräge schichtweise berücksichtigen (wäre so meine erste Idee dazu).
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.348 Beiträge
 
Delphi 12 Athens
 
#4

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?

  Alt 12. Feb 2018, 14:28
Zitat:
Ich glaube, dass es sehr aufwendig ist, dort ein Volumen und einen Mittelpunkt zu errechnen.
Im Prinzip nicht.
* die Außenfläche in Dreicke aufteilen
* und dann von dem Mittelpunkt zu allen Dreiecken eine Pyramide Tetraeder annehmen
* von allen Pyramiden Tetraeder die Volumen berechnen und summieren

Statt dem Mittelpunkt kann man auch einen der Punkte auf der Außenfläche als "Mittelpunkt" ansehn und von da aus alles berechnen

Du mußt da halt nur aufpassen, dass es keine Überschneidungen von den angenommenden Pyramiden Tetraeder und der Außenhaut gibt.
Notfalls den gesamten Raum in mehrere Teile zerlegen (eine/mehrere Trennflächen in diesen Körper legen) und jeden Teil dann mit eigenen Mittelpunkten und Pyramiden Tetraeder zerlegen, berechnen und alles summieren.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Feb 2018 um 15:43 Uhr)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#5

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?

  Alt 12. Feb 2018, 14:58
Zitat:
* die Außenfläche in Dreicke aufteilen
* und dann von dem Mittelpunkt zu allen Dreiecken eine Pyramide annehmen
* von allen Pyramiden die Volumen berechnen und summieren
Hmm, scheint doch einfach zu sein. Hast Du auch eine Lösung für das Zentrum, oder war das vllt das Komplizierte bei einem Mesh.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?

  Alt 12. Feb 2018, 15:27
Du mußt da halt nur aufpassen, dass es keine Überschneidungen von den angenommenden Pyramiden und der Außenhaut gibt.
Das ist der große Knackpunkt. Die Methode funktioniert nur dann garantiert, wenn das gesamte Gebilde an allen Stellen konvex ist. Es muss nicht fehlschlagen bei konkaven, aber es kann.
Zitat:
Notfalls den gesamten Raum in mehrere Teile zerlegen (eine/mehrere Trennflächen in diesen Körper legen) und jeden Teil dann mit eigenen Mittelpunkten und Pyramiden zerlegen, berechnen und alles summieren.
Und das wäre dann der komplizierte Teil . Man müsste eine Methode finden, die für beliebige Körper die beliebig vielen Flächen finden, die diesen in rein konvexe Teilkörper zerteilt. Viel Spaß dabei. (Nicht, dass es nicht möglich wäre, aber AutoCAD und Co haben ihren Preis nicht nur aus Spaß.)

Man braucht dafür übrigens den Schwerpunkt nichtmals. Man muss nur einen finden, bei dem sich die Tetraeder nachher nicht überdecken. "Nur".

Das gleiche Verfahren klappt für 2D sehr gut. Da hat man den Vorteil, dass man anhand der Reihenfolge der Punkte der Dreiecke feststellen kann, ob man "zurück gehüpft" ist (=konkave Stelle). Diese subtrahiert man dann einfach vom Gesamtergebnis, und bekommt am Ende die korrekte Fläche. Man kann daher dabei sogar einen beliebigen Startpunkt wählen.
Aber auch diese Methode hat eine Achillesferse (wie auch die 3D-Version wenn man das konkav-Problem gelöst hätte): Löcher. Löcher, wie das vom TE gezeigte, bringen wieder einen ganz eigenen Schwierigkeitsgrad ins Spiel.

Je allgemeiner die Form, desto aufwendiger der Lösungsweg. Von x³ bis hin zu komplizierten analytischen Verfahren (Stichwort parametrische Körper z.B.). Aus dem Stegreif wüsste ich nicht, wie ich das Problem des TE angehen würde, obgleich ich schon einiges im Bereich 3D bzw. Geometrie generell gemacht habe. Aber jede Verallgemeinerung die man ausschließen kann, macht's nachher einfacher. Wenn man z.B. "keine Löcher" und "nur konvex" definieren könnte, wäre der Ansatz über Tetraeder schon ein guter.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.348 Beiträge
 
Delphi 12 Athens
 
#7

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?

  Alt 12. Feb 2018, 17:45
Es darf schon konvex sein, so lange die Tangenten, bzw. alle Geraden (Flächen) durch benachbarte Punkte, den Mittelpunkt nicht einschließen.



Gut, voherer müsste man so oder so erstmal die Außenfläche in Dreiecke zerlegen. (falls das nicht schon gegeben ist)

Dann einfach erstmal ganz einfach versuchen.
* den Schwerpunkt zu berechnen und als Mittelpunkt zu nehmen geht nicht, da man dafür erstmal das Volumen braucht, um darüber die Gewichtsverteilung zu bestimmen und gerade das Volumen wird ja erstmal gesucht.
* ganz billig den Mittelpunkt als Durchschnitt/Mittelwert jeweils der X-, Y- und Z-Koordinaten aller Punkte nehmen.

Dann von allen Punkten/Dreiecken zum Mittelpunkt die Tetraeder bestimmen und schauen ob da jeweils die Spitze auf der Innenseite liegt
> die Dreiecke als Fläche ansehen und der "Mittelpunkt" muß immer "innen" liegen (alle Tetraeder verlaufen zum Mittelpunkt und nichts überschneidet sich)

Passt das nicht, dann nochmal alles mit allen Punkten der Außenfläche als "Mittelpunkt" versuchen.

Hat es mit irgendeinem "Mittelpunkt" geklappt, können die Volumina der Tetraeder zusammengerechnet werden und fertig.



Tja, wurde nichts gefunden, weil z.B. irgendwo was zu sehr konvex ist, dann wird es spaßig und du mußt das ganze Gebilde erstmal unterteilen, so lange/oft, bis sich für alle Bruchstücken der Inhalt berechnen lässt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?

  Alt 12. Feb 2018, 18:19
Das Objekt muss wohl nicht konvex sein und der „Mittelpunkt“ muss auch nicht im Volumen liegen.

Siehe auch https://stackoverflow.com/questions/...ich-is-made-up

Ich schätze, dass man den Schwerpunkt auf ähnliche Weise berechnen kann. Man müsste glaube ich nur für die „Pyramiden“ den jeweiligen Mittelpunkt statt dem Volumen berechnen und dann aus allen Mittelpunkten den Durchschnitt (gewichtet nach Volumen) berechnen.

http://www.ae.msstate.edu/vlsm/shape..._of_volume.htm

Ohne Gewähr.

Geändert von Namenloser (12. Feb 2018 um 18:22 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?

  Alt 13. Feb 2018, 16:16
Es darf schon konvex sein, so lange die Tangenten, bzw. alle Geraden (Flächen) durch benachbarte Punkte, den Mittelpunkt nicht einschließen.
Deswegen ja meine eingeschränkte Aussage für konkave Volumen.

Die Lösung von Namenlozer allerdings ist super! Das ist tatsächlich die 3D-Variante dessen, was ich oben für 2D beschrieben habe! Ich habe nicht versucht das zu übertragen, und wusste bisher nicht, ob das überhaupt "so einfach" möglich ist. Das wirklich coole an der Lösung dort ist, dass man komplett ohne Mittel- oder Schwerpunkt auskommt. Man nimmt einfach irgendeinen Punkt - der Einfachheit halbar den Koordinatenursprung.
Edit: Man muss allerdings, würde ich vermuten, davon ausgehen können, dass das Mesh konsequent eine Winding-Order durchzieht.


Dieses "auch noch anfangen mit Subtrahieren" ist genau der Clou der einem potenziell tausende Zeilen an höherer Mathematik erspart. Ich würde da wohl zugreifen.

(Die genannten Ausnahmen bzgl. Löcher und nicht geschlossener Volumen die in dem SO Thread benannt werden treffen zwar zu, sollten aber bei einem wohlgeformten aus einer Architekturanwendung exportierten Mesh nicht auftreten.)

Meiner Meinung nach ist das die Lösung. Ultimativ. Einfacher wird es nicht werden.


Der Schwerpunkt ist nochmal was anderes. Aber je nach dem wofür der gebraucht wird, hat der TE sich evtl. auch einfach nur unglücklich ausgedrückt. Es gibt hier nämlich (mindestens) 3 Punkte, die man ggf. miteinander verwechseln kann: Schwerpunkt, (arithmetischer) Mittelpunkt und Zentrum der Bounding-Box. Letztere ist super einfach zu ermitteln, und ist z.B. das was man braucht, wenn man ein Objekt um einen Punkt so rotieren möchte, dass es in Höhe/Breite/Tiefe nicht weiter "rauspoppt" als das jeweils längste dieser Maße. Z.B. zum Drehen, so dass das Objekt "optisch" da bleibt, wo es ist.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


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