| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Schnittpunkt ohne Geometrie (3857 mal gelesen)
|
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 01. Aug. 2011 10:28 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich möchte den Schnittpunkt einer Linie und einem Kreisbogen berechnen, jedoch ohne dass die Objekte vorhanden sind. Wären diese vorhanden, könnte ich es wie im Beitrag http://ww3.cad.de/foren/ubb/Forum145/HTML/000302.shtml machen. Wären es zwei Linien würde die Lisp-Funktion (inters lpkt1s lpkt1e lpkt2s lpkt2e nil) funktionieren. Folglich suche ich eine ähnliche Lisp-Funktion zu inters, die aber den Schnittpunkt einer Linie und einem Kreisbogen berechnet. Diese Werte sind mir bekannt: - Startpunkt Linie - Endpunkt Linie - Radius Kreisbogen - Startpunkt Kreisbogen - Endpunkt Kreisbogen - Zentrum Kreisbogen Wie kann ich den Schnittpunkt einer Linie und einem Kreisbogen ohne vorhandene Objekte ermitteln? Danke im Voraus und viele Grüße Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 01. Aug. 2011 10:46 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
|
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 01. Aug. 2011 11:30 <-- editieren / zitieren --> Unities abgeben:
|
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 01. Aug. 2011 11:56 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 01. Aug. 2011 11:59 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
Zitat: Original erstellt von Bernd10: Hallo Thomas,danke für Deine Antwort. Das übersteigt meine Mathe-Kenntnisse. Ich verstehe zwar noch, dass es die drei Fälle geben kann, aber dann ist es vorbei mit meinem Verständnis. Eine Umsetzung in eine Lisp-Funktion ist mir deshalb leider nicht möglich. Viele Grüße Bernd [Diese Nachricht wurde von Bernd10 am 01. Aug. 2011 editiert.]
1. Zentrum des Kreises berechnen 2. Normalvektor vom Zentrum des Kreises auf die Linie ermitteln 3. Schnittpunkt der Linie, die der Normalvektor bildet, mit der Schnittlinie ermitteln 4. Abstand zwischen Zentrum und diesem Schnittpunkt ermitteln Aus dem Vergleich dieses ermittelten Abstands und dem Kreisradius kannst Du erkennen, um welchen der drei Fälle es sich handelt. Aus dem Verhältnis dieses Abstands und des Radius kannst Du auch die eventuellen Schnittpunkte der Schnittlinie mit dem Kreis ermitteln (Stichwort: Fasskreisbogen). Falls Dir die Mathematik zu kompliziert ist, dann hilft Dir GEOMCAL weiter. Im deutschen AutoCAD einfach die Hilfe zum Befehl "KAL" aufrufen, und dort z.B. nach "Abstand zwischen Punkt und Linie" suchen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 01. Aug. 2011 12:06 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
hallo bernd, gegeben ist p1, p2 von linie p1, p2, cp, radius von bogen fuer die schnittpunktbetrachtung einer liene mit einem bogen benoetigst du erstmal die schnittpunkte der geraden y=mx+b mit dem kreis x²+y²=r². als erstes tranferierst du die linienpunkte in das lokale koordinatensystem (ks) des kreises (zentrumspunkt kreis 0,0). wenn die x-werte der 2 punkte der geraden identisch sind, drehst du das ks um 90°, da der anstieg "m" bei 90° bzw. 270° unendlich ist. dann berechnest du "b" (Abstand auf der y-Achse des lokalen ks) mit
Code: (setq b (inters p1 p2 '(0.0 0.0) '(0.0 1000.0) nil))
und dann den anstieg "m" mit
Code: (setq m (/ (- (cadr p2) (cadr p1)) (- (car p2) (car p1))))
und dann die diskiminante "D"
Code: (setq D (- (* (* radius radius) (1+ (* m m))) (* b b)))
wenn D < 0 -> keine schnittpunkte -> fertig wenn D >= 0, dann
Code:
(setq x1 (/ (+ (* -1 m b) (sqrt D)) (1+ (* m m)))) (setq x2 (/ (- (* -1 m b) (sqrt D)) (1+ (* m m)))) (setq y1 (/ (+ b (* m (sqrt D))) (1+ (* m m)))) (setq y2 (/ (- b (* m (sqrt D))) (1+ (* m m))))
bei D=0 ist x1 = x und y1 = y2 jetzt noch die koordinaten zuruecktransferieren (wenn du am anfang das ks auch drehen musstest, musst du es jetzt natuerlich auch zurueckdrehen) und du hast die schnittpunkte in deinem globalen ks.nun kannst du dich um die schnittpunkte auf dem bogen ueber winkelbeziehungen kuemmern. dabei muss du auch wieder 3 faelle unterscheiden: 0, 1 oder 2 schnittpunkte ------------------ Marco Heuer www.arc-aachen.de Airport Office Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 01. Aug. 2011 14:42 <-- editieren / zitieren --> Unities abgeben:
|
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 01. Aug. 2011 14:59 <-- editieren / zitieren --> Unities abgeben:
Hallo archtools, danke für Deine Antwort. Zitat: Original erstellt von archtools:
Falls Dir die Mathematik zu kompliziert ist, dann hilft Dir GEOMCAL weiter. Im deutschen AutoCAD einfach die Hilfe zum Befehl "KAL" aufrufen, und dort z.B. nach "Abstand zwischen Punkt und Linie" suchen.
Ich habe den von Dir genannten Punkt beim Befehl Kal in der AutoCad-Hilfe nicht gefunden. Allerdings steht bei Befehle > K -Befehle > KAL > Ermitteln eines Schnittpunktes die Funktion ilp. Muss ich diese Funktion für den von Dir genannten Ablauf verwenden? Viele Grüße Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 01. Aug. 2011 17:37 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
Zitat: Original erstellt von Bernd10: Hallo archtools,danke für Deine Antwort. Ich habe den von Dir genannten Punkt beim Befehl Kal in der AutoCad-Hilfe nicht gefunden. Allerdings steht bei Befehle > K -Befehle > KAL > Ermitteln eines Schnittpunktes die Funktion ilp. Muss ich diese Funktion für den von Dir genannten Ablauf verwenden? Viele Grüße Bernd
Such' noch ein bißchen weiter - am besten, Du liest Dir erst mal alle vordefinierten Funktionsnamen durch, damit Du überhaupt weisst, was es alles gibt. Mit DPL (DISTANCE from POINT to LINE) dürftest Du den Großteil der benötigten Information schon haben.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 02. Aug. 2011 09:59 <-- editieren / zitieren --> Unities abgeben:
Hallo Marco, danke für Deine Antwort. Ich bin mit dem unten stehenden Programmcode soweit, dass ich den Schnittpunkt einer Geraden zum Kreisbogen berechnen kann. Zum Verständnis ist in der Anlage ein Bild enthalten. Ich möchte dabei den Schnittpunkt der schwarze Linie mit dem schwarzen Kreisbogen ermitteln. Die gelbe Linie ergibt sich aus dem Zentrum des Kreisbogen und dem berechneten Schnittpunkt einer Geraden mit dem folgenden Programmcode. ( defun schnpkt_kreis_linie ( lkbzentrum rradius llinspkt llinepkt / lzentbrg lschnpkt lschnpktbrg rabst rradius2 rwinkelbm rxkoor rxkoor2 rydelta rykoor ) ; Den Schnittpunkt für das Zentrum (0.0 0.0 0.0) berechnen (setq lzentbrg (list 0.0 0.0 0.0)) (setq rradius2 (expt rradius 2)) (setq rxkoor (xdelta_ermitteln llinspkt lkbzentrum)) (setq rxkoor2 (expt rxkoor 2)) (setq rykoor (sqrt (abs (- rradius2 rxkoor2)))) ; Formel bei Zentrum (0.0 0.0 0.0) (setq rydelta (ydelta_ermitteln llinspkt lkbzentrum)) (if (< rydelta 0.0) ; Y-Koordinate des Punktes kleiner als die Y-Koordinate (setq rykoor (* rykoor -1)) ; des Zentrumes des Kreis(bogen)bogens -> unterer Schnittpunkt ) ; if (setq lschnpktbrg (list rxkoor rykoor 0.0)) ; ; Hier fehlt noch etwas... ; ; Den Schnittpunkt für das tatsächliche Zentrum berechnen (setq rabst (distance lzentbrg lkbzentrum)) (setq rwinkelbm (angle lzentbrg lkbzentrum)) (setq lschnpkt (polar lschnpktbrg rwinkelbm rabst)) ; Rückgabewert lschnpkt ) ; Modulende Mir fehlt nun noch die Berücksichtigung, dass meine Linie keine Gerade ist. Leider kann ich nicht erkennen, wie ich Deine Codezeilen in meine Funktion übernehemn muss. Kannst Du mir da weiterhelfen? Viele Grüße Bernd
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 02. Aug. 2011 11:35 <-- editieren / zitieren --> Unities abgeben: Nur für Bernd10
also nochmal (zusammenhaengend, nix anderes steht auch oben) gegeben ist pt1, pt2 von linie cp, rad von kreis das code-schnipsel ist fuer das lokale koordinatensystem des kreises mit cp(x,y) = 0,0. es wird nicht der sonderfall x(pt1) = x(pt2) beruecksichtigt (m->oo), dafuer muss noch das koordinatensystem gedreht werden. berechnet werden wirkliche und virtuelle schnittpunkte einer linie mit einem kreis (in deinem bsp. wuerde es sich um einen virtuellen schnittpunkt handeln). Code:
(if (setq b (cadr (inters pt1 pt2 '(0.0 0.0) '(0.0 1000.0) nil))) (progn (setq m (/ (- (cadr pt2) (cadr pt1)) (- (car pt2) (car pt1)))) ; Diskriminante D = r² * (1 + m²) - b² ; D>0 -> Kreis wird in zwei Punkten geschnitten ; D=0 -> Kreis wird in einem Punkten berührt ; D<0 -> Kreis wird von Gerade gemieden (setq D (- (* (* rad rad) (1+ (* m m))) (* b b))) (if (equal D 0.0 0.0001) (setq D 0.0)) (if (>= D 0.0) (progn (setq x1 (/ (+ (* -1 m b) (sqrt D)) (1+ (* m m)))) (setq x2 (/ (- (* -1 m b) (sqrt D)) (1+ (* m m)))) (setq y1 (/ (+ b (* m (sqrt D))) (1+ (* m m)))) (setq y2 (/ (- b (* m (sqrt D))) (1+ (* m m)))) ) nil ) ) nil )
------------------ Marco Heuer www.arc-aachen.de Airport Office Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd10 Mitglied
Beiträge: 763 Registriert: 20.11.2003 Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz 16 GB RAM Windows 10 Pro 64-bit AutoCAD Mechnical 2020 Deu
|
erstellt am: 02. Aug. 2011 16:04 <-- editieren / zitieren --> Unities abgeben:
|