(defun ufb00016 ( u_p1 ;線分の始点 u_p2 ;線分の終点 u_pc ;円弧の中心 u_rr ;円弧の半径 u_as ;円弧の始角(度) 0.0 <= u_as < 360.0 u_ae ;円弧の終角(度) 0.0 <= u_ae < 360.0 u_eps ;許容誤差 u_epa ;許容誤差(度) / pout ;交点座標 ; nil:交点がないまたは求めることができない ; ((x y) nil) 1つの交点がある ; ((x y) (x y)) 2つの交点がある pcrs p3 p4 xx yy ll m1 m2 lw ) ;有限線分と円弧の交点を求める (setq pout nil) (setq pcrs (ufb00015 u_p1 u_p2 u_pc u_rr u_as u_ae u_eps u_epa)) (if (/= pcrs nil) (progn (setq p3 nil) (setq p4 nil) (setq xx (- (car u_p2) (car u_p1))) (setq yy (- (cadr u_p2) (cadr u_p1))) (setq ll (sqrt (+ (* xx xx) (* yy yy)))) (setq xx (- (car u_p1) (car (car pcrs)))) (setq yy (- (cadr u_p1) (cadr (car pcrs)))) (setq m1 (sqrt (+ (* xx xx) (* yy yy)))) (setq xx (- (car u_p2) (car (car pcrs)))) (setq yy (- (cadr u_p2) (cadr (car pcrs)))) (setq m2 (sqrt (+ (* xx xx) (* yy yy)))) (setq lw (- (+ m1 m2) u_eps)) (if (> ll lw) (setq p3 (car pcrs)) ) (if (/= (cadr pcrs) nil) (progn (setq xx (- (car u_p1) (car (cadr pcrs)))) (setq yy (- (cadr u_p1) (cadr (cadr pcrs)))) (setq m1 (sqrt (+ (* xx xx) (* yy yy)))) (setq xx (- (car u_p2) (car (cadr pcrs)))) (setq yy (- (cadr u_p2) (cadr (cadr pcrs)))) (setq m2 (sqrt (+ (* xx xx) (* yy yy)))) (setq lw (- (+ m1 m2) u_eps)) (if (> ll lw) (setq p4 (cadr pcrs)) ) ) ) (if (and (/= p3 nil) (/= p4 nil)) (setq pout (list p3 p4)) ) (if (and (/= p3 nil) (= p4 nil)) (setq pout (list p3 nil)) ) (if (and (= p3 nil) (/= p4 nil)) (setq pout (list p4 nil)) ) ) ) pout )