;------------------------------------------------------------------------------------------------------------------------------------- ; ; Schnittstelle zu anderen Modulen: ; ; INPUT und INPUTRESTRIKTIONEN ; ============================ ; ; Parameter : ; ; Typ Variablename Variablebeschreibung [Wertebereich] ; list lzent Zentrum Kreis(bogen) ; real rradius Radius Kreis(bogen) ; list lspkt Startpunkt Linie ; list lepkt Endpunkt Linie ; ; OUTPUT und OUTPUTRESTRIKTIONEN ; ================================ ; ; Parameter : ; ; Typ Variablenname Variablenbeschreibung [Wertebereich] ; list lschnpkt Schnittpunkt zwischen Kreis(bogen) und Linie ; nil = kein Schnittpunkt vorhanden ; ;------------------------------------------------------------------------------------------------------------------------------------- ; ( defun schnpkt_kreis_linie ( lzent rradius lspkt lepkt / lepktbrg lgeradebrg lschnpkt lspktbrg lzentbrg rabst rb rd rm rwinkelbm rx1 rx2 ry1 ry2 ) ; Die Punkte der Linie entsprechend dem Zentrum (0.0 0.0 0.0) berechnen (setq lzentbrg (list 0.0 0.0 0.0)) (setq lgeradebrg (polar lzentbrg (wingrbm 90.0) (* rradius 2))) (setq rabst (distance lzent lzentbrg)) (setq rwinkelbm (angle lzent lzentbrg)) (setq lspktbrg (polar lspkt rwinkelbm rabst)) (setq lepktbrg (polar lepkt rwinkelbm rabst)) ; Den Schnittpunkt für das Zentrum (0.0 0.0 0.0) berechnen ; (gemäß Beitrag http://ww3.cad.de/foren/ubb/Forum145/HTML/003455.shtml#000010) (setq lschnpkt nil) (if (setq rb (cadr (inters lspktbrg lepktbrg lzentbrg lgeradebrg nil))) (progn (setq rm (/ (- (cadr lepktbrg) (cadr lspktbrg)) (- (car lepktbrg) (car lspktbrg)))) ; Diskriminante rd = rradius² * (1 + rm²) - rb² ; rd>0 -> Kreis wird in zwei Punkten geschnitten ; rd=0 -> Kreis wird in einem Punkten berührt ; rd<0 -> Kreis wird von Gerade gemieden (setq rd (- (* (* rradius rradius) (1+ (* rm rm))) (* rb rb))) (if (equal rd 0.0 0.0001) (setq rd 0.0)) (if (>= rd 0.0) (progn (setq rx1 (/ (+ (* -1 rm rb) (sqrt rd)) (1+ (* rm rm)))) (setq rx2 (/ (- (* -1 rm rb) (sqrt rd)) (1+ (* rm rm)))) (setq ry1 (/ (+ rb (* rm (sqrt rd))) (1+ (* rm rm)))) (setq ry2 (/ (- rb (* rm (sqrt rd))) (1+ (* rm rm)))) (setq lschnpkt (list rx2 ry2 0.0)) ) ; progn ) ; if ) ; progn ) ; if ; Den Schnittpunkt gegebenenfalls für das tatsächliche Zentrum berechnen (if (/= lschnpkt nil) (progn (setq rabst (distance lzentbrg lzent)) (setq rwinkelbm (angle lzentbrg lzent)) (setq lschnpkt (polar lschnpkt rwinkelbm rabst)) ) ; progn ) ; if ; Rückgabewert lschnpkt ) ; Modulende