这是第1版&需要做更多的工作,但展示了如何通过试错来完成。
- ;; CAB Version 1.0 The Sledge Hammer Approach
- ;; Perhaps someone with a math background can apply the Math solution
- ;; http://demonstrations.wolfram.com/CirclesOfApollonius/
- ;; http://www.geometryexpressions.com/downloads/Circles.pdf example 86
- (defun c:GetColumn (/ p1 p2 p3 r1 r2 r3 c1 c2 c3 rbase rinc fuzz
- cpt pts_c1_c2 pts_c2_c3 pts_c1_c3)
- (vl-load-com)
- (defun MakeCircle (cpt rad lay)
- (entmakex
- (list (cons 0 "CIRCLE")
- (cons 6 "BYLAYER")
- (cons 8 "0")
- (cons 10 cpt)
- (cons 39 0.0)
- (cons 40 rad) ; radius
- (cons 62 256)
- (cons 210 (list 0.0 0.0 1.0))
- )
- )
- )
- ;; return 2 points in a list
- (defun getinters (obj1 obj2)
- (setq iplist (vl-catch-all-apply
- 'vlax-safearray->list
- (list (vlax-variant-value
- (vla-intersectwith obj1 obj2 acextendnone)
- )
- )
- )
- )
- (if (vl-catch-all-error-p iplist) ; error if no intersection
- nil
- (list (list (car iplist)(cadr iplist))(list (cadddr iplist)(nth 4 iplist)))
- )
- )
- (if (or p1 ; debug
- (and (setq p1 (getpoint "\nPick First circle center point."))
- (setq r1 (getdist "\nEnter distance to column.") rx1 r1)
- (setq p2 (getpoint "\nPick Second circle center point."))
- (setq r2 (getdist "\nEnter distance to column.") rx2 r2)
- (setq p3 (getpoint "\nPick Third circle center point."))
- (setq r3 (getdist "\nEnter distance to column.") rx3 r3)
- )
- )
- (progn
- (setq r1 rx1 r2 rx2 r3 rx3) ; debug
- (setq rbase r1
- rinc 0.01 ; step size
- fuzz 0.01)
- (setq c1 (vlax-ename->vla-object (MakeCircle p1 r1 "0")))
- (setq c2 (vlax-ename->vla-object (MakeCircle p2 r2 "0")))
- (setq c3 (vlax-ename->vla-object (MakeCircle p3 r3 "0")))
- (while
- (progn
- (vla-put-radius c1 (setq r1 (+ r1 rinc)))
- (vla-put-radius c2 (setq r2 (+ r2 rinc)))
- (vla-put-radius c3 (setq r3 (+ r3 rinc)))
- (cond
- ((null (setq pts_c1_c2 (getinters c1 c2)))
- (prompt "\nC1 & C2 do not intersect.")
- )
- ((null (setq pts_c2_c3 (getinters c2 c3)))
- (prompt "\nC2 & C3 do not intersect.")
- )
- ((null (setq pts_c1_c3 (getinters c1 c3)))
- (prompt "\nC1 & C3 do not intersect.")
- )
- ;; if 3 of the 6 points are the same the center has been found
- ;; check the first 2 point pair against the remaining two pair
- ((vl-some '(lambda(x) ; 5.77522
- (and
- (or (equal x (car pts_c2_c3) fuzz)
- (equal x (cadr pts_c2_c3) fuzz))
- (or (equal x (car pts_c1_c3) fuzz)
- (equal x (cadr pts_c1_c3) fuzz))))
- pts_c1_c2)
- (MakeCircle (car pts_c1_c2) (- r1 rbase) "0")
- nil ; exit loop
- )
- (t t)
- )
- )
- )
- )
- )
- (princ)
- )
|