Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Volumen und Mittelpunkt von einem 3D-Raum berechnen? (https://www.delphipraxis.net/195200-volumen-und-mittelpunkt-von-einem-3d-raum-berechnen.html)

Maiky 11. Feb 2018 16:33

Volumen und Mittelpunkt von einem 3D-Raum berechnen?
 
Hallo,

eine sehr spezielle Frage. Ich erstelle mittels X,Y-Koordinaten Schnitte(Polygon) eines 3D-Raumes. Als Raum meine ich zum Beispiel so etwas wie einen Wohnraum. Das kann mal ein einfaches Objekt sein mit 4x2 Punkten die sich senkrecht gegenüber liegen, aber eben auch mal mit diversen Ein- oder Ausbuchtungen an Seiten.

Ich suche eine Möglichkeit wie ich das Volumen eines solchen Raumes berechnen kann und auch der Raum-Mittelpunkt würde mich interessieren. Die Koordinaten würde ich entsprechend aufbereiten. Kann mir hier jemand eventuell weiterhelfen und einen Tipp geben in welche Richtung ich da suchen sollte oder gibt es gar eine Quelloffene Delphi,C++,PHP,Javascript Funktion dafür?

Der schöne Günther 11. Feb 2018 21:11

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?
 
Ich verstehe das aber richtig dass es im Endeffekt ein zweidimensionales Polygon ist dessen Flächeninhalt mal nur noch mal mit der Höhe multipliziert, oder?

Falls nicht hast du ja quasi eine Punktwolke. Ich würde die triangulieren, z.B. über Delaunay-Triangulierung. Von da aus scheint es einige Wege zu geben um daraus das Volumen herzuleiten.

Falls die ganzen Paper zu kompliziert sind wäre vielleicht noch eine Möglichkeit, je nachdem wie genau es sein muss, den Wert mit Voxeln anzunähern - Also ganz billig in x kleinen Schritten im 3D-Koordinatensystem prüfen ob der Punkt innerhalbo der außerhalb ist und von dort aus aufsummieren :oops:

Delphi-Laie 11. Feb 2018 23:22

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?
 
1. Einen Mittelpunkt eines Raumes kenne ich nicht. Was soll das sein? Ist der Schwerpunkt gemeint?
2. 8 Punkte können nur ein Parallelepiped oder gar einen Körper (Polyeder) mit noch geringerer Symmetrie mit planen Seitenflächen aufspannen. Wo ist da noch Platz bzw. Information für "Ein- oder Ausbuchtungen an Seiten"?

Rollo62 12. Feb 2018 08:42

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?
 
Du könntest dir mal die Clipper Library anschauen.
Bin jetzt nicht sicher ob die Lösung für dich da drin ist, aber zumndest könnte es gut sein das da einige Hilfsroutinen drin sind die du gebrauchen könntest.

Rollo

Bjoerk 12. Feb 2018 08:55

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?
 
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

Maiky 12. Feb 2018 09:53

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?
 
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.

Jens01 12. Feb 2018 14:03

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?
 
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).

himitsu 12. Feb 2018 14:28

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?
 
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.

Jens01 12. Feb 2018 14:58

AW: Volumen und Mittelpunkt von einem 3D-Raum berechnen?
 
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. :shock:

Medium 12. Feb 2018 15:27

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

Zitat von himitsu (Beitrag 1393655)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr.
Seite 1 von 2  1 2      

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