Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Kollisionsprüfung von 3DSolids vom Typ Zylinder

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 14. Okt. 2014 07:36    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 14. Okt. 2014 07:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für CADwiesel 10 Unities + Antwort hilfreich

... 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




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 14. Okt. 2014 09:46    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von jupa an!   Senden Sie eine Private Message an jupa  Schreiben Sie einen Gästebucheintrag für jupa

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für CADwiesel 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Vino an!   Senden Sie eine Private Message an Vino  Schreiben Sie einen Gästebucheintrag für Vino

Beiträge: 207
Registriert: 24.05.2005

Windows 10
BricsCAD V20-22

erstellt am: 14. Okt. 2014 13:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für CADwiesel 10 Unities + Antwort hilfreich

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 14. Okt. 2014 13:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für CADwiesel 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von jupa an!   Senden Sie eine Private Message an jupa  Schreiben Sie einen Gästebucheintrag für jupa

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für CADwiesel 10 Unities + Antwort hilfreich

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




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 14. Okt. 2014 14:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von Vino an!   Senden Sie eine Private Message an Vino  Schreiben Sie einen Gästebucheintrag für Vino

Beiträge: 207
Registriert: 24.05.2005

Windows 10
BricsCAD V20-22

erstellt am: 14. Okt. 2014 15:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für CADwiesel 10 Unities + Antwort hilfreich

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




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 14. Okt. 2014 18:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von jupa an!   Senden Sie eine Private Message an jupa  Schreiben Sie einen Gästebucheintrag für jupa

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für CADwiesel 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz