Autor
|
Thema: Liegt Punkt zwischen 2 Planes im Raum? (1595 mal gelesen)
|
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 29. Jul. 2014 10:12 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich versuche derzeit eine performante Lösung zu finden, um herauszufinden, ob ein Punkt im 3D zwischen zwei beliebigen (auch nicht parallelen) Planes liegt . Bisherige Idee [noch nicht endgültig validiert] (mit x=Punkt im 3D, P1=Plane 1, P2=Plane 2): 1)x wird auf P1 projiziert (xp1) 2)x wird auf P2 projiziert (xp2) 3)xp1 wird auf P2 projiziert (xp3) 4)xp2 wird auf P1 projiziert (xp4) 5)Linie zwischen xp1 und xp3 erstellen 5)Linie zwischen xp2 und xp4 erstellen Mit Ausnahme von ein paar Grenzfällen liegt x zwischen P1 und P2, wenn es einen Intersect der beiden Linien gibt. Hat jmd. evtl. eine Lösung mit weniger Hilfsgeometrie? Vielen Dank Grüße Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 29. Jul. 2014 10:32 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
Servus Wenn die (unendlich groß) Ebenen nicht parallel sind, ist der Punkt doch immer dazwischen (nur die Frage in welchem "Quadrant")? Oder steh ich im Moment auf dem Schlauch? Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 29. Jul. 2014 10:37 <-- editieren / zitieren --> Unities abgeben:
Achso ne das ist genau richtig Ich möchte sozusagen die "Eingruppierung" herausfinden. Sagen wir 10 Punkte sind zwischen P1, P2, P3, P4 verteilt. Dann möchte ich wissen, ob x1 zwischen P1 und P2 liegt und z. B. x3 zwischen P3 und P4 (immer die unmittelbar benachbarten! Ebenen, also praktisch der "Quadrant" ja). Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xam0560 Mitglied Konstruktion / Administration
Beiträge: 445 Registriert: 11.08.2008
|
erstellt am: 29. Jul. 2014 10:58 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
Entweder steh ich total auf dem Schlauch, oder das was du willst ist ein bisschen komplex. HÄ? willst du dies mehrfach anwenden oder nur in diesem einem modell? Willst du die Ebenen selbst anwählen mussen oder soll alles automatisch erfolgen? Ich hätte da schon zwei Ideen, doch die sind beide brutalst aufwendig. Kannst du mir ein bisschen mehr Randinformationen geben? ------------------ Gruß, Maximilian ------------ Top 10 der CAD Programme: 10=ACAD; 09=SolidWorks; 08=Inventor; 07=SolidEdge; 06=Creo; 05; 04=UG; 03; 02=Catia; 01=???
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 29. Jul. 2014 11:37 <-- editieren / zitieren --> Unities abgeben:
Das mit der usability ist erstmal zweitrangig. Das mache ich dann entsprechend, wie es der Anwender gerne hätte. Ich muss nur eine Methode entwickeln, die als Parameter eine Collection von beliebig vielen Punkten sowie eine weitere Collection mit Planes bekommt. Als Rückgabewert soll sie eine Aussage liefern, welche Punkte sich unmittelbar zwischen welchen Planes befinden: x1 liegt zwischen P1 und P2 x2 liegt zwischen P2 und P3 x3 liegt zwischen P3 und P4 Dass x2 sich auch zwischen P1 und P4 befindet ist zwar klar, soll aber "rausgefiltert" werden. Es geht nur um die unmittelbaren Nachbarebenen. Wie oft das Ganze durchlaufen wird ist erstmal nicht klar. Möglicherweise 10x, vielleicht aber auch 1000x. Ich werde eine generische Methode entwickeln und diese in eine Library auslagern, so dass ich diese immer wieder anwenden kann. Sie wird praktisch die Standard-Api über LINQ mit C# "erweitern". Das Ziel des Ganzen ist es natürlich diese Aufgabe so performant wie möglich zu lösen. Idealfall wäre alles mathematisch, weil dann dauert die Auswertung nur Sekunden für tausende Ebenen und Punkte. Worst case wären irgendwelche Hilfsgeometrien in CATIA zu bauen und diese intelligent abzufragen, aber da ist auch die Frage welche und wie? [Diese Nachricht wurde von MarcDe am 29. Jul. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xam0560 Mitglied Konstruktion / Administration
Beiträge: 445 Registriert: 11.08.2008
|
erstellt am: 29. Jul. 2014 13:31 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
Ahhh jetzt raff ich es. Das ist doch ganz einfach. Du musst nur ein Makro programmieren das folgends macht. 1. Schleife durch dein Part (oder Userauswahl) und alle Ebenen in ein Array speichern 2. Schleife durch dein Part (oder Userauswahl) und alle Punkte in ein Array speichern 3. nun: Messen von Array 1.1 zu 1.1 ... 1.2 zu 1.1 usw. usw. Die Ergebnisse in ein weiteres Array speichern. 4. Die zwei Minimum Werte in deinem Array herausfiltern und dem Array aus 1 zuweisen. TA DA du hast von deinem Punkte die zwei Ebenen die am nächsten sind. "Array 1.14 und 1.26 von mir aus." 5. Ausgabe in einen Parameter oder .txt. File schreiben / speichern also Dim a bla bla bla = Array 1.14 usw.usw. 6. next i so würde ich es machen. Evtl könnte das ganze aber a bissl dauern und das ganze ist natürlich nicht assoziativ. Geometrie ändern und du darfs dein Marko neu laufen lassen. Du kannst aber, um bei Änderungen nicht alles neu durchlaufen zu lassen, dein Makro so aufbauen, das A = Als erstes die Koordinaten der Punkte mit einer Konstruktionstabelle vergilchen wird. Wenn sich nichts geändert hat kannst du I aus deinem Aray übersprigen lassen. Wenn sich einen Ebene verändert hat, wird es schwer. Da musst du wohl oder übel, bei dieser Methode das Makro nochmal latschen lassen. Evtl. haben aber meine Kollegen einen anderen Vorschlag. PS: Mit mehreren Arrays zu arbeiten ist ein bisschen schwer. Ich slebst nimm da immer mehrdimenionale Arrays. Weißt du was das ist? Wenn nicht, lass die Finger davon. Da raucht meinstens dein bzw. mein Hirn. HEHE *fg* ------------------ Gruß, Maximilian ------------ Top 10 der CAD Programme: 10=ACAD; 09=SolidWorks; 08=Inventor; 07=SolidEdge; 06=Creo; 05; 04=UG; 03; 02=Catia; 01=???
[Diese Nachricht wurde von xam0560 am 29. Jul. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 29. Jul. 2014 13:49 <-- editieren / zitieren --> Unities abgeben:
Hi Maximilian, vielen Dank für deine Antwort. Grundsätzlich: Ich bin C# Expert, somit arbeite ich gar nicht mit simplen Arrays, da gibt es stärkere Werkzeuge, die ein bisschen - viel mehr - können Überdenke deinen Messvorschlag nochmal genau, dann wirst du schnell merken, dass er nicht funktioniert (wäre ja auch zu einfach). Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xam0560 Mitglied Konstruktion / Administration
Beiträge: 445 Registriert: 11.08.2008
|
erstellt am: 29. Jul. 2014 14:32 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
C# Experte Uiii... ... Was mein Vorschlag geht nicht? Das teste ich gleich mal. Gib mir ein bisschen Zeit. (ne Stunde ca.) Das bekomm ich hin. ------------------ Gruß, Maximilian ------------ Top 10 der CAD Programme: 10=ACAD; 09=SolidWorks; 08=Inventor; 07=SolidEdge; 06=Creo; 05; 04=UG; 03; 02=Catia; 01=???
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xam0560 Mitglied Konstruktion / Administration
Beiträge: 445 Registriert: 11.08.2008
|
erstellt am: 29. Jul. 2014 14:59 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
ARG... Kaum angefangen, schon gemerkt das du recht hast. Dies geht nicht, da es ja vorkommen kann das zwei Ebenen z.b. Rechts näher sind als die erste auf der linken Seite. Ausserdem was machst du wenn eine Ebene oberhalb oder unterhalb liegt? Z.B.: eine horizontale Ebene und eine Vertikale, mit einem Punkt bei den Koordinaten 10,10,0? noch eine Ebene Vertikal bei 15,0,0 dazu und du hast ein echtes Problem. .. Das geht sogar ncoh weiter. Was ist wenn zwei Ebenen kreuz und quer im Raum den selbigen Abstand haben? Mit einer Konstruktionsmethode geht das nicht. Mit meinem Vorschlag auch nicht. mmmh Schwer... HEHE Endlich mal ne knifflige Aufgabe. Auf Anhieb fällt mir aber auch nichts ein. selbst einen Kugel die du in 0,001mm Schritten wachsen lässt, geht nicht. selbiges Problem. Man muesste die geometerie herrunterbrechen auf 2D oder nur in X bzw. Y betrachten. Ich überleg noch ein bisschen. Evtl. fällt mir was ein. ------------------ Gruß, Maximilian ------------ Top 10 der CAD Programme: 10=ACAD; 09=SolidWorks; 08=Inventor; 07=SolidEdge; 06=Creo; 05; 04=UG; 03; 02=Catia; 01=???
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 29. Jul. 2014 15:09 <-- editieren / zitieren --> Unities abgeben:
Du bist echt witzig ...immerhin denkst du nach. Ich habe mittlerweile 2 halbwegs brauchbare Lösungen, die ich aber noch nicht programmiert habe. Ich poste sie demnächst. Vorher lasse ich dich aber noch etwas grübeln Das mit der vertikalen und horizontalen Ebene, da muss ich dir wohl recht geben, aber gehen wir mal davon aus, dass die Ebenen "halbwegs" parallel sind. Ansonsten kann das sehr schlecht noch ungemütlicher werden. Es sind Ebenen aus einem Langstreckenflugzeug, also von daher gehen wir von der halbwegs parallelen Annahme aus! Ich dank dir Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 29. Jul. 2014 16:12 <-- editieren / zitieren --> Unities abgeben:
So die erste Lösung (getestet und funktioniert): Code:
public static bool IsPointLocatedBetween2Planes(this HybridShapeTypeLib.Point p, HybridShapeTypeLib.Plane p1, HybridShapeTypeLib.Plane p2, SPATypeLib.SPAWorkbench spaWB, HybridShapeFactory gsdFac) { try { HybridShapeProject pro1 = gsdFac.AddNewProject((Reference)p, (Reference)p1); pro1.Compute(); HybridShapeProject pro2 = gsdFac.AddNewProject((Reference)p, (Reference)p2); pro2.Compute(); Line line1 = gsdFac.AddNewLinePtPt((Reference)p, (Reference)pro1); line1.Compute(); Line line2 = gsdFac.AddNewLinePtPt((Reference)p, (Reference)pro2); line2.Compute(); SPATypeLib.Measurable mA = spaWB.GetMeasurable((Reference)line1); double angle = mA.GetAngleBetween((Reference)line2); if (angle >= 90.0) return true; else return false; } catch (Exception ex) { throw new Exception("Error while analysing whether a point is located between two planes.", ex); } }
Diese Linq-Erweiterungsmethode erweitert im übrigen auch die Standard-Api, so dass im Intellisense von der V5-Api direkt die Methode "IsPointLocatedBetween2Planes" auftaucht, sobald man sich in der Klasse "Point" befindet. Es geht kaum intuitiver/sauberer Was ich aber ******e finde, ist die Erzeugung von "so viel" Hilfsgeometrie. Das geht bei vielen Analysen ganz schön auf den Speicher + Performance! [Diese Nachricht wurde von MarcDe am 29. Jul. 2014 editiert.] [Diese Nachricht wurde von MarcDe am 29. Jul. 2014 editiert.] [Diese Nachricht wurde von MarcDe am 29. Jul. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarkS. Mitglied NC-Programmierer/Anwendungsentwickler
Beiträge: 30 Registriert: 23.05.2012 Windows 7 SP1 64Bit AMD Opteron 6134 ATI FirePro V8800 32 GB Catia V5 R19/R20/R21 VB.NET 2010 Delphi 7
|
erstellt am: 30. Jul. 2014 17:13 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
Über die SPAWorkbench bekommst Du doch alle nötigen Informationen der Geometrie, um einen Vektor vom Punkt senkrecht zur Fläche zu berechnen. Damit kannst Du Dein Problem auch lösen, ohne Geometrie zu erstellen. Es würde auch wesentlich schneller laufen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 30. Jul. 2014 17:40 <-- editieren / zitieren --> Unities abgeben:
Zitat: Über die SPAWorkbench bekommst Du doch alle nötigen Informationen der Geometrie, um einen Vektor vom Punkt senkrecht zur Fläche zu berechnen. Damit kannst Du Dein Problem auch lösen, ohne Geometrie zu erstellen. Es würde auch wesentlich schneller laufen.
Das wäre der mathematische Ansatz, der sicher der Beste und Schnellste wäre. Das will ich nicht abstreiten. Dann bin ich ja gespannt auf deine mathematische Lösung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 30. Jul. 2014 19:18 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
Servus Deine Lösung rein mathematisch umzusetzen könnte so gehen: - mit "GetMinimumDistancePoints" die Projektionspunkte (B und C) vom Punkt A auf die Ebenen ermitteln - Vektor AB und AC bilden - Skalarprodukt AB * AC bilden - wenn das Skalarproduct < 0 ist, ist der Winkel der Vektoren zueinander größer als 90° Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 31. Jul. 2014 19:16 <-- editieren / zitieren --> Unities abgeben:
Moin, ich hatte die mathematische Lösung bereits mit Winkel zwischen den Vektoren, aber dieser lieferte nicht den richtigen Aufspannwinkel, obwohl ich eigentlich die Vektoren richtig berechnet hatte (immer von Punkt ausgehend, da die Richtung hier ja entscheidend ist). Evtl. reicht es aber wirklich gar nicht bis zum Winkel zu rechnen, sondern nur das Skalarprodukt abzufragen. Teste ich mal Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |