Here is my code and testing code. for study a little about trans.
It add a parameter at the end, realint? if nil then virtural intersection will be allowed
The code can be used in 3d ucs plane.
But it is too long code, I will try to shorten it.
;;;by qjchen@gmail.com
;;;;vec plus constant
(defun q:vec:*c(v a) (mapcar '(lambda(x) (* x a)) v))
;;;;vec dot product
(defun q:vec:dot*(v1 v2) (apply '+ (mapcar '* v1 v2)))
;;;;Normalize a vec
(defun q:vec:Norm(v / l) (if (not (zerop (setq l (distance '(0 0 0) v)))) (mapcar '(lambda(x) (/ x l)) v)))
;;;; Intersection of line and circle
;;;; qjchen@gmail.com
(defun q:geo:line-int-cir1(p1 p2 c r realint? / n pv f d2)
(setq n (q:vec:Norm (mapcar '- p2 p1)))
(setq pv (mapcar '+ p1 (q:vec:*c n (q:vec:dot* (mapcar '- c p1) n))))
(defun f(p p1 p2 n) (if (< (* (- (caddr (trans p 0 n)) (caddr (trans p1 0 n))) (- (caddr (trans p 0 n)) (caddr (trans p2 0 n)))) 0.0) p))
(if (< (setq d2 (- (expt r 2.) (expt (distance c pv) 2.))) 0.)
(list nil nil)
(if realint?
(list (f (mapcar '+ pv (q:vec:*c n (sqrt d2))) p1 p2 n) (f (mapcar '- pv (q:vec:*c n (sqrt d2))) p1 p2 n))
(list (mapcar '+ pv (q:vec:*c n (sqrt d2))) (mapcar '- pv (q:vec:*c n (sqrt d2))))
)
)
)
;;;;for test
(defun c:test( / c p1 p2 r res)
(setq p1 (getpoint "1st point\n") p2 (getpoint "2nd point\n") c (getpoint "3rd point\n") r (getdist "distan\n"))
(setq res (q:geo:line-int-cir1 p1 p2 c r T))
(if (car res) (grdraw (list 0 0 0) (car res) 1) )
(if (cadr res) (grdraw (list 0 0 0) (cadr res) 2))
)