马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1 点是否在直线上
 - (defun pointonline (pt p0 p1 /)
- (if (and pt p0 p1)
- (if (equal (+ (distance p0 pt) (distance p1 pt))
- (distance p0 p1)
- 0.00001
- )
- T
- )
- )
- )
2 圆弧长度
游客,本帖隐藏的内容需要积分高于 50 才可浏览,您当前积分为 0
3 点是否在圆弧上
 - (defun pointonarc (pt cen r pa1 pa2 /)
- (if (and pa1 pa2)
- (if
- (equal (+ (arclength cen r pa1 pt) (arclength cen r pt pa2))
- (arclength cen r pa1 pa2)
- 0.00001
- )
- T
- )
- (if (equal (distance cen pt) r 0.00001)
- T
- )
- )
- )
4 直线和圆的交点
 - (defun inters_linecircle (pl1 pl2 cen r pa1 pa2 cve / x1
- y1 x2 y2 h r2 k yt1 yt2 pt1
- pt2 m yk2 xt1 xt2 a b c z
- lst1
- )
- (setq x1 (car pl1)
- y1 (cadr pl1)
- x2 (car pl2)
- y2 (cadr pl2)
- r2 (expt r 2)
- h (car cen)
- xh2 (expt (- x1 h) 2)
- k (cadr cen)
- )
- (if (equal x2 x1 0.00001)
- (if (>= r2 xh2)
- (setq yt1 (+ (expt (- r2 xh2) 0.5) k)
- yt2 (- k (expt (- r2 xh2) 0.5))
- pt1 (list x1 yt1)
- pt2 (list x1 yt2)
- )
- )
- (progn
- (setq m (/ (- y2 y1) (- x2 x1)))
- (if (equal m 0 0.00001)
- (if (>= r2 (setq yk2 (expt (- y1 k) 2)))
- (setq xt1 (+ (expt (- r2 yk2) 0.5) h)
- xt2 (- h (expt (- r2 yk2) 0.5))
- pt1 (list xt1 y1)
- pt2 (list xt2 y2)
- )
- )
- (progn
- (setq a (+ 1.0 (expt m 2))
- b (- (* 2.0 m (- x1 h (* m k))) (* 2.0 y1))
- c (+ (expt (+ (* m (- h x1)) y1) 2)
- (* (expt m 2) (- (expt k 2) r2))
- )
- )
- (if (>= (setq z (- (expt b 2) (* 4 a c))) 0)
- (setq yt1 (/ (- (expt z 0.5) b) (* 2.0 a))
- yt2 (/ (* -1.0 (+ (expt z 0.5) b)) (* 2.0 a))
- xt1 (+ (/ (- yt1 y1) m) x1)
- xt2 (+ (/ (- yt2 y1) m) x1)
- pt1 (list xt1 yt1)
- pt2 (list xt2 yt2)
- )
- )
- )
- )
- )
- )
- (if (= cve "")
- (progn
- (if (and pt1
- (pointonline pt1 pl1 pl2)
- (pointonarc pt1 cen r pa1 pa2)
- )
- (setq lst1 (append lst1 (list pt1)))
- )
- (if (and pt2
- (pointonline pt2 pl1 pl2)
- (pointonarc pt2 cen r pa1 pa2)
- )
- (setq lst1 (append lst1 (list pt2)))
- )
- )
- (setq lst1 (append lst1 (list pt1) (list pt2)))
- )
- lst1
- )
|