Geometrie-Aufgabe - Herangehensweise - Frage an die Mathematiker 2

Thaxll'ssillyia

Captain
Registriert
Dez. 2007
Beiträge
3.532
Hallo Community,

ich hatte ja schon letztens einen Thread, wo ich eine Frage zu Geometrie hatte (Link). Da die Fragen aber nichts miteinander zu tun haben, gibt's hier einen neuen Thread.

Gegeben:

- Ein 3D-Körper, der beliebig viele Außenseiten hat (Drei- oder Mehrecke)
- Der Körper hat keine "Einbuchtungen", die Außenseiten bilden also die konvexe Hülle ab
- Es gibt eine vorgegebene Wanddicke w, die für alle Seiten gleich ist

Gesucht:

- Für jeden Eckpunkt den Innenpunkt (dort, wo die Innenseiten der Seiten aufeinander treffen)

Ansatz:

Den Vektor, der vom Eckpunkt in die Richtung zeigt, wo der Innenpunkt liegen müsste, habe ich bereits über den Mittelpunkt der Mittelpunkte der anliegenden Seiten berechnet (orangener Pfeil).
Da ich alle Winkel gegeben habe, sollte es sich ja mathematisch berechnen lassen.

1535888931390.png


Mein Ansatz war, die Dicken-Vektoren (=senkrecht nach innen zeigende Vektor auf jeder Seite mit der Länge der Dicke) jeder anliegenden Seite so lange zu verschieben, bis sie mit der Spitze aufeinander treffen. Dies sollte ja über ein lineares Gleichungssystem lösbar sein. Nur hab ich keine Ahnung wie der Algorithmus ausehen müsste, um die Vektoren parallel zu verschieben, bzw. ob das überhaupt die einfachste Variante ist. Eventuell lässt sich der Punkt schneller über die Winkel zwischen den Seiten berechnen...

Ich bin dankbar für jeden Ansatz!

VG, Thax
 
Wenn du die Ebene (eine Ebene des Körpers) um die Dicke mit dem Normalenvektor verschiebst, sollte die verschobene Ebene doch genau einen Schnittpunkt mit dem nach innen zeigenden Vektor haben, oder?

Der Schnittpunkt müsste eigtl. der gesuchte Punkt sein, oder?

PS: Mit der Ebene umgehst du dann halt die Rechnung, um die Gerade einer Seite zu verschieben, dafür müsstest du ja dann - wenn ichs richtig verstanden habe - die Winkelhalbierende zwischen den zwei Seiten benutzen und darüber dann mit den Winkelsätzen die Länge bis zur Innenkante berechnen und dann die Gerade / den Vektor der Außenseite mit diesem Vektor verschieben.
 
Zuletzt bearbeitet:
Ja, viel Spaß bei der Umsetzung :/ :D

Je nach Aufgabe kannst du ja vielleicht manche Sonderfälle (Ebenen parallel z.B.?) ausschließen.
 
Thaxll'ssillyia schrieb:
Allerdings scheint die Implementierung dazu die Herausforderung zu sein, siehe der Link https://stackoverflow.com/questions/14981410/point-of-intersection-of-three-planes-3d-c-sharp

Nein, ist es nicht, da Du ja definitiv keinen Sonderfall hast, weil Du eben vor der Verschiebung um "w" drei Ebenen hattest, die sich in genau einem Punkt schneiden (nämlich in Deinem gegebenen Eckpunkt) und nach der Verschiebung die neuen Ebenen sich wieder genau in einem Punkt schneiden.
Also nix mit "Sonderfälle"!

Die einzige kleine Herausforderung ist es, falls sich die Ebenen in einem sehr spitzen oder sehr stumpfen Winkel schneiden, da Du dann evtl. numerische Probleme bekommst.


HTH

BigNum
 
Mir ist eben noch eine einfachere und bessere Möglichkeit eingefallen:

Du addierst zu jedem Eckpunkt einen nach "innen" zeigenden Normalenvektor der Länge "w" aller angrenzenden Ebenen.

Hört sich im ersten Moment kompliziert an, ist aber relativ einfach:
Wenn wir Dein Bild von Post #1 als Beispiel nehmen und wir den Punkt mit dem orangen Pfeil betrachten, dann hast Du 3 angrenzende Ebenen:
- das rote Quadrat unten
- das blaue Dreieck hinten
- das blaue Dreieck links

Für diese drei Ebenen berechnest Du jeweils einen nach innen zeigenden Normalenvektor der Länge "w" und addierst die drei sich ergebenden Vektoren zum Eckpunkt "Orange".
So erhältst Du Deinen neuen Eckpunkt.

An der Spitze Deiner Pyramide machst Du das Spielchen für 4 angrenzende Ebenen.

Diese Methode ist zum einen einfacher (weil Du wahrscheinlich den Normalenvektor für jede Ebene sowieso schon hast bzw. leicht berechnen kannst und Du keine Ebenen-Schnittpunkte berechnen musst) und besser (weil Du in keine numerischen Probleme läufst).


HTH

BigNum
 
BigNum schrieb:
Für diese drei Ebenen berechnest Du jeweils einen nach innen zeigenden Normalenvektor der Länge "w" und addierst die drei sich ergebenden Vektoren zum Eckpunkt "Orange".
So erhältst Du Deinen neuen Eckpunkt.

Ok, ich glaub aber die Berechnung funktioniert nicht.

Angenommen wir haben das Beispiel oben mit der Ecke von der Pyramide. Wenn die beiden Dicken-Normalenvektoren der Länge w (fast) nach unten zeigen und dann mit dem Dicken-Normalenvektor der Bodenplatte verrechnet werden, kommt ein Wert raus, der UNTER (Z-Koordinate) dem Eckpunkt liegt (im Bild nicht sichtbar, da er von der hinteren Ecke schräg nach unten zeigt).
1536052465717.png


Außerdem, je mehr Seiten anliegen, desto größer ist die Verschiebung des Punktes (siehe senkrechter Pfeil nach unten). Die Verschiebung des Punktes ist doch aber vorallem von der Steilheit des Winkels zwischen den Panelen abhängig.
 
Thaxll'ssillyia schrieb:
Ok, ich glaub aber die Berechnung funktioniert nicht.
Ja, Du hast recht, ich habe fälschlicherweise einen Spezialfall bei dem es stimmt verallgemeinert :(.

Thaxll'ssillyia schrieb:
Die Verschiebung des Punktes ist doch aber vorallem von der Steilheit des Winkels zwischen den Panelen abhängig.
Ja, es muss noch irgendwo der Cosinus mit rein, ich krieg das auf die Schnelle nicht hin (muss noch arbeiten), aber ich melde mich nochmal.
 
Zuletzt bearbeitet: (Zeitspiel)
BigNum schrieb:
Ja, es muss noch irgendwo der Cosinus mit rein, ich krieg das auf die Schnelle nicht hin (muss noch arbeiten), aber ich melde mich nochmal.

Ok, Danke für deine Hilfe! Vermutlich löst der Cosinus aber nicht das "unter der Pyramide-Problem".
 
Alles lange, lange her ... ich versuch's aber mal:

Von jedem Eckpunkt gibt es eine Strecke zum Volumenschwerpunkt des Körpers. Über den Normalenvektor einer angrenzenden Ebene mit Länge w kannst mit der dann verschobenen Ebene den Schnittpunkt mit eben dieser Strecke berechnen.
Die Schwierigkeit bei dieser Methode ist die Berechnung des Volumenschwerpunktes ... für einen unregelmäßigen Körper.
:freak:
Vielleicht ist das auch Unsinn, in meinem Kopf ergibt es aber irgendwie Sinn. ;)
Edit: Habe noch einmal drüber nachgedacht: Es ist Unsinn. Das würde so nur bei ein paar regelmäßigen Körpern funktionieren.

Sämtliche Ebenen an einem Eckpunkt treffen sich bei Verschiebung über ihren Normalenvektor mit Länge w wieder genau ein einem Schnittpunkt. Sie bedingen sich gegenseitig. Zwei Ebenen haben eine Schnittgerade. Mit zwei Schnittgeraden kannst du den Schnittpunkt berechnen. Du brauchst quasi nur drei verschobene Ebenen, unabhängig davon wie viele tatsächlich anliegen. Das kannst du direkt über die Ebenengleichungen lösen.
 
Zuletzt bearbeitet:
Thaxll'ssillyia schrieb:
Ok, Danke für deine Hilfe! Vermutlich löst der Cosinus aber nicht das "unter der Pyramide-Problem".
Doch würde er, aber dazu später mehr...

Ich habe mir mal auf die Schnelle was zusammengehackt, mit dem man den Schnittpunkt von drei Ebenen berechnen kann.
Mein Beispiel ist nahe an Deins angelehnt und besteht aus einer vierseitigen Pyramide mit einem Quadrat als Grundfläche.
Die Punkte der Grundfläche werden als A, B, C und D bezeichnet, die Spitze heisst S.
Die 3D-Koordinaten dieser 5 Punkte sind:
A (1, 1, 0)
B (11, 1, 0)
C (11, 11, 0)
D (1, 11, 0)
S (6, 6, 5)

BTW: Welche Software nimmst Du für die Visualisierung?

Für die Schnittpunktberechnung betrachten wir Punkt A, also sind die 3 anliegenden Ebenen:
Ebene ADS
Ebene ABS
Ebene ABD

Für jede dieser 3 Ebenen muss eine Ebenengleichung berechnet werden und zwar benötigen wir die sog. hessesche Normalform (hat nix mit dem Bundesland Hessen zu tun ;) )

Wie diese berechnet wird, wird hier beschrieben, nachfolgend die Parameter (Normalenvektor und Abstand) unserer 3 o.g. Ebenen:
ADS: ( 0.707107, 0.000000, -0.707107) 0.707107
ABS: ( 0.000000, 0.707107, -0.707107) 0.707107
ABD: ( 0.000000, 0.000000, 1.000000) 0.000000

Man kann leicht erkennen, dass die Ebene ABD mit der XY-Ebene identisch ist.

Um den Schnittpunkt dieser drei Ebenen zu berechnen nehmen wir die Formel aus Deinem Link in Post #3:

http://geomalgorithms.com/Eqn_P0-3plane_pt.gif

Da aber die Berechnung mit dieser Formel von einer Hesseschen Normalform in der Form n0*x +d = 0 ausgeht, ich aber die auf Wikipedia angegebene Form n0*x = d verwende, muss die Formel umgebaut werden zu:

P = ( d1*(n2 x n3) + d2*(n3 x n1) + d3*(n1 x n2) ) / (n1* (n2 x n3))

Diese Formel liefert mit den o.a. 3 Ebenengleichungen völlig unüberraschend den Punkt (1, 1, 0), also Punkt A als Ergebnis.

Wenn man nun für den Parameter "w" beispielsweise den Wert 1.5 nimmt und den mit den damit verschobenen Ebenen neuen Schnittpunkt errechnet, erhält man:

( 4.621320, 4.621320, 1.500000 )

Zusammenfassend kann ich sagen, daß ich zum jetzigen Zeitpunkt die Lösung mit "Schnittpunktberechnung der verschobene Ebenen" bevorzugen würde. Bei ihr sind vermutlich mehr Rechenschritte notwendig als bei der "Cosinus"-Lösung, welche ihrerseits mehrere Trigonometrische Berechnungen benötigt.
Ein (kleiner) Schwachpunkt der Schnittpunktberechnung ist, das es evtl. numerische Probleme geben kann (falls bei der obigen Formel für P der Nenner sehr klein wird), aber dieser ist relativ einfach zu umgehen.

Falls Fragen sind (ich bin mir relativ sicher, dass da welche sind): Immer her damit :)


HTH

BigNum
 
Zuletzt bearbeitet: (fehlende Klammer ergänzt)
BigNum schrieb:
Wie diese berechnet wird, wird hier beschrieben, nachfolgend die Parameter (Normalenvektor und Abstand) unserer 3 o.g. Ebenen:
ADS: ( 0.707107, 0.000000, -0.707107) 0.707107
ABS: ( 0.000000, 0.707107, -0.707107) 0.707107
ABD: ( 0.000000, 0.000000, 1.000000) 0.000000

Vielen Danke BigNum! Die hessesche Normalform hab ich verstanden, nur versteh ich nicht wie der Abstand berechnet wird.

Ich dachte ich kann einfach einen Vektor aus Eckpunkt - Koordinatenursprung bilden, den Normalisieren und die Länge bestimmen. Nur komme ich für den Eckpunkt 1;1;0 für alle Ebenen da auf den Wert 1 und nicht auf 0,707.

Bei Wikipedia steht:
"Der Abstand der Ebene vom Ursprung kann dann durch d = p*n0 ermittelt werden. Dieser Abstand entspricht wiederum der Länge der Orthogonalprojektion des Vektors p0 auf die Ursprungsgerade mit Richtungsvektor n0"

Ich versteh nicht was mit Orthogonalprojektion des Vektors p0 auf die Ursprungsgerade gemeint ist.

Den Normalenvektor hab ich, Werte stimmen auch überein.

BigNum schrieb:
BTW: Welche Software nimmst Du für die Visualisierung?

Selbst gebaut mit WPF 3D und Heelix3D-Toolkit :)
 
Thaxll'ssillyia schrieb:
Bei Wikipedia steht:
"Der Abstand der Ebene vom Ursprung kann dann durch d = p*n0 ermittelt werden. Dieser Abstand entspricht wiederum der Länge der Orthogonalprojektion des Vektors p0 auf die Ursprungsgerade mit Richtungsvektor n0"

Ich versteh nicht was mit Orthogonalprojektion des Vektors p0 auf die Ursprungsgerade gemeint ist.
Ich versuch es mal mit ASCII-Art:

Code:
   ^
   |n0
________________________ Ebene
   |    /
   |   /
  d|  / p
   | /
   |/
   O Ursprung
Das ist das Ganze sozusagen "von der Seite" gesehen.

Die Berechnung der Hesseschen Normalform (HNF) läuft bei mir wie folgt am Beispiel der Ebene ADS erklärt:
- benötigt werden die drei Vektoren A, AD und AS, wobei A der "Aufsetzpunkt" und AD & AS die "Richtungsvektoren" sind.
- das Kreuzprodukt aus AD x AS ist (50, 0, -50), normiert ergibt das n0= (0.70717, 0 , -0.70717)
- Nun bildest Du das Skalarprodukt aus obigem Vektor n0 und Vektor A, falls der Wert negativ ist wird n0 "umgedreht", also n0= -n0 (ist aber hier nicht der Fall)
- Der Abstand d ist das Skalarprodukt aus n0 und A, hier also 0.70717


HTH

BigNum
 
Ok, hat für die Berechnung des Punkte A = {1;1;0} funktioniert, Danke für die Erklärung!

Jetzt muss ich nur noch die Verschiebung um Dicke w einbauen. Dazu müsste ich bei der hesseschen Normalform ja die Dicke w an den Abstand d ranhängen, aber da stimmt natürlich die Richtung nicht. Ich brauch also eine Dreiecksgleichung, um aus der Länge des Dickenvektors, dem Wert w und dem Winkel zwischen w und dem Dickenvektor den neuen Abstand auszurechnen, richtig?

Da du aber schon den verschobenen Punkt ausgerechnet hast, nehm ich an, es geht auch viel einfacher...


Ich war zu doof. Ich hab versehentlich den Eckpunkt statt dem Mittelpunkt des Dreiecks als A (Aufsetzpunkt) genommen (da kommt allerdings trotzdem der richtige Wert raus. Allerdings hab ich mich dann gewundert, wie ich weiterrechnen muss.

Jetzt klappt aber alles, Danke sehr! Gleich gibts noch nen paar Bilder von der funktionierenden Lösung.
 
Zuletzt bearbeitet:
Thaxll'ssillyia schrieb:
Ich war zu doof. Ich hab versehentlich den Eckpunkt statt dem Mittelpunkt des Dreiecks als A (Aufsetzpunkt) genommen (da kommt allerdings trotzdem der richtige Wert raus. Allerdings hab ich mich dann gewundert, wie ich weiterrechnen muss

Es sollte (bzw. muss sogar) bei jedem Punkt auf der Ebene als Aufsetzpunkt ein und dieselbe HNF als Ergebnis herauskommen, d.h. bei meinem Beispiel aus Post #14 kann man statt Vektor A auch den Vektor D oder S als Aufsetzpunkt nehmen und es muss sich dieselbe HNF ergeben.

Für die Verschiebung um "w" muss Du nur das jeweilige "d" in der HNF der 3 Ebenen in Richtung "innen" (des 3D-Körpers) verschieben, das ist entweder eine Addition oder einen Subtraktion um "w", der Normalenvektor ändert sich nicht.

Klappt die Schnittpunktberechnung bei Dir schon?


HTH

BigNum
 
  • Gefällt mir
Reaktionen: Thaxll'ssillyia
Werte: Seitenlänge 20, Höhe 10, Dicke 1,5
1536238169531.png


Werte: Gleiche wie obige Pyramide, verlängerte Seiten auf X-Achse mit Länge 5, Dicke 0,8
1536238445356.png

Ergänzung ()

BigNum schrieb:
Klappt die Schnittpunktberechnung bei Dir schon?

Perfekt! Vielen Dank!

Jetzt muss ich nur noch den Spezialfall einbauen, dass ich bei dem Körper auch Seiten weglassen kann (was zur Folge hat, dass dort keine Dicke für die Seite berechnet wird). Das sollte aber einfach machbar sein, indem ich die entsprechende Seite bei der Verschiebung nicht berücksichtige.

Ok, so einfach ist es nicht, siehe Bild:

1536241402949.png


Bei nur 3 anliegenden Seiten klappt es (wie bei der Bodenplatte), aber wenn ich mehr Seiten habe (wie hier in der Spitze der Pyramide), dann ist es davon abhägig welche 3 Seiten ich für die Innenpunkt genommen habe.
Aber selbst wenn die Berechnung klappen würde, kommt zusätzlich noch dazu, dass ich das Holz an der Kante unterschiedlich schräg schneiden müsste, was selbst mit einer achsenverstellbaren Tischkreissäge nicht geht:

1536242047590.png


Aber egal, das bisherige Ergebnis stellt mich sehr zufrieden! Vielen herzlichen Dank nochmal!
 
Zuletzt bearbeitet:
Thaxll'ssillyia schrieb:
Jetzt muss ich nur noch den Spezialfall einbauen, dass ich bei dem Körper auch Seiten weglassen kann (was zur Folge hat, dass dort keine Dicke für die Seite berechnet wird). Das sollte aber einfach machbar sein, indem ich die entsprechende Seite bei der Verschiebung nicht berücksichtige.
Doch genau so ist es!


Thaxll'ssillyia schrieb:
Bei nur 3 anliegenden Seiten klappt es (wie bei der Bodenplatte), aber wenn ich mehr Seiten habe (wie hier in der Spitze der Pyramide), dann ist es davon abhägig welche 3 Seiten ich für die Innenpunkt genommen habe.
Ja, Du muss bei der Schnittpunktberechnung für die Spitze genau 3 Ebenengleichungen (nicht 4, und das geht ja gar nicht, da in der Formel für den Schnittpunkt nur 3 Ebenen auftauchen) verwenden, darunter auf alle Fälle die ohne Verschiebung.

Thaxll'ssillyia schrieb:
Aber selbst wenn die Berechnung klappen würde, kommt zusätzlich noch dazu, dass ich das Holz an der Kante unterschiedlich schräg schneiden müsste, was selbst mit einer achsenverstellbaren Tischkreissäge nicht geht:
Doch, auch das sollte möglich sein! Du hast ja dann lediglich eine Pyramide, die an einer Seite "etwas länger" ist.

BTW: Was ist eigentlich das Ergebnis der ganzen Übung hier oder anders gefragt: Welche Teile willst Du Dir aus Holz ausschneiden und wozu verwendest Du diese dann?

Thaxll'ssillyia schrieb:
Aber egal, das bisherige Ergebnis stellt mich sehr zufrieden! Vielen herzlichen Dank nochmal!
Bitte gerne!


Schöne Grüsse

BigNum
 
  • Gefällt mir
Reaktionen: Thaxll'ssillyia
BigNum schrieb:

Hallo Bignum,

ich hab doch noch ein kleines Anliegen. Ich möchte für mein resultierendes Panel für jede Seite die Kantenwinkel ausrechnen.
Dazu habe ich beim ersten Versuch zwei Vektoren gebildet, einen von der Seitenhalbierenden der unten liegenden Seite zur Seitenhalbierenden der oben liegenden Seite (orangene Pfeile) sowie der andere von der Seitenhalbierenden der unten liegenden Seite zum Mittelpunkt des untenliegenden Panels (roter Pfeil).

Das klappt auch gut, wenn die Seite symmetrisch ist (orangener Pfeil oben rechts), nur bei den anderen logischerweise nicht, da die Seitenhalbierenden der Ober- und Unterseite sowie die der Mittelpunkt des Panels nicht auf einer Linie liegen.

Ich bräuchte also einmal einen Vektor, der "senkrecht" die Kante hoch geht und einen auf der Unterseite, der senkrecht auf der Seitenhalbierenden der Seite Richtung untenliegende Panelinnenseite zeigt. Nur wie berechne ich das?
Als Ausgangspunkt würde ich ja von der unten liegenden Seite die Seitenhalbierende nehmen. Oder ist es wahrscheinlich einfacher, die Ebenengleichungen der Panele zu nehmen und den Winkel bei der Schnittgeraden zu berechnen?

Oberseite:
1536392152598.png


Unterseite:
1536392213893.png


Danke schonmal!
VG, Thax
 
Thaxll'ssillyia schrieb:
Hallo Bignum,

ich hab doch noch ein kleines Anliegen. Ich möchte für mein resultierendes Panel für jede Seite die Kantenwinkel ausrechnen.
Wenn ich Dich richtig verstehe meinst Du mit "Panel" das was in der Mathematik als Pyramidenstumpf bezeichnet wird. Der "Kantenwinkel" ist dann einfach der Winkel zwischen der Grundfläche und der jeweiligen Seitenfläche.
Dieser kann einfach mit dem Skalarprodukt berechnet werden.

Ich nehme als Beispiel die Werte aus meinem Post # 12, die normierten Normalenvektoren (nein, das ist kein Verschreiber, das gibt es wirklich und ist auch so gemeint: "normiert", weil sie die Länge "1" haben und "Normal", weil sie senkrecht auf der Ebene stehen) für die 3 Ebenen sind:
ADS: ( 0.707107, 0.000000, -0.707107)
ABS: ( 0.000000, 0.707107, -0.707107)
ABD: ( 0.000000, 0.000000, 1.000000)

Wenn ich nun den Winkel zwischen der Ebene ABD (sozusagen die Grundfläche meines Pyramidenstumpfs) und der Ebene ABS (Seitenfläche) haben will, berechne ich zuerst das Skalarprodukt aus den beiden normierten Normalvektoren:

-0.707107

Um daraus den Winkel zu berechnen nimmt man den Arkuskosinus (heisst bei vielen Programmiersprachen "acos") von -0.707107, welcher 2.35619 (in Rad gemessen, entspricht 135°) beträgt.

acos(-0.707107 )= 2.35619

Um von 2.35619 (Bogenmaß / Rad) auf 135 (Grad) zu kommen, multipliziert man die Zahl mit 180 und dividiert durch Pi (3.1415926535), also:

2.35619 * 180 / 3.1415926535= 135

Falls der Wert (wie in diesem Fall) über 90° liegt, muss man den Wert von 180° abziehen und kommt auf 45°:

180 - 135= 45


Wenn man nun (als zweites Beispiel) den Winkel zwischen den Ebenen ADS und ABS haben will, berechnet man das Skalarprodukt zwischen den Normalenvektoren und kommt auf:

0.5

acos(0.5)= 1.047197

1.047197 * 180 / 3.1415926535 = 60

Der Winkel zwischen ADS und ABS beträgt also 60°.


HTH

BigNum
 
Zurück
Oben