;; fitcircle by ymg ;
;; Fit a Circle to a Selection Set of Points ;
;; ;
;; For Derivation of Formulas see: ;
;; http://www.dtcenter.org/met/users/docs/write_ups/circle_fit.pdf ;
;; by R. Bullock ;
(defun c:fc
(/ *AcadDoc
* *error* a avg b cen cu cv dif diff errl m n p pl rad res s ss sum x
) )
)
(setq errl '
("CMDECHO" "DIMZIN") )
)
pl nil
ss
(ssget '
((0 .
"POINT"))) )
)
)
)
)
dif
)
)
)
;; sum contains: (sUU sUV sVV sUUU sUVV sUUV sVVV) ;
r0
(sqrt (+ (* x0 x0
) (* y0 y0
) (/ (+ (car sum
) (caddr sum
)) n
))) )
tol 1e-06
astep 0
areport "Circular Non-Linear Regression Results \n"
)
" Initial: " (itoa aStep
) "\n" " Xo: " (rtos x0
2 8) "\n" " Yo: " (rtos y0
2 8) "\n" " R : " (rtos r0
2 8) "\n\n") )
a00 0.0 a01 0.0 a02 0.0 a03 0.0
a10 0.0 a11 0.0 a12 0.0 a13 0.0
a20 0.0 a21 0.0 a22 0.0 a23 0.0
)
(setq bott
(sqrt(+ (* x x
) (* -2.0 x x0
) (* y y
)(* -2.0 y0 y
) (* x0 x0
)(* y0 y0
))) k1
(sqrt (+ (*(- x x0
)(- x x0
)) (* (- y y0
) (- y y0
)))) a (/ (- x0 x) bott)
b (/ (- y0 y) bott)
c -1.0
k (- 0.0 (- k1 r0))
a00 (+ a00 (* a a)) ; A*Sum(A**2)+B*2Sum(AB) +C*Sum(AC) +Sum(AK) =0
a01 (+ a01 (* a b)) ; A*Sum(AB) +B*2Sum(B**2)+C*Sum(BC) +Sum(BK) =0
a02 (+ a02 (* a c)) ; A*Sum(AC) +B*2Sum(BC) +C*Sum(C**2)+Sum(-K) =0
a03 (+ a03 (* a k))
a11 (+ a11 (* b b))
a12 (+ a12 (* b c))
a13 (+ a13 (* b k))
a22 (+ a22 (* c c))
a23 (+ a23 (* -1. k))
)
)
(setq a10 a01 a20 a02 a21 a12
) )
MatR (Gauss MatA)
x0 (+ x0 a)
y0 (+ y0 b)
r0 (+ r0 c)
)
"Iteration: " (itoa aStep
) "\n" " Xo: " (rtos x0
2 8) "\n" " Yo: " (rtos y0
2 8) "\n" " R : " (rtos r0
2 8) "\n\n" " Matrix : " (rtos a00
2 3) " " (rtos a01
2 3) " " (rtos a02
2 3) " " (rtos a03
2 3) "\n" " " (rtos a10
2 3) " " (rtos a11
2 3) " " (rtos a12
2 3) " " (rtos a13
2 3) "\n" " " (rtos a20
2 3) " " (rtos a21
2 3) " " (rtos a22
2 3) " " (rtos a23
2 3) "\n\n" " Delta X: " (rtos a
2 8) "\n" " Delta Y: " (rtos b
2 8) "\n" " Delta R: " (rtos c
2 8) "\n\n" )
)
)
(setq ;p (cdr (assoc 10 (entget (ssname ss n)))) )
)
)
)
)
;*****************************************************************************;
;; gauss ;
;; Implementation Gaussian Elimination by ElpanovEvgeniy ;
;; For text: 1x+2y+3z=2 ;
;; 10x+1y+8z=17 ;
;; 7z+2y=5 ;
;; (gauss '((1.0 2.0 3.0 2.0) (10.0 1.0 8.0 17.0) (0.0 2.0 7.0 5.0))) ;
;; => ;
;; ((1.0 2.0 3.0 2.0) (0.0 -19.0 -22.0 -3.0) (0.0 0.0 4.68421 4.68421)) ;
;;****************************************************************************;
)
)
lst
)
(gauss
)
)
)
)
)
)
(gauss
)
)
)
)
)
)
)
)
)
)
)