(defun c:alint ();arclineinters (lp1 lp2 rpt vp1 vp2 / ) (setq line_sel (entsel "\nSelect line") line_ent (entget (car line_sel)) lp1 (cdr (assoc 10 line_ent)) lp2 (cdr (assoc 11 line_ent)) circ_sel (entsel "\nSelect Circle") circ_ent (entget (car circ_sel)) rpt (cdr (assoc 10 circ_ent)) arcrad (cdr (assoc 40 circ_ent)) ) (setq ;;; curextmax (getvar "extmax") ;;; curextmin (getvar "extmin") ;;; curxdist (-(car curextmax)(car curextmin)) ;;; curydist (-(cadr curextmax)(cadr curextmin)) ;;; arcrad (distance rpt vp1) trig_lc_a (distance lp1 lp2) trig_lc_b (distance rpt lp2) trig_lc_c (distance rpt lp1) trig_lc_s (/(+ trig_lc_a trig_lc_b trig_lc_c)2.0) trig_uc_K (sqrt(/(*(- trig_lc_s trig_lc_a)(- trig_lc_s trig_lc_b)(- trig_lc_s trig_lc_c))trig_lc_s)) trig_uc_A (* 2.0 (atan(/ trig_uc_K (- trig_lc_s trig_lc_a)))) trig_uc_B (* 2.0 (atan(/ trig_uc_K (- trig_lc_s trig_lc_b)))) trig_uc_C (* 2.0 (atan(/ trig_uc_K (- trig_lc_s trig_lc_c)))) ) (cond ((or;arc intersection is possible if... (and ;both ends of line lie on circle (eq (distance rpt lp1) arcrad) (eq (distance rpt lp2) arcrad) ) (or ;one end of line lies on circle (eq (distance rpt lp1) arcrad) (eq (distance rpt lp2) arcrad) ) (or ;One end of line is inside circle and one end of line is outside circle (and(<(distance rpt lp1) arcrad)(>(distance rpt lp2) arcrad)) (and(>(distance rpt lp1) arcrad)(<(distance rpt lp2) arcrad)) ) (and ;both ends lie outside circle but height of triangle with line as base <= radius (< trig_uc_B (/ PI 2.0));angle B < 90° (< trig_uc_C (/ PI 2.0));angle C < 90° (> trig_lc_c arcrad);distance from rpt to angle B apex <= arc radius (> trig_lc_b arcrad);distance from rpt to angle C apex >= arc radius (<= (* trig_lc_c (cos (- (/ PI 2.0) trig_uc_B))) arcrad) ) ) (PRINC "\nOK, an intersection is possible... ") (PRINC) ) ) )