| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Kollisionsprüfung von 3DSolids vom Typ Zylinder (1382 mal gelesen)
|
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 14. Okt. 2014 07:36 <-- editieren / zitieren --> Unities abgeben:
Moin, heute habe ich mal folgendes Problem zu lösen, und hoffe auf einiges an Input von Euch. Es soll geprüft werden, ob ein Zylinder einen Anderen berührt. Es geht ausschließlich um Zylinder im 3D Raum. SSget scheint ausgeschlossen zu sein, da es nicht so im 3D funktioniert, wie die Objekte dort verlaufen. Die intersectWith Methode kann auch ausgeschlossen werden, da sie für diese Objekte nicht implementiert ist. §D Operationen wie _union oder _subtract geht auch da diese Methoden auch funktionieren, wenn die Objekte sich gar nicht berühren. Was ich schon probiert habe: Erstellen von linien in der Seele eines jeden Zylinders und prüfen der Linienverläufe zueinander mit der intersectWith Methode. Die ist aber an der Stelle, wo die Zylinder teilweise deckungsgleich übereinander liegen und daher den gleichen Richtungsvektor haben, am Ende. So, fällt denn jemandem etwas dazu ein?
------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 14. Okt. 2014 07:42 <-- editieren / zitieren --> Unities abgeben: Nur für CADwiesel
... nimm das Volumen des ersten Zylinders und merk dir das. ... subtrahiere vom 1. den 2. Zylinder ... lies das Volumen erneut aus sind die beiden Volumenwerte == , dann berühren sich die Zylinder maximal, aber schneiden sich nicht. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 14. Okt. 2014 09:46 <-- editieren / zitieren --> Unities abgeben:
auf welche Art sollte denn Sustrahiert werden? wie ich Eingangs schon schrub fällt _subtrakt und _union aus wegen: geht nicht Ich werde mal etwas mit dem schönen Befehl _-INTERFERE rumspielen, möglicherweise reicht das ja aus um die Objekte einzeln gegeneinander zu prüfen. Ist zwar nichts selbstgebautes, aber mal ein Anfang. Trotzdem würde ich gerne weitere Ideen sammeln. ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 14. Okt. 2014 10:16 <-- editieren / zitieren --> Unities abgeben: Nur für CADwiesel
Wie genau soll/muß denn diese Prüfung sein? Folgende "Pfusch-"Idee: - Prüfe ob beide Zylinder kollidieren - wenn ja braucht man nicht weitermachen. - Falls Nein: vergrößere einen der beiden Zylinder um einen winzigen Faktor oder Betrag (z.B. skalieren um 0,00001 mit Schwerpunkt als Basispunkt). (Skalierfaktor hängt von der geforderten Genauigkeit ab) - Prüfe, od die Zylinder jetzt kollidieren. Wenn ja, dann haben sie sich vorher "berührt", wenn nein, war noch Luft zwischen beiden. Duck und weg Jürgen ------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty)
[Diese Nachricht wurde von jupa am 14. Okt. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Vino Mitglied
Beiträge: 207 Registriert: 24.05.2005 Windows 10 BricsCAD V20-22
|
erstellt am: 14. Okt. 2014 13:00 <-- editieren / zitieren --> Unities abgeben: Nur für CADwiesel
Hallo, also THEORETISCH würde ich sagen, berechne dir den kürzesten Abstand der beiden Achslinien und vergleiche den mit der Summe der Radien deiner beiden Zylinder... PRAKTISCH muss ich leider sagen, dass ich nicht weiß, wie man mit Lisp den kürzesten Abstand berechnet... Wenn du in Google mal "minimaler Abstand für windschiefe Geraden" eingibst, dann findest du dazu einiges... Wie man diese Formel aber in Lisp umsetzt...??? Aber vielleicht hilft dir das ja als Denkanstoß? Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 14. Okt. 2014 13:14 <-- editieren / zitieren --> Unities abgeben: Nur für CADwiesel
Zitat: Original erstellt von CADwiesel: auf welche Art sollte denn Sustrahiert werden? wie ich Eingangs schon schrub fällt _subtrakt und _union aus wegen: geht nicht ...
Na dann lies dir deine Frage noch einmal ganz genau durch!! Zitat: Original erstellt von CADwiesel: §D Operationen wie _union oder _subtract geht auch da diese Methoden auch funktionieren, wenn die Objekte sich gar nicht berühren.
Grüße! Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 14. Okt. 2014 14:04 <-- editieren / zitieren --> Unities abgeben: Nur für CADwiesel
Zitat: Original erstellt von Brischke:
Na dann lies dir deine Frage noch einmal ganz genau durch!!
Also ich habe CADWiesel so verstanden, daß er prüfen will, ob sich zwei Zylinder gerade so berühren. Da funktioniert die Subtraktionsmethode nicht, weil man nicht unterscheiden kann, ob die beiden Zylinder sich berühren oder meilenweit voneinander entfernt sind. Das Ergebnis der Subtraktion wäre in beiden Fällen immer das gleiche. Bestenfalls eine Durchdringung könnte man erkennen, aber das ist ja nur die halbe Miete. Oder ich habe entweder das Problem oder den Lösungsvorschlag gar nicht verstanden. Jürgen ------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 14. Okt. 2014 14:22 <-- editieren / zitieren --> Unities abgeben:
jupa hat Recht mit seiner Annahme. Die Lösung, die ich mir jetzt testweise zusammengebaut habe sieht so aus: Code: (progn (setq lastelem(entlast)) (vl-cmdf "_-INTERFERE" aws_org "" aws_org "") (if(=(getvar"cmdactive")1) (progn (command"_Y") (if(=(getvar"cmdactive")1) (command"_n") ) (if(=(getvar"cmdactive")1) (command"_X") ) ) ) (setq newss(ssadd)) (while (setq newelem (entnext lastelem)) (setq newss(ssadd newelem newss)) (setq lastelem newelem) ) )
ich gehe mit 2 aws wobei dies beides die Gleichen sein können in die INTERFERE Funktion, und sammel die neu erstellten Objekte heraus. was 'ne Krücke ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Vino Mitglied
Beiträge: 207 Registriert: 24.05.2005 Windows 10 BricsCAD V20-22
|
erstellt am: 14. Okt. 2014 15:00 <-- editieren / zitieren --> Unities abgeben: Nur für CADwiesel
Hallo nochmal, ok, bei meinem Lösungsansatz vorhin hatte ich einen Denkfehler... mit der (geraden) kürzesten Verbindung klappts nicht. Allerdings... Liefert _INTERFERE nicht die SCHNITTMENGE von 2 Körpern? Dann ist deine jetzige Lösung auch nicht besser als die von Brischke... Ob sich die Körper berühren findest du damit auch nicht heraus. Nur wenn sie sich überlagern, bekommst du ein Ergebnis. Ich hoffe, ich hab nicht schon wieder einen Denkfehler... Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 14. Okt. 2014 18:07 <-- editieren / zitieren --> Unities abgeben:
folgende Lösung kam aus Italien was eigentlich den Kern trifft: Code:
Für Acad bis 2012 (vla-CheckInterference vla-object_a vla-object_b t) oder (vla-CheckInterference vla-object_a vla-object_b :vlax-true)oder ab Acad 2013 (vla-CheckInterference vla-object_a vla-object_b t 'belibigeVariable) oder (vla-CheckInterference vla-object_a vla-object_b :vlax-true 'belibigeVariable)
Das erzeugt ein 3DSolid, welches die Schnittmenge der beiden Übergabezylinder bildet, oder nix, weil das Erste Flag aut 'T steht. Wird dies auf NIL oder :vlax-false gesetzt wird kein Objekt erzeugt. ab 2013 wurde zusätzlich zu der Rückgabe eines vlaObjectes auch noch dieses 2. Flag, welches eben eine Variable sein muss, hinzugefügt. Diese Variable erhält den Wert :vlax-true oder :vlax-fals, je nachdem, ob sich die Objekte Schneiden/Überlagern oder nicht. Wobei es hier ja tatsächlich um Überlagerung und nicht um eine schlichte Berührung geht, wie ich Eingangs leider fälschlich ausgedrückt habe. Vielen Dank für Euer Engagement bei diesem Problem. ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jupa Ehrenmitglied V.I.P. h.c. Ruheständler
Beiträge: 6050 Registriert: 16.09.2004 WINDOWS Vista Ultimate SP2 (64bit), NVIDIA Geforce 9600M GT, AutoCAD 2013.
|
erstellt am: 15. Okt. 2014 09:41 <-- editieren / zitieren --> Unities abgeben: Nur für CADwiesel
Zitat: Original erstellt von CADwiesel:
Wobei es hier ja tatsächlich um Überlagerung und nicht um eine schlichte Berührung geht, wie ich Eingangs leider fälschlich ausgedrückt habe.
Da hast Du uns aber ganz schön auf's Glatteis geführt Jürgen
------------------ Bildung kommt nicht vom Lesen, sondern vom Nachdenken über das Gelesene. (Carl Hilty) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |