解一元二次方程lisp_晓东CAD家园-论坛-算法与数据结构-Lisp通用最小二乘法-通用最小二乘法在代码和原理上相对比较简单,麻烦的是每次应用都得把高次元参数转换成低次参数,这里写出我的写法和大家探...

;;;-------------------------------------------------------------

(defun LS-Pts->Ellipse (lst  /    n arg_mat   res_vec   a  b

c    d    e f    res  xc   yc   aa  bb

ang  co   si co2  si2)

;; by GSLS(SS)

;; Pointset return Ellipse by Least Square method

;; 2014-01-02

(if (> (setq n (length lst)) 4)

(progn

(mapcar (function (lambda (p / x y)

(setq x (car p)

y (cadr p))

(setq arg_mat (cons (list (* x y) (* y y) x y 1.)

arg_mat)

res_vec (cons (* -1. x x) res_vec))))

lst)

(setq res (solve-odeq arg_mat res_vec))

(mapcar (function set) (quote (a b c d e f)) (cons 1. res))

(if (= a c)

(setq ang _pi2)

(setq ang (* 0.5 (atan (/ b (- a c))))))

(if (and (/= f 0) (/= (setq delt (- (* 4. c) (* b b))) 0))

(progn

(setq xc  (/ (- (* b e) (* 2. c d)) delt)

yc  (/ (- (* b d) (* 2. e)) delt)

co  (cos ang)

si  (sin ang)

co2 (* co co)

si2 (* si si)

bb  (sqrt

(abs (/ (- (* (- (* f co2)

(* (+ (* xc xc)

(* b xc yc)

(* c yc yc))

co2))

(- (* 2 xc si2)

(* 2 yc co si)

(* (+ xc xc (* b yc)) si2)))

(* (- (* f si2)

(* (+ (* xc xc)

(* b xc yc)

(* c yc yc))

si2))

(- (* 2 xc co2)

(* -2 yc co si)

(* (+ xc xc (* b yc)) co2))))

(+ (* 2 xc co2)

(* 2 yc co si)

(- (* (+ xc xc (* b yc)) co2))))))

aa  (*

(sqrt

(abs (- (/ (+ (* 2 xc co2)

(* 2 yc co si)

(* -1 (+ xc xc (* b yc)) co2))

(- (* 2 xc si2)

(* 2 yc co si)

(* (+ xc xc (* b yc)) si2))))))

bb)

)

(list (list xc yc) (polar (list 0 0) ang aa) (/ bb aa)))))

))

;;;-------------------------------------------------------------

;; E.G.

;; For Ellipse

(defun c:test  (/ l r p10 a b p11 d40)

(prompt

"\nFit Ellipse though Least-square method , the points you selected must be at least 5 !!!")

(setq l (mapcar (function (lambda (x) (cdr (assoc 10 (entget x)))))

(vl-remove-if-not

(function (lambda (x) (eq (type x) 'ENAME)))

(mapcar 'cadr (ssnamex (ssget '((0 . "POINT")))))))

l (mapcar (function (lambda (p)

(trans p 0 1 t)))

l))

(if (and (> (length l) 4) (setq r (LS-Pts->Ellipse l)))

(progn

(setq p10 (car r)

p11 (cadr r)

d40 (caddr r))

(entmake

(append

'(

(000 . "ELLIPSE")

(100 . "AcDbEntity")

(100 . "AcDbEllipse"))

(list (cons 10 (trans p10 1 0 t))

(cons 11 (trans p11 1 0))

(cons 40 d40))

(list (cons 210 (trans '(0.0 0.0 1.0) 1 0 t)))))))

(princ)

)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值