- ;; 3-Points to Bulge - M.R.
- (defun MR:3p->bulge ( p1 p2 p3 / mid asin clockwise m12 m23 c r )
- (defun mid ( p1 p2 )
- (mapcar '(lambda ( a b ) (/ (+ a b) 2.0)) p1 p2)
- )
- (defun asin ( x )
- (cond
- ((equal x 1.0 1e- (/ pi 2.0))
- ((equal x -1.0 1e- (* 3.0 (/ pi 2.0)))
- ((equal x 0.0 1e- 0.0)
- ((equal x -0.0 1e- pi)
- ((atan (/ x (sqrt (- 1.0 (* x x))))))
- )
- )
- (defun clockwise ( p1 p2 p3 )
- (minusp (- (* (- (car p2) (car p1)) (- (cadr p3) (cadr p1))) (* (- (car p3) (car p1)) (- (cadr p2) (cadr p1)))))
- )
- (setq m12 (mid p1 p2))
- (setq m23 (mid p2 p3))
- (setq c (inters m12 (polar m12 (+ (angle p1 p2) (* 0.5 pi)) 1.0) m23 (polar m23 (+ (angle p2 p3) (* 0.5 pi)) 1.0) nil))
- (setq r (distance c p1))
- (if (not (clockwise p1 p2 p3))
- (if (<= (rem (+ pi pi (- (angle c p3) (angle c p1))) (+ pi pi)) pi)
- ((lambda ( a ) (/ (sin a) (cos a))) (/ (asin (/ (distance p1 p3) r 2.0)) 2.0))
- ((lambda ( b ) (/ 1.0 b)) ((lambda ( a ) (/ (sin a) (cos a))) (/ (asin (/ (distance p1 p3) r 2.0)) 2.0)))
- )
- (if (<= (rem (+ pi pi (- (angle c p1) (angle c p3))) (+ pi pi)) pi)
- ((lambda ( a ) (- (/ (sin a) (cos a)))) (/ (asin (/ (distance p1 p3) r 2.0)) 2.0))
- ((lambda ( b ) (- (/ 1.0 b))) ((lambda ( a ) (/ (sin a) (cos a))) (/ (asin (/ (distance p1 p3) r 2.0)) 2.0)))
- )
- )
- )
|