{"id":1299,"date":"2013-05-10T19:58:53","date_gmt":"2013-05-10T11:58:53","guid":{"rendered":"https:\/\/www.highflybird.com\/blog\/?p=147"},"modified":"2013-05-10T19:58:53","modified_gmt":"2013-05-10T11:58:53","slug":"%e6%a4%ad%e5%9c%86%e8%ae%ba","status":"publish","type":"post","link":"https:\/\/www.highflybird.com\/blog\/?p=1299","title":{"rendered":"\u692d\u5706\u8bba"},"content":{"rendered":"<p>\u5bf9\u692d\u5706\u7684\u7814\u7a76\u3002\u5176\u4e2d\u6709\u5927\u91cf\u7684\u4f7f\u7528\u51fd\u6570\uff1a<br \/>\n\u5305\u62ec\u692d\u5706\u7684\u5c55\u5f00\uff0c\u692d\u5706\u7684\u76f8\u4ea4\uff0c\u692d\u5706\u7684\u4f5c\u56fe\uff0c\u692d\u5706\u7684\u9762\u79ef\uff0c\u5468\u957f\u7b97\u6cd5\u4ee5\u53ca\u4e0e\u692d\u5706\u76f8\u5173\u7684\u65b9\u7a0b\u7b49\u8f83\u4e3a\u9ad8\u7ea7\u77e5\u8bc6\u3002<br \/>\n\u4e0b\u9762\u662f\u4ee3\u7801\uff1a<\/p>\n<p><!--more--><\/p>\n<p>\u4e00\u3001\u692d\u5706\u7684\u57fa\u672c\u8981\u7d20\u4e0e\u5176\u521b\u5efa\u548c\u66f4\u65b0<br \/>\n[codesyntax lang=&#8221;lisp&#8221;]<br \/>\n;|\u4e00 \u692d\u5706\u7684\u51e0\u4e2a\u57fa\u672c\u53c2\u6570\uff1a<br \/>\nDXF \u7ec4\u7801\u4e2d\u7684\u51e0\u4e2a\u6570\u503c<br \/>\n 10  \u692d\u5706\u4e2d\u5fc3<br \/>\n 11  \u957f\u8f74\u77e2\u91cf<br \/>\n 40  \u957f\u77ed\u6bd4\u7387<br \/>\n 41  \u8d77\u70b9\u89d2\u5ea6<br \/>\n 42  \u7ec8\u70b9\u89d2\u5ea6<br \/>\n210  \u6cd5\u7ebf\u77e2\u91cf<br \/>\n\u8fd9\u4e9b\u53c2\u6570\u53ef\u4ee5\u7531entget\u5f97\u5230\uff0c\u4e5f\u53ef\u4ee5\u7531activeX\u65b9\u6cd5\u5f97\u5230\u3002<br \/>\n\u6ce8: \u8d77\u70b9\u89d2\u5ea6\u548c\u7ec8\u70b9\u89d2\u5ea6\u7684\u8ba1\u7b97\uff0c\u5982\u679c\u662f\u4e0d\u662f\u692d\u5706\u5f27\uff0c\u662f\u5168\u692d\u5706\uff0c\u5219\u8fd9\u4e2a\u6570\u503c\u4e3a\uff1a<br \/>\n    O \u548c2Pi\uff0c\u5982\u679c\u662f\u692d\u5706\u5f27\uff0c\u5219\u5982\u56fe1\uff1b<br \/>\n    \u9700\u8981\u6ce8\u610f\u7684\u662fvla-get-StartAngle \u548c vla-get-StartParameter \u5728\u4e00\u822c\u60c5\u51b5<br \/>\n    \u4e0b\uff0c\u662f\u4e24\u4e2a\u4e0d\u540c\u6570\u503c\uff0c\u5b83\u4eec\u6240\u4ee3\u8868\u7684\u89d2\u5ea6\u7684\u610f\u4e49\u5982\u4e0a\u56fe\u3002\u540c\u6837\u53bb\u7406\u89e3:<br \/>\n    vla-get-EngAngle \u548c vla-get-EndParameter. \u4f46\u662f:<br \/>\n    vla-get-StartParameter = vlax-curve-getStartParam<br \/>\n    vla-get-EndParameter = vlax-curve-getEndParam<br \/>\n    vlax-curve-getParamAtPoint \u5176\u53c2\u6570\u53ef\u6309\u7167\u4e0a\u8ff0\u65b9\u5f0f\u53bb\u7406\u89e3\u3002|;<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u753b\u4e00\u4e2a\u692d\u5706<br \/>\n;;; \u8f93\u5165: \u4e2d\u5fc3\uff0c\u957f\u8f74\uff0c\u77ed\u8f74\u548c\u65cb\u8f6c\u89d2\u5ea6<br \/>\n;;; \u8f93\u51fa: \u6210\u529f\u8fd4\u56de\u692d\u5706\u7684\u56fe\u5143\u540d\uff0c\u5426\u5219\u8fd4\u56denil<br \/>\n;;;=====================================================================<br \/>\n(defun Ent:Make_Ellipse (cen a b ang  \/ maj rat)<br \/>\n  (if (&gt; b a)<br \/>\n    (setq maj (polar &#8216;(0 0 0) (+ ang (* pi 0.5)) b)<br \/>\n          rat (\/ a (float b))<br \/>\n    )<br \/>\n    (setq maj (polar &#8216;(0 0 0) ang a)<br \/>\n          rat (\/ b (float a))<br \/>\n    )<br \/>\n  )<br \/>\n  (entmakeX<br \/>\n    (list<br \/>\n      &#8216;(0 . &#8220;ELLIPSE&#8221;)<br \/>\n      &#8216;(100 . &#8220;AcDbEntity&#8221;)<br \/>\n      &#8216;(100 . &#8220;AcDbEllipse&#8221;)<br \/>\n      (cons 10 cen)<br \/>\n      (cons 11 maj)<br \/>\n      (cons 40 rat)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun Ent:Make_Ellipse_1 (cen maj rat)<br \/>\n  (entmakeX<br \/>\n    (list<br \/>\n      &#8216;(0 . &#8220;ELLIPSE&#8221;)<br \/>\n      &#8216;(100 . &#8220;AcDbEntity&#8221;)<br \/>\n      &#8216;(100 . &#8220;AcDbEllipse&#8221;)<br \/>\n      (cons 10 cen)<br \/>\n      (cons 11 maj)<br \/>\n      (cons 40 rat)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u753b\u4e00\u4e2a\u7a7a\u4e09\u7ef4\u7a7a\u95f4\u7684\u692d\u5706<br \/>\n;;; \u8f93\u5165: \u4e2d\u5fc3\uff0c\u957f\u8f74\uff0c\u77ed\u8f74\u3001\u65cb\u8f6c\u89d2\u5ea6\u548c\u6cd5\u7ebf\u77e2\u91cf<br \/>\n;;; \u8f93\u51fa: \u6210\u529f\u8fd4\u56de\u692d\u5706\u7684\u56fe\u5143\u540d\uff0c\u5426\u5219\u8fd4\u56denil<br \/>\n;;;=====================================================================<br \/>\n(defun Ent:Make_Ellipse_3d (cen a b ang an1 an2 Normal \/ maj rat)<br \/>\n  (if (&gt; b a)<br \/>\n    (setq maj (polar &#8216;(0 0 0) (+ ang (* pi 0.5)) b)<br \/>\n          rat (\/ a b 1.0)<br \/>\n    )<br \/>\n    (setq maj (polar &#8216;(0 0 0) ang a)<br \/>\n          rat (\/ b a 1.0)<br \/>\n    )<br \/>\n  )<br \/>\n  (setq Normal (mat:unit Normal))<br \/>\n  (setq maj (trans maj Normal 0 T))<br \/>\n  (entmakeX<br \/>\n    (list<br \/>\n      &#8216;(0 . &#8220;ELLIPSE&#8221;)<br \/>\n      &#8216;(100 . &#8220;AcDbEntity&#8221;)<br \/>\n      &#8216;(100 . &#8220;AcDbEllipse&#8221;)<br \/>\n      (cons 10 cen)<br \/>\n      (cons 11 maj)<br \/>\n      (cons 40 rat)<br \/>\n      (cons 41 an1)<br \/>\n      (cons 42 an2)<br \/>\n      (cons 210 Normal)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u753b\u4e00\u4e2a\u692d\u5706\u5f27<br \/>\n;;; \u8f93\u5165: \u4e2d\u5fc3\uff0c\u957f\u8f74\uff0c\u77ed\u8f74\u548c\u65cb\u8f6c\u89d2\u5ea6\uff0c\u8d77\u59cb\u89d2\u5ea6\uff0c\u7ec8\u70b9\u89d2\u5ea6<br \/>\n;;; \u8f93\u51fa: \u6210\u529f\u8fd4\u56de\u692d\u5706\u5f27\u7684\u56fe\u5143\u540d\uff0c\u5426\u5219\u8fd4\u56denil<br \/>\n;;;=====================================================================<br \/>\n(defun Ent:Make_EllipseArc (cen a b ang an1 an2 \/ maj rat)<br \/>\n  (if (&gt; b a)<br \/>\n    (setq maj (polar &#8216;(0 0 0) (+ ang (* pi 0.5)) b)<br \/>\n          rat (\/ a b 1.0)<br \/>\n    )<br \/>\n    (setq maj (polar &#8216;(0 0 0) ang a)<br \/>\n          rat (\/ b a 1.0)<br \/>\n    )<br \/>\n  )<br \/>\n  (entmakeX<br \/>\n    (list<br \/>\n      &#8216;(0 . &#8220;ELLIPSE&#8221;)<br \/>\n      &#8216;(100 . &#8220;AcDbEntity&#8221;)<br \/>\n      &#8216;(100 . &#8220;AcDbEllipse&#8221;)<br \/>\n      (cons 10 cen)<br \/>\n      (cons 11 maj)<br \/>\n      (cons 40 rat)<br \/>\n      (cons 41 an1)<br \/>\n      (cons 42 an2)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u4ece\u67d0\u4e00\u70b9\u83b7\u53d6\u692d\u5706\u7684\u53c2\u6570(\u7eaf\u6570\u5b66\u6cd5)<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u4e0a\u7684\u4e00\u70b9\u548c\u6784\u6210\u692d\u5706\u7684\u53c2\u6570\uff1a\u4e2d\u5fc3\uff0c\u534a\u957f\u8f74\uff0c\u534a\u77ed\u8f74\u548c\u65cb\u8f6c\u89d2<br \/>\n;;; \u8f93\u51fa: \u6b64\u70b9\u7684\u53c2\u6570\u503c<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:GetParam (pt Cen a b ang \/ x y p)<br \/>\n  (setq p (mapcar &#8216;- pt cen))<br \/>\n  (setq x (car p))<br \/>\n  (setq y (cadr p))<br \/>\n  (atan<br \/>\n    (* a (- (* y (cos ang))(* x (sin ang))))<br \/>\n    (* b (+ (* x (cos ang))(* y (sin ang))))<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u66f4\u65b0\u5e73\u9762\u692d\u5706<br \/>\n;;; \u8f93\u5165: \u8981\u66f4\u65b0\u7684\u5b9e\u4f53\u540d\uff0c\u66f4\u65b0\u540e\u7684\u4e2d\u5fc3\uff0c\u534a\u957f\u8f74\uff0c\u534a\u77ed\u8f74\u548c\u65cb\u8f6c\u89d2<br \/>\n;;; \u8f93\u51fa: \u6210\u529f\u8fd4\u56de\u8be5\u5b9e\u4f53\u540d\uff0c\u5426\u5219\u8fd4\u56denil<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Update (ent cen a b ang \/ D C X R m n an)<br \/>\n  (if (&gt; b a)<br \/>\n    (setq m b n a an (+ ang (\/ pi 2)))<br \/>\n    (setq m a n b an ang)<br \/>\n  )<br \/>\n  (setq D (entget ent))<br \/>\n  (setq C (cons 10 cen))<br \/>\n  (setq X (cons 11 (polar &#8216;(0. 0. 0.) an m)))<br \/>\n  (setq R (cons 40 (\/ n m 1.0)))<br \/>\n  (setq D (subst C (assoc 10 D) D))<br \/>\n  (setq D (subst X (assoc 11 D) D))<br \/>\n  (setq D (subst R (assoc 40 D) D))<br \/>\n  (entmod D)<br \/>\n  (entupd ent)<br \/>\n)<br \/>\n[\/codesyntax]<br \/>\n\u4e8c \u00a0\u692d\u5706\u7684\u66f2\u7387\u3001\u5f27\u957f\u3001\u9762\u79ef\u548c\u79bb\u5fc3\u7387<br \/>\n[codesyntax lang=&#8221;lisp&#8221;];;;=====================================================================<br \/>\n;;;\u529f\u80fd: \u83b7\u53d6\u692d\u5706\u4e0a\u4e00\u70b9\u5904\u7684\u66f2\u7387\u548c\u8f6c\u5f2f\u534a\u5f84<br \/>\n;;;\u53c2\u6570: \u692d\u5706\u5b9e\u4f53\u548c\u692d\u5706\u4e0a\u7684\u4e00\u70b9<br \/>\n;;;\u8fd4\u56de: \u6b64\u5904\u79bb\u5fc3\u5706\u5706\u5fc3\u3001\u8f6c\u5f2f\u534a\u5f84\u53ca\u5176\u66f2\u7387\uff08\u79bb\u5fc3\u7387\uff09<br \/>\n;;;\u8bf4\u660e: \u5982\u679c\u8981\u5728CAD\u4e2d\u51e0\u4f55\u4f5c\u56fe\uff0c\u53ef\u4ee5\u53c2\u8003\u6b64\u8d34\uff1a<br \/>\n;;;      http:\/\/bbs.mjtd.com\/thread-62980-1-1.html<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:GetCurvature (en pt \/ dxf maj rat a b p par x y k v1 v2 rad cen)<br \/>\n  (setq dxf (entget en))<br \/>\n  (setq maj (cdr (assoc 11 dxf)))<br \/>\n  (setq rat (cdr (assoc 40 dxf)))<br \/>\n  (setq a   (distance &#8216;(0 0) maj))<br \/>\n  (setq b   (* a rat))<br \/>\n  (setq p   (vlax-curve-getclosestpointto en pt))<br \/>\n  (setq par (vlax-curve-getParamAtPoint en p))<br \/>\n  (setq v1  (vlax-curve-getFirstDeriv en par))<br \/>\n  (setq v2  (list (- (cadr v1)) (car v1) (caddr v1)))<br \/>\n  (setq x   (* a (cos par)))<br \/>\n  (setq y   (* b (sin par)))<br \/>\n  (setq k   (expt rat 4))<br \/>\n  (setq rad (\/ (expt (+ (* y y) (* k x x)) 1.5) rat rat b b))<br \/>\n  (setq cen (polar p (angle &#8216;(0 0 0) v2) rad))<br \/>\n  (list cen rad (\/ 1 rad))<br \/>\n)<\/p>\n<p>;;;\u6d4b\u8bd5\u692d\u5706\u7684\u66f2\u7387:<br \/>\n(defun c:GetCurvature (\/ sel ent dxf pnt ret)<br \/>\n  (setq sel (nentselp &#8220;n\u9009\u53d6\u692d\u5706\uff1a&#8221;))<br \/>\n  (if (and (setq ent (car sel))<br \/>\n           (setq dxf (entget ent))<br \/>\n           (= &#8220;ELLIPSE&#8221; (cdr (assoc 0 dxf)))<br \/>\n      )<br \/>\n    (progn<br \/>\n      (setq pnt (cadr sel))<br \/>\n      (setq ret (ELL:GetCurvature ent (trans pnt 1 0)))<br \/>\n      (princ ret)<br \/>\n      (entmakeX<br \/>\n        (list<br \/>\n          &#8216;(0 . &#8220;CIRCLE&#8221;)<br \/>\n          (cons 10 (car ret))<br \/>\n          (cons 40 (cadr ret))<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u692d\u5706\u7684\u79bb\u5fc3\u7387\u7531\u692d\u5706\u7684\u957f\u77ed\u6bd4\u7387\u5f97\u51fa\u3002(sqrt  (- 1 (* ratio ratio)))<br \/>\n;;; \u79bb\u5fc3\u7387\u8d8a\u5927\u5706\u5c31\u8d8a\u6241\uff0c\u8d8a\u5c0f\u5219\u8d8a\u63a5\u8fd1\u4e8e\u5706<br \/>\n;;;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n;;; \u529f\u80fd: \u83b7\u53d6\u692d\u5706\u7684\u79bb\u5fc3\u7387\uff0c\u503c\u8d8a\u5927\u5f62\u72b6\u8d8a\u6241\uff0c\u8d8a\u5c0f\u8d8a\u63a5\u8fd1\u5706<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u7684\u56fe\u5143\u540d<br \/>\n;;; \u8f93\u51fa: \u692d\u5706\u7684\u79bb\u5fc3\u7387<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Eccentricity (e \/ ratio)<br \/>\n  (setq ratio (cdr (assoc 40 (entget e))))<br \/>\n  (sqrt (- 1 (* ratio ratio)))<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u53cd\u4f59\u5207\u51fd\u6570<br \/>\n;;;=====================================================================<br \/>\n(defun Math:acot (x y)<br \/>\n  (atan y x)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u516d\u4e2a\u53c2\u6570\u7684\u692d\u5706\u65b9\u7a0b<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:QuadraticEquation (a b c d f g \/ O S I J K M R X Y)<br \/>\n  (setq b (* 0.5 b))<br \/>\n  (setq d (* 0.5 d))<br \/>\n  (setq f (* 0.5 f))<br \/>\n  (setq S (mat:det3 a b d b c f d f g))<br \/>\n  (setq J (- (* a c) (* b b)))<br \/>\n  (setq I (float (+ a c)))<br \/>\n  (if (and (not (equal S 0 1e-14)) (&gt; j 0) (MINUSP (\/ S I)))<br \/>\n    (progn<br \/>\n      (setq O (list (\/ (- (* b f) (* c d)) j) (\/ (- (* b d) (* a f)) j)))<br \/>\n      (setq k (- (+ (* a f f) (* c d d) (* g b b)) (* 2 b d f) (* a c g)))<br \/>\n      (setq k (+ k k))<br \/>\n      (setq m (sqrt (+ (* 4 b b) (* (- a c) (- a c)))))<br \/>\n      (setq x (sqrt (\/ k (* J (- I m)))))<br \/>\n      (setq y (sqrt (\/ k (* J (+ I m)))))<br \/>\n      (setq r (* 0.5 (atan (+ b b) (- a c))))<br \/>\n      (list O x y (+ r (* pi 0.5)))<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun ELL:5PE (p1 p2 p3 p4 p5 \/ ret)<br \/>\n  (setq<br \/>\n    ret<br \/>\n    (Mat:Gauss_Equations<br \/>\n      (mapcar<br \/>\n        (function<br \/>\n          (lambda (p \/ x y)<br \/>\n            (setq x (car p))<br \/>\n            (setq y (cadr p))<br \/>\n            (list (* x y) (* y y) x y 1 (- (* x x)))<br \/>\n          )<br \/>\n        )<br \/>\n        (list p1 p2 p3 p4 p5)<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n  (if ret<br \/>\n    (apply &#8216;ELL:QuadraticEquation (cons 1 ret))<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:xxx ()<br \/>\n  (setq i 1)<br \/>\n  (setq lst nil)<br \/>\n  (while (&lt; i 6)<br \/>\n    (initget 1)<br \/>\n    (setq p (getpoint (strcat &#8220;n\u7b2c&#8221; (itoa i) &#8220;\u70b9:&#8221;)))<br \/>\n    (setq i (1+ i))<br \/>\n    (ent:make_point p)<br \/>\n    (setq lst (cons p lst))<br \/>\n  )<br \/>\n  (setq kkk (apply &#8216;ELL:5PE lst))<br \/>\n  (defun f1 (lst)<br \/>\n    (apply &#8216;ell:5pe lst)<br \/>\n  )<br \/>\n  (defun f2 (lst)<br \/>\n    (apply &#8216;ELL:5PEllipse lst)<br \/>\n  )<br \/>\n  (misc:test 10000<br \/>\n    &#8216;((f1 lst)<br \/>\n      (f2 lst)<br \/>\n     )<br \/>\n  )<br \/>\n  (if kkk<br \/>\n    (apply &#8216;Ent:make_ellipse kkk)<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u8bf4\u660e: \u6b64\u51fd\u6570\u4e3a\u7eaf\u6570\u5b66\u8ba1\u7b97\uff0c\u610f\u5473\u53ef\u4e0d\u7528\u56fe\u5143\u53c2\u4e0e\uff0c\u91c7\u7528\u4e86\u9f99\u8d1d\u5854\u79ef\u5206\u6cd5\u3002<br \/>\n;;;       \u9002\u7528\u4e8e\u67d0\u4e9b\u7279\u6b8a\u60c5\u51b5\u3002\u4e00\u822c\u53ef\u7528vlax-curve\u51fd\u6570\u83b7\u5f97\u3002\u89c1\u6837\u4f8b\u3002<br \/>\n;;; \u529f\u80fd: \u83b7\u53d6\u692d\u5706\u5f27\u7684\u957f\u5ea6\u3002<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u7684\u957f\u534a\u8f74\uff0c\u77ed\u534a\u8f74\uff0c\u53c2\u65701\uff0c\u53c2\u65702\u548c\u7cbe\u5ea6<br \/>\n;;; \u8f93\u51fa: \u692d\u5706\u5f27\u7684\u957f\u5ea6<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Length (la lb p1 p2 eps \/ Func ratio 0.5Pi)<br \/>\n  (defun Func (x \/ cx ee)<br \/>\n    (setq cx (cos x))<br \/>\n    (setq ee (* (1+ ratio) (1- ratio)))<br \/>\n    (sqrt (1+ (* ee cx cx)))<br \/>\n  )<\/p>\n<p>  (if (&lt;= lb la)<br \/>\n    (progn<br \/>\n      (setq ratio (\/ lb (float la)))<br \/>\n      (* la (Math:Romberg p1 p2 eps))<br \/>\n    )<br \/>\n    (progn<br \/>\n      (setq ratio (\/ la (float lb)))<br \/>\n      (setq 0.5Pi (* pi 0.5))<br \/>\n      (* lb (Math:Romberg (- p1 0.5pi) (- p2 0.5pi) eps))<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u8bf4\u660e: \u6b64\u51fd\u6570\u4e3a\u7eaf\u6570\u5b66\u8ba1\u7b97\uff0c\u610f\u5473\u53ef\u4e0d\u7528\u56fe\u5143\u53c2\u4e0e\uff0c\u901f\u5ea6\u5c45\u7136\u4e0d\u6162\u3002<br \/>\n;;;       \u9002\u7528\u4e8e\u67d0\u4e9b\u7279\u6b8a\u60c5\u51b5\u3002\u4e00\u822c\u53ef\u7528vlax-curve-getarea\u51fd\u6570\u83b7\u5f97\uff0c\u4e5f\u53ef\u4ee5<br \/>\n;;;       \u7528vla-get-area\u83b7\u5f97\u3002\u6d4b\u8bd5\u89c1\u6837\u4f8b\u3002<br \/>\n;;; \u529f\u80fd: \u83b7\u53d6\u692d\u5706\u5f27\u7684\u9762\u79ef\u3002<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u7684\u957f\u534a\u8f74\uff0c\u77ed\u534a\u8f74\uff0c\u53c2\u65701\uff0c\u53c2\u65702<br \/>\n;;; \u8f93\u51fa: \u692d\u5706\u5f27\u7684\u9762\u79ef<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Area (la lb A1 A2 \/ a k)<br \/>\n  (if (&gt; A1 A2)<br \/>\n    (setq A (- (+ pi pi A2) A1))<br \/>\n    (setq A (- A2 A1))<br \/>\n  )<br \/>\n  (setq k (sin (* 0.5 A)))<br \/>\n  (setq k (* 1.333333333333333333333 la k k k))<br \/>\n  (* 0.5 la lb (- A (sin A)))<br \/>\n)<\/p>\n<p>;;;\u6d4b\u8bd5\u692d\u5706\u5f27\u957f\u548c\u9762\u79ef\u6837\u4f8b<br \/>\n(defun c:TestLA (\/ e o la lb par1 par2 l1 l2 s1 s2 s3)<br \/>\n  (setq e  (car (entsel &#8220;n\u8bf7\u9009\u62e9\u692d\u5706\u5f27: &#8220;)))<br \/>\n  (setq o  (vlax-ename-&gt;vla-object e))<br \/>\n  (setq la (vla-get-MajorRadius o))<br \/>\n  (setq lb (vla-get-MinorRadius o))<br \/>\n  (setq par1 (vlax-curve-getStartParam e))<br \/>\n  (setq par2 (vlax-curve-getEndParam e))<br \/>\n  (setq l1 (ell:length la lb par1 par2 1e-14))                          ; \u7528\u6570\u5b66\u8ba1\u7b97\u83b7\u5f97\u692d\u5706\u5f27\u957f<br \/>\n  (setq l2 (vlax-curve-getDistAtParam e par2))                          ; \u7528vlax-curve\u7684\u51fd\u6570\u83b7\u5f97\u692d\u5706\u5f27\u957f<br \/>\n  (princ &#8220;n\u7528vlax-curve\u51fd\u6570\u8ba1\u7b97\u7684\u7ed3\u679c\u548c\u79ef\u5206\u6cd5\u8ba1\u7b97\u76f8\u5dee:&#8221;)<br \/>\n  (princ (rtos (- l1 l2) 2 20))<br \/>\n  (misc:test 1001<br \/>\n    &#8216;((ell:length la lb par1 par2 1e-8)                                 ; \u56e0\u4e3a\u692d\u5706\u5f27\u957f\u6ca1\u6709\u6570\u5b66\u516c\u5f0f\uff0c\u6240\u4ee5\u6162\u4e86<br \/>\n      (vlax-curve-getDistAtParam e par2)<br \/>\n    )<br \/>\n  )<br \/>\n  (setq s1 (vla-get-area o))<br \/>\n  (setq s2 (ELL:Area la lb par1 par2))<br \/>\n  (setq s3 (vlax-curve-getarea e))<br \/>\n  (princ &#8220;n\u7528vla-get-area\u51fd\u6570\u8ba1\u7b97\u7684\u7ed3\u679c\u548c\u6570\u5b66\u6cd5\u8ba1\u7b97\u76f8\u5dee:&#8221;)<br \/>\n  (princ (list s1 s2 s3))<br \/>\n  (princ (rtos (- s1 s2) 2 20))<br \/>\n  (misc:test 1001<br \/>\n    &#8216;((ELL:Area la lb par1 par2)                                        ; \u5c45\u7136\u7528\u8fd9\u4e2a\u65b9\u6cd5\u6700\u5feb??<br \/>\n      (vla-get-area o)<br \/>\n      (vlax-curve-getarea e)<br \/>\n    )<br \/>\n  )<br \/>\n  (princ)<br \/>\n)<br \/>\n[\/codesyntax]<br \/>\n\u4e09\u3001\u7a7a\u95f4\u692d\u5706\u7684\u53d8\u6362\u77e9\u9635\u53ca\u5176\u6cd5\u7ebf\u548c\u5e73\u9762\u6295\u5f71<br \/>\n[codesyntax lang=&#8221;lisp&#8221;];;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u83b7\u53d6\u692d\u5706\u7684\u53d8\u6362\u77e9\u9635<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u7684\u56fe\u5143\u540d<br \/>\n;;; \u8f93\u51fa: \u692d\u5706\u7684\u53d8\u6362\u77e9\u9635\u53ca\u9006\u77e9\u9635<br \/>\n;;; \u8bf4\u660e: \u7531\u692d\u5706\u7684\u957f\u8f74\u77e2\u91cf\uff0c\u548c\u77ed\u8f74\u77e2\u91cf\u4ee5\u53ca\u6cd5\u7ebf\u77e2\u91cf\u53ef\u4ee5\u6784\u6210\u692d\u5706\u81ea\u8eab\u7684\u53d8\u6362<br \/>\n;;;       \u77e9\u9635\u3002\u5982\u679c\u692d\u5706\u4f4d\u4e8e\u56fe\u5757\u5185\u6216\u8005\u5d4c\u5957\u5757\u5185\uff0c\u5173\u4e8e\u5176\u53d8\u6362\u77e9\u9635\u53ef\u4ee5\u53c2\u8003\u8fd9<br \/>\n;;;       \u4e2a\u5e16\u5b50\u7684\u8ba8\u8bba\uff1ahttp:\/\/bbs.mjtd.com\/thread-93828-1-1.html.<br \/>\n;;;       \u6b64\u5e16\u4e2d\u5bf9\u692d\u5706\u7684\u53d8\u6362\u8ba8\u8bba\u7684\u6bd4\u8f83\u6df1\u5165\u3002<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:TransMatrix (e \/ Obj Cen DX DY DZ mat)<br \/>\n  (setq obj (vlax-ename-&gt;vla-object e))<br \/>\n  (setq Cen (vlax-get obj &#8216;Center))                                     ; \u4e2d\u5fc3\u70b9<br \/>\n  (setq DX  (Mat:unit (vlax-get obj &#8216;MajorAxis)))                       ; OCS\u7684X\u8f74\u65b9\u5411 \u957f\u8f74\u65b9\u5411<br \/>\n  (setq DY  (Mat:unit (vlax-get obj &#8216;MinorAxis)))                       ; OCS\u7684Y\u8f74\u65b9\u5411 \u77ed\u8f74\u65b9\u5411<br \/>\n  (setq DZ  (Mat:unit (vlax-get obj &#8216;Normal)))                          ; OCS\u7684Z\u8f74\u65b9\u5411 \u6cd5\u7ebf\u65b9\u5411<br \/>\n  (setq mat (list DX DY DZ))                                            ; \u692d\u5706\u7684\u65cb\u8f6c\u77e9\u9635<br \/>\n  (list<br \/>\n    (Mat:DispToMatrix (Mat:trp mat) cen)                                ; \u692d\u5706\u7684\u53d8\u6362\u77e9\u9635 = (trans Pt En 0)<br \/>\n    (Mat:DispToMatrix mat (mapcar &#8216;- (Mat:mxv mat cen)))                ; \u692d\u5706\u7684\u9006\u53d8\u6362\u77e9\u9635 = (trans Pt 0 En)<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u83b7\u53d6\u692d\u5706\u7684\u65cb\u8f6c\u77e9\u9635<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u7684\u957f\u8f74\u77e2\u91cf\u548c\u692d\u5706\u7684\u6cd5\u7ebf<br \/>\n;;; \u8f93\u51fa: \u692d\u5706\u7684\u65cb\u8f6c\u53d8\u6362\u77e9\u9635\u53ca\u9006\u77e9\u9635<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:RotationMatrix (Maj Nrm \/ DX DY DZ mat)<br \/>\n  (setq DX (Mat:unit Maj))                                              ; OCS\u7684X\u8f74\u65b9\u5411<br \/>\n  (setq DZ (Mat:unit Nrm))                                              ; OCS\u7684Z\u8f74\u65b9\u5411<br \/>\n  (setq DY (Mat:Unit (Mat:vxv DZ DX)))                                  ; OCS\u7684Y\u8f74\u65b9\u5411<br \/>\n  (setq mat (list DX DY DZ))                                            ; \u692d\u5706\u7684\u65cb\u8f6c\u77e9\u9635\u7684\u9006\u77e9\u9635<br \/>\n  (list (Mat:trp mat) mat)                                              ; \u692d\u5706\u7684\u65cb\u8f6c\u77e9\u9635\u548c\u9006\u77e9\u9635<br \/>\n)<\/p>\n<p>;;;\u4ee5\u4e0b\u4e3a\u6d4b\u8bd5\u7a0b\u5e8f<br \/>\n(defun c:testMatrix (\/ sel ent mat obj doc)<br \/>\n  (if (setq sel (ssget &#8220;:S&#8221; &#8216;((0 . &#8220;ELLIPSE&#8221;))))<br \/>\n    (progn<br \/>\n      (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))<br \/>\n      (vla-StartUndoMark doc)<br \/>\n      (setq ent (ssname sel 0))<br \/>\n      (setq mat (ELL:TransMatrix ent))<br \/>\n      (setq obj (vlax-ename-&gt;vla-object ent))<br \/>\n      (vla-transformby obj (vlax-tmatrix (cadr mat)))<br \/>\n      (command &#8220;Select&#8221; ent pause)<br \/>\n      (vla-transformby obj (vlax-tmatrix (car mat)))<br \/>\n      (vla-EndUndoMark doc)<br \/>\n      (princ)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u4fee\u6539\u4e00\u4e2a\u692d\u5706\u7684\u6cd5\u7ebf\u65b9\u5411(\u4e0d\u80fd\u76f4\u63a5\u7528ActiveX\u65b9\u6cd5)<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u7684\u56fe\u5143\u540d\uff0c\u76ee\u6807\u6cd5\u7ebf\u65b9\u5411<br \/>\n;;; \u8f93\u51fa: \u6210\u529f\u8fd4\u56de\u692d\u5706\u7684DXF\u8868\uff0c\u5426\u5219\u8fd4\u56denil<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Put_Normal (ent Nrm \/ DXF Maj)<br \/>\n  (setq Nrm (mat:unit Nrm))<br \/>\n  (setq dxf (entget ent))<br \/>\n  (setq maj (cdr (assoc 11 dxf)))                                       ; \u9996\u5148\u53d6\u5f97\u4e3b\u8f74\u65b9\u5411<br \/>\n  (setq maj (trans maj 0 (cdr (assoc 210 dxf)) T))                      ; \u4e3b\u8f74\u65b9\u5411\u5728OCS\u4e2d\u7684\u65b9\u5411<br \/>\n  (setq maj (trans Maj Nrm 0 T))                                        ; \u628aOCS\u4e2d\u7684\u65b9\u5411\u8f6c\u5316\u4e3a\u76ee\u6807\u65b9\u5411<br \/>\n  (setq dxf (subst (cons 11 maj) (assoc 11 dxf) dxf))                   ; \u692d\u5706\u7684\u4e3b\u8f74\u65b9\u5411<br \/>\n  (setq dxf (subst (cons 210 Nrm) (assoc 210 dxf) dxf))                 ; \u692d\u5706\u7684\u6cd5\u7ebf\u65b9\u5411<br \/>\n  (entmod dxf)                                                          ; \u66f4\u65b0\u56fe\u5143<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; highflybird  2012.11.1 \u7b2c\u4e00\u7248  2013.5.25 \u4fee\u6539\u4e8e\u6df1\u5733<br \/>\n;;; \u529f\u80fd: \u7ed9\u5b9a\u4e00\u4e2a\u692d\u5706\u6216\u8005\u5706\uff0c\u753b\u51fa\u5728\u5e73\u9762\u4e0a\u7684\u6295\u5f71\uff08\u4e00\u822c\u4e3a\u692d\u5706\uff09<br \/>\n;;; \u8f93\u5165: (\u692d\u5706\u3001\u692d\u5706\u5f27\u3001\u5706\u5f27\u3001\u5706)\u5b9e\u4f53E\uff0c\u5e73\u9762\u7684\u6cd5\u7ebfNormal\u548c\u5176\u4e00\u70b9Origin<br \/>\n;;; \u8f93\u51fa: \u6295\u5f71\u692d\u5706(\u521b\u5efa3d\u692d\u5706\u7684\u51e0\u4e2a\u53c2\u6570)<br \/>\n;;; \u53c2\u8003: http:\/\/bbs.mjtd.com\/forum.php?mod=viewthread&amp;tid=84527<br \/>\n;;;       http:\/\/www.theswamp.org\/index.php?topic=43031.0<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Projection (E Normal Origin \/<br \/>\n                       A1  AN1 AN2 ANG B1  C0  C1  C2  ENT OBJ PA0<br \/>\n                       PA1 PB0 PB1 PE0 PE1 PR1 PR2 PS0 PS1 RET)<br \/>\n  (setq C0  (cdr (assoc 10 (entget E))))                                ; \u4e2d\u5fc3\u70b9(\u7528vla-get-center\u53ef\u80fd\u51fa\u9519\uff1f)<br \/>\n  (setq C0  (trans C0 e 0))                                             ; \u6b64\u5904\u5f88\u91cd\u8981!!!<br \/>\n  (setq PS0 (vlax-curve-getStartPoint E))                               ; \u8fd9\u4e2a\u53ef\u4ee5\u901a\u8fc7\u89d2\u5ea6\u8ba1\u7b97\u51fa\u6765StartAngle<br \/>\n  (setq PE0 (vlax-curve-getEndPoint E))                                 ; \u8fd9\u4e2a\u53ef\u4ee5\u901a\u8fc7\u89d2\u5ea6\u8ba1\u7b97\u51fa\u6765EndAngle<br \/>\n  (setq Pr1 (vlax-curve-getStartParam E))<br \/>\n  (setq Pr2 (vlax-curve-getEndParam E))<br \/>\n  (if (LINE:Colinearity C0 PS0 PE0)                                     ; \u9632\u6b62\u4e2d\u5fc3\uff0c\u8d77\u70b9\uff0c\u7ec8\u70b9\u5171\u7ebf\u60c5\u51b5\u51fa\u73b0<br \/>\n    (setq PA0 (vlax-curve-getPointAtParam E (1+ pr1))                   ; \u8d77\u70b9\u53c2\u6570\u52a0\u4e00<br \/>\n          pB0 (vlax-curve-getpointatparam E (1- pr2))                   ; \u7ec8\u70b9\u53c2\u6570\u52a0\u4e00<br \/>\n    )<br \/>\n    (setq pA0 (vlax-curve-getpointatparam E (* 0.5 (+ pr1 pr2)))        ; \u53d6\u4e2d\u70b9\u4e3a\u7b2c\u4e8c\u70b9<br \/>\n          pB0 PE0                                                       ; \u7ec8\u70b9\u4e3a\u7b2c\u4e09\u70b9<br \/>\n    )<br \/>\n  )<\/p>\n<p>  (mapcar<br \/>\n    (function (lambda (x y) (set x (trans y 0 Normal))))                ; \u628a\u8fd9\u4e9b\u70b9\u6295\u5f71\u5230\u5e73\u9762\u4e0a<br \/>\n    (quote (PA1 PB1 PS1 PE1 C1))<br \/>\n    (list PA0 PB0 PS0 PE0 C0)                                           ; \u692d\u5706\u4e0a\u53d6\u7684\u4e09\u70b9\u3001\u8d77\u59cb\u70b9\u548c\u7aef\u70b9<br \/>\n  )<br \/>\n  (if (setq RET (ELL:C3P C1 PS1 PA1 PB1))                               ; \u4e2d\u5fc3\u548c\u4e09\u70b9\u753b\u692d\u5706\u6cd5<br \/>\n    (progn<br \/>\n      (setq A1  (cadr ret))                                             ; \u6295\u5f71\u692d\u5706\u7684\u957f\u8f74<br \/>\n      (setq B1  (caddr ret))                                            ; \u6295\u5f71\u692d\u5706\u7684\u77ed\u8f74<br \/>\n      (setq ang (cadddr ret))                                           ; \u6295\u5f71\u692d\u5706\u7684\u65cb\u8f6c\u89d2<br \/>\n      (setq C2  (PLANE:Perpendicular_Foot c0 Origin Normal))            ; \u692d\u5706\u7684\u5b9e\u9645\u4e2d\u5fc3<br \/>\n      (if (vlax-curve-isClosed E)<br \/>\n        (list C2 A1 B1 ang 0 (+ pi pi) Normal)                          ; \u8fd4\u56de\u521b\u5efa3d\u692d\u5706\u7684\u51e0\u4e2a\u53c2\u6570<br \/>\n        (progn<br \/>\n          (setq an1 (ELL:GetParam PS1 C1 A1 B1 ang))                    ; \u6295\u5f71\u692d\u5706\u7684\u8d77\u59cb\u53c2\u6570<br \/>\n          (setq an2 (ELL:GetParam PE1 C1 A1 B1 ang))                    ; \u6295\u5f71\u692d\u5706\u7684\u7ec8\u70b9\u53c2\u6570<br \/>\n          (if (&gt; (TRI:Det3P pS1 pA1 pB1) 0)                             ; \u6b64\u5904\u7684\u786e\u8981\u4f5c\u5224\u65ad<br \/>\n            (list C2 a1 b1 ang an1 an2 Normal)                          ; \u6b64\u65f6\u662f\u9006\u65f6\u9488<br \/>\n            (list C2 a1 b1 ang an2 an1 Normal)                          ; \u987a\u65f6\u9488\u8981\u4ea4\u6362\u8d77\u59cb\u89d2\u548c\u7ec8\u6b62\u89d2<br \/>\n          )<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;\u7528\u4e8e\u6295\u5f71\u692d\u5706\u7684\u6d4b\u8bd5:<br \/>\n(defun C:Projection (\/ sel ent normal origin i ret)<br \/>\n  (setq sel (ssget &#8216;((0 . &#8220;ELLIPSE,ARC,CIRCLE&#8221;))))<br \/>\n  (setq normal (trans &#8216;(0 0 1) 1 0 T))<br \/>\n  (setq origin (getvar &#8216;ucsorg))<br \/>\n  (if sel<br \/>\n    (repeat (setq i (sslength sel))<br \/>\n      (setq ent (ssname sel (setq i (1- i))))<br \/>\n      (if (setq ret (ELL:Projection ent normal origin))<br \/>\n        (apply &#8216;Ent:Make_ELLIPSE_3D ret)<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)[\/codesyntax]<br \/>\n\u56db\u3001\u692d\u5706\u7684\u5c55\u70b9\u548c\u692d\u5706\u9525\u7684\u5c55\u5f00\u66f2\u7ebf<br \/>\n[codesyntax lang=&#8221;lisp&#8221;];;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u692d\u5706\u5c55\u70b9\u3002<br \/>\n;;; \u8f93\u5165: \u65e0<br \/>\n;;; \u8f93\u51fa: \u65e0<br \/>\n;;;=====================================================================<br \/>\n(defun C:ExpandEllipse(\/ A B D ENT F I L LEN N OBJ P PAR S SEG)<br \/>\n  (initget 15)<br \/>\n  (setq a (getdist &#8220;n\u8bf7\u8f93\u5165\u692d\u5706\u7684\u957f\u8f74:&#8221;))<br \/>\n  (initget 15)<br \/>\n  (setq b (getdist &#8220;n\u8bf7\u8f93\u5165\u692d\u5706\u7684\u77ed\u8f74:&#8221;))<br \/>\n  (initget 7)<br \/>\n  (setq n (getint &#8220;n\u8bf7\u8f93\u5165\u7b49\u5206\u6570\u76ee:&#8221;))<br \/>\n  (setq ent (ENT:MAKE_ELLIPSE &#8216;(0 0 0) a b 0))<br \/>\n  (setq obj (vlax-ename-&gt;vla-object ent))<br \/>\n  (setq par (vlax-curve-getendparam obj))<br \/>\n  (setq len (vlax-curve-getdistatparam obj par))<br \/>\n  (setq seg (\/ len n))<br \/>\n  (setq l nil)<br \/>\n  (setq d 0)<br \/>\n  (setq i 0)<br \/>\n  (repeat n<br \/>\n    (setq d (* i seg))<br \/>\n    (setq p (vlax-curve-getPointAtDist obj d))<br \/>\n    ;(Ent:Make_Point p)<br \/>\n    (setq l (cons p L))<br \/>\n    (setq i (1+ i))<br \/>\n  )<br \/>\n  (setq l (reverse l))<\/p>\n<p>  (vla-erase obj)<br \/>\n  (if (setq f (getfiled &#8220;\u8f93\u5165\u5750\u6807\u6587\u4ef6\u540d&#8221; &#8220;D:\/&#8221; &#8220;TXT&#8221; 1))<br \/>\n    (progn<br \/>\n      (setq f (open f &#8220;W&#8221;))<br \/>\n      (foreach p l<br \/>\n        (setq s (strcat (rtos (car p) 2 8) &#8220;t&#8221; (rtos (cadr p) 2 8)))<br \/>\n        (write-line s f)<br \/>\n      )<br \/>\n      (close f)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u5c55\u5f00\u692d\u5706\u9525\u4f53\u3002<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u9525\u5e95\u692d\u5706\u7684\u957f\u8f74a\uff0c\u77ed\u8f74b\uff0c\u692d\u5706\u9525\u7684\u9ad8h\u548c\u5206\u5f27\u7cbe\u5ea6n<br \/>\n;;; \u8f93\u51fa: \u5c55\u5f00\u56fe\u7684\u66f2\u7ebf\u7684\u5750\u6807\u70b9(\u53ef\u636e\u6b64\u5f62\u6210\u5c55\u5f00\u9762)<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:ExpandCone (a b h n \/ Pts Ang D Param DivAng P0 P1 R0 R1 X Y)<br \/>\n  (setq DivAng (\/ pi n 0.5))                                            ;\u7b49\u5206\u89d2\u5ea6<br \/>\n  (setq Param 0)                                                        ;\u5f00\u59cb\u53c2\u6570\u4e3a0<br \/>\n  (setq p0 (list a 0))                                                  ;\u4ece\u692d\u5706\u6700\u53f3\u8fb9\u7684\u70b9\u5f00\u59cb<br \/>\n  (setq r0 (distance &#8216;(0 0 0) (list a 0 h)))                            ;\u5f00\u59cb\u7684\u9525\u9876\u6700\u53f3\u8fb9\u70b9\u7684\u8ddd\u79bb<br \/>\n  (setq Pts (list (list r0 0) &#8216;(0 0)))                                  ;\u628a\u6700\u5f00\u59cb\u7684\u4e24\u70b9\u52a0\u5165\u5230\u6570\u636e\u8868<br \/>\n  (setq Ang 0)                                                          ;\u5f00\u59cb\u89d2\u5ea6\u4e5f\u4e3a0<br \/>\n  (repeat n<br \/>\n    (setq Param  (+ Param DivAng))<br \/>\n    (setq x   (* a (cos Param)))                                        ;\u692d\u5706\u4e0a\u7684x\u5750\u6807<br \/>\n    (setq y   (* b (sin Param)))                                        ;\u692d\u5706\u4e0a\u7684y\u5750\u6807<br \/>\n    (setq p1  (list x y))                                               ;\u70b9\u7684\u5750\u6807<br \/>\n    (setq r1  (distance &#8216;(0 0 0) (list x y h)))                         ;\u5c55\u5f00\u9762\u7684\u9525\u7ebf\u957f\u5ea6<br \/>\n    (setq d   (distance p0 p1))                                         ;\u692d\u5706\u4e0a\u7684\u4e0a\u4e00\u70b9\u5230\u8fd9\u70b9\u7684\u8ddd\u79bb<br \/>\n    (setq Ang (+ Ang (car (TRI:CosinesLaw d r0 r1))))                   ;\u5750\u6807\u89d2\u5ea6<br \/>\n    (setq Pts (cons (polar &#8216;(0 0) Ang r1) Pts))                         ;\u5f97\u5230\u4e86\u5750\u6807\uff0c\u5e76\u628a\u5b83\u52a0\u5165\u5230\u8868\u4e2d<br \/>\n    (setq p0 p1)                                                        ;\u7528\u65b0\u7684\u5750\u6807\u4f4d\u7f6e\u66ff\u6362\u65e7\u4f4d\u7f6e<br \/>\n    (setq r0 r1)                                                        ;\u7528\u65b0\u7684\u9525\u7ebf\u957f\u5ea6\u66ff\u6362\u65e7\u957f\u5ea6<br \/>\n  )<br \/>\n  (reverse Pts)                                                         ;\u9006\u8f6c\u8868\uff0c\u5f97\u5230\u6b63\u5e8f\u7684\u6570\u636e<br \/>\n)<\/p>\n<p>;;; \u6d4b\u8bd5\u692d\u5706\u9525\u7684\u5c55\u5f00<br \/>\n(defun c:ExpandCone(\/ h N e d r c m a b l e o)<br \/>\n  (initget 1)<br \/>\n  (setq h (getdist &#8220;n\u8f93\u5165\u692d\u5706\u9525\u9ad8: &#8220;))<br \/>\n  (initget 7)<br \/>\n  (setq N (getint &#8220;n\u7b49\u5206\u6570:&#8221;))<br \/>\n  (prompt &#8220;n\u9009\u62e9\u692d\u5706:&#8221;)<br \/>\n  (if (setq s (ssget &#8220;:S&#8221; &#8216;((0 . &#8220;ELLIPSE&#8221;))))<br \/>\n    (progn<br \/>\n      (setq e (ssname s 0))<br \/>\n      (setq d (entget e))<br \/>\n      (setq r (cdr (assoc 40 d)))<br \/>\n      (setq c (cdr (assoc 10 d)))<br \/>\n      (setq m (cdr (assoc 11 d)))<br \/>\n      (setq a (distance &#8216;(0 0 0) m))<br \/>\n      (setq b (* r a))<br \/>\n      (setq l (ELL:ExpandCone a b h n))<br \/>\n      (setq o (vlax-ename-&gt;vla-object (Ent:Make_LWPoly l T)))<br \/>\n      (vla-move o (vlax-3d-point &#8216;(0 0 0)) (vlax-3d-point c))<br \/>\n      (princ)<br \/>\n    )<br \/>\n  )<br \/>\n)[\/codesyntax]<br \/>\n\u4e94\u3001\u692d\u5706\u7684\u76f8\u5207\u548c\u76f8\u4ea4<br \/>\n[codesyntax lang=&#8221;lisp&#8221;];;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u6570\u5b66\u6cd5\u6c42\u692d\u5706\u4e0a\u4e00\u70b9\u7684\u5207\u7ebf\u77e2\u91cf(\u76f8\u5f53\u4e8evlax-curve-GetFirstDeriv)<br \/>\n;;; \u8f93\u5165: \u8fd9\u70b9\u7684\u53c2\u6570Param,\u692d\u5706\u4e2d\u5fc3C,\u957f\u8f74\u65b9\u5411M\uff0c\u692d\u5706\u6bd4\u7387R\u548c\u692d\u5706\u7684\u6cd5\u7ebfN<br \/>\n;;; \u8f93\u51fa: \u8fd9\u70b9\u7684\u5207\u7ebf\u77e2\u91cf<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:PointTangentOn (Param C M R N \/ a b v)<br \/>\n  (setq a (distance &#8216;(0 0 0) M))<br \/>\n  (setq b (* R a))<br \/>\n  (setq v (list (* (- a) (sin Param)) (* b (cos Param)) 0))<br \/>\n  (Mat:mxv (car (ELL:RotationMatrix M N)) v)<br \/>\n)<\/p>\n<p>;;; \u5207\u7ebf\u77e2\u91cf\u51fd\u6570\u6d4b\u8bd5<br \/>\n(defun C:PointTangentOn ( \/ CEN DXF ENT MAJ NRM PAR PNT RAT RET SEL)<br \/>\n  (if (setq sel (ssget &#8220;:S&#8221; &#8216;((0 . &#8220;ELLIPSE&#8221;))))<br \/>\n    (progn<br \/>\n      (setq ent (ssname sel 0))<br \/>\n      (setq dxf (entget ent))<br \/>\n      (setq cen (cdr (assoc 10 dxf)))<br \/>\n      (setq maj (cdr (assoc 11 dxf)))<br \/>\n      (setq rat (cdr (assoc 40 dxf)))<br \/>\n      (setq Nrm (cdr (assoc 210 DXF)))<br \/>\n      (while (setq Pnt (getpoint &#8220;n\u9009\u53d6\u70b9: &#8220;))<br \/>\n        (setq Pnt (trans Pnt 1 0))<br \/>\n        (setq pnt (vlax-curve-getclosestpointto ent pnt))<br \/>\n        (setq par (vlax-curve-getParamAtPoint ent pnt))<br \/>\n        (setq ret (ELL:PointTangentOn par cen maj rat Nrm))<br \/>\n        (ent:make_line Pnt (mapcar &#8216;+ Pnt ret))<br \/>\n      )<br \/>\n      (princ)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;; \u4e0a\u9762\u662f\u4e5f\u53ef\u4ee5\u7531\u67d0\u4e2a\u70b9\u7684\u53c2\u6570\u901a\u8fc7\u6570\u5b66\u65b9\u6cd5\u7b97\u51fa\u3002<br \/>\n;;; \u4e00\u822c\u6765\u8bf4\u53ef\u4ee5\u7531vlax-curve-getFirstDeriv \u7b97\u51fa\uff0c\u9762\u662f\u6d4b\u8bd5\u5982\u4e0b:<br \/>\n(defun C:TestDeriv (\/ e o p param f1 f2)<br \/>\n  (if (setq e (car (entsel)))<br \/>\n    (progn<br \/>\n      (setq o (vlax-ename-&gt;vla-object e))<br \/>\n      (while (setq p (getpoint &#8220;n\u6d4b\u8bd5\u70b9:&#8221;))<br \/>\n        (setq p (trans p 1 0))<br \/>\n        (setq p (vlax-curve-getclosestpointto e p))<br \/>\n        (setq param (vlax-curve-getParamAtPoint e p))<br \/>\n        (setq f1 (vlax-curve-getFirstDeriv e param))<br \/>\n        (setq f2 (vlax-curve-getSecondDeriv e param))<br \/>\n        (Ent:make_line p (mapcar &#8216;+ p f1))<br \/>\n        (Ent:make_line p (mapcar &#8216;+ p f2))<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u6c42\u692d\u5706(\u5e73\u9762)\u5916\u4e00\u70b9\u5230\u692d\u5706\u7684\u5207\u7ebf<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u5916\u4e00\u70b9Point,\u692d\u5706\u4e2d\u5fc3C,\u692d\u5706\u534a\u957f\u8f74a,\u534a\u77ed\u8f74b,\u548c\u692d\u5706\u7684\u65cb\u8f6c\u89d2<br \/>\n;;; \u8f93\u51fa: \u6b64\u70b9\u5230\u4e0e\u692d\u5706\u76f8\u5207\u7684\u5207\u70b9(\u4e00\u4e2a\uff0c\u4e24\u4e2a\u6216\u8005nil)<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:PointTangentTo (Point C a b ang \/ AA BB K1 K2 KK P X Y Z XX YY)<br \/>\n  (setq Point (mapcar &#8216;- Point C))<br \/>\n  (setq z (polar &#8216;(0 0 0) ang a))<br \/>\n  (setq P (trans point 0 z T))<br \/>\n  (setq x (caddr p))<br \/>\n  (setq y (car p))<br \/>\n  (if (equal y 0 1e-8)<br \/>\n    (if (&gt; (abs x) a)<br \/>\n      (progn<br \/>\n        (setq kk (\/ a x))<br \/>\n        (setq xx (* a kk))<br \/>\n        (setq yy (* b (sqrt (- 1 (* kk kk)))))<br \/>\n        (list<br \/>\n          (mapcar &#8216;+ C (trans (list yy 0 xx) z 0 T))<br \/>\n          (mapcar &#8216;+ C (trans (list (- yy) 0 xx) z 0 T))<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n    (progn<br \/>\n      (setq aa (* a a))<br \/>\n      (setq bb (* b b))<br \/>\n      (setq xx (* x x))<br \/>\n      (setq yy (* y y))<br \/>\n      (setq k1 (+ (* aa yy) (* bb xx)))<br \/>\n      (setq k2 (- k1 (* aa bb)))<br \/>\n      (if (&gt; k2 0)<br \/>\n        (progn<br \/>\n          (defun GetTan (A B C bb K1 X Y Z KK \/ d1 k4 k5 s1 x1 y1 p1)<br \/>\n            (setq d1 (+ (* bb x) kk))<br \/>\n            (setq k4 (\/ (* d1 x) k1))<br \/>\n            (setq k5 (\/ (* d1 a) k1))<br \/>\n            (setq s1 (atan (\/ (* b (- 1 k4)) y) k5))<br \/>\n            (setq x1 (* a (cos s1)))<br \/>\n            (setq y1 (* b (sin s1)))<br \/>\n            (setq P1 (trans (list y1 0 x1) z 0 T))<br \/>\n            (setq p1 (mapcar &#8216;+ P1 C))<br \/>\n          )<br \/>\n          (setq kk (* (sqrt k2) (abs y)))<br \/>\n          (list (GetTan A B C bb K1 X Y Z kk)<br \/>\n                (GetTan A B C bb K1 X Y Z (- kk))<br \/>\n          )<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;; \u692d\u5706\u7684\u5207\u7ebf\u51fd\u6570\u6d4b\u8bd5<br \/>\n(defun C:PointTangentTo (\/ A ANG B C DXF ENT MAJ PNT RET SEL)<br \/>\n  (if (setq sel (ssget &#8220;:S&#8221; &#8216;((0 . &#8220;ELLIPSE&#8221;))))<br \/>\n    (progn<br \/>\n      (setq ent (ssname sel 0))<br \/>\n      (setq dxf (entget ent))<br \/>\n      (setq maj (cdr (assoc 11 dxf)))<br \/>\n      (setq a   (distance &#8216;(0 0 0) maj))<br \/>\n      (setq b   (* a (cdr (assoc 40 dxf))))<br \/>\n      (setq c   (cdr (assoc 10 dxf)))<br \/>\n      (setq ang (angle &#8216;(0 0 0) maj))<br \/>\n      (while (setq Pnt (getpoint &#8220;n\u9009\u53d6\u70b9: &#8220;))<br \/>\n        (setq Pnt (trans Pnt 1 0))<br \/>\n        (setq ret (ELL:PointTangentTo Pnt C a b ang))<br \/>\n        (foreach p ret<br \/>\n          (Ent:Make_line p Pnt)<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u5173\u4e8e\u692d\u5706\u7684\u5171\u5207\u7ebf\u95ee\u9898\u8bf7\u53c2\u8003\uff1a<br \/>\n;;; http:\/\/bbs.mjtd.com\/forum.php?mod=viewthread&amp;tid=82900<br \/>\n;;; \u53e6\u5916\u53ef\u53c2\u8003\u6211\u7684\u9644\u4ef6: ellipse-tan-solve1.LSP<br \/>\n;;;=====================================================================<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u6c42\u692d\u5706\u4e0e\u76f4\u7ebf\u7684\u4ea4\u70b9(\u8ba1\u7b97\u51e0\u4f55\u65b9\u5f0f1)<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u7684\u957f\u8f74a,\u77ed\u8f74b\uff0c\u4e24\u70b9P1,P2.<br \/>\n;;; \u8f93\u51fa: \u76f4\u7ebfP1P2\u4e0e\u692d\u5706\u7684\u4ea4\u70b9\u3002<br \/>\n;;; \u53c2\u8003: http:\/\/bbs.mjtd.com\/thread-62003-2-1.html<br \/>\n;;;       RootOf((M^2*a^2+N^2*b^2)*_Z^2-M^2*a^2+L^2+2*L*N*b*_Z)*b<br \/>\n;;;=====================================================================<br \/>\n(Defun ELL:Inters_Ellipse_Line (a b P1 P2 \/ D E K L M N P PA PB X1 X2 Y1 Y2)<br \/>\n  (setq k  (\/ b (float a)))<br \/>\n  (setq X1 (car P1))<br \/>\n  (setq X2 (car P2))<br \/>\n  (setq Y1 (\/ (cadr P1) k))<br \/>\n  (setq Y2 (\/ (cadr P2) k))<br \/>\n  (Setq M  (- Y1 Y2))                                                   ;\u76f4\u7ebf\u65b9\u7a0b\u7cfb\u6570M<br \/>\n  (Setq N  (- X2 X1))                                                   ;\u76f4\u7ebf\u65b9\u7a0b\u7cfb\u6570N<br \/>\n  (setq D  (\/ (- (* Y2 X1) (* Y1 X2)) (sqrt (+ (* M M) (* N N)))))      ;\u5782\u8ddd<br \/>\n  (setq e  (angle (list x1 y1) (list x2 y2)))                           ;\u76f4\u7ebf\u7684\u4e0eX\u8f74\u7ebf\u7684\u4ea4\u89d2<br \/>\n  (setq p  (polar &#8216;(0 0) (- e (* pi 0.5)) d))                           ;\u5706\u5fc3\u5230\u76f4\u7ebf\u7684\u5782\u8db3<br \/>\n  (setq d  (abs d))<br \/>\n  (if (equal d a 1e-8)                                                  ;\u5982\u679c\u5782\u8ddd\u7b49\u4e8e\u534a\u5f84<br \/>\n    (list (list (car p) (* k (cadr p))))                                ;\u76f8\u5207<br \/>\n    (if (&lt; d a)                                                         ;\u5982\u679c\u5782\u8ddd\u5c0f\u4e8e\u534a\u5f84<br \/>\n      (progn<br \/>\n        (setq L  (sqrt (* (+ a d)(- a d))))                             ;\u534a\u5f26\u957f<br \/>\n        (setq Pa (polar p e (- L)))<br \/>\n        (setq Pb (polar p e L))<br \/>\n        (setq pa (list (car Pa) (* k (cadr Pa))))<br \/>\n        (setq pb (list (car Pb) (* k (cadr Pb))))<br \/>\n        (list pa pb)                                                    ;\u6709\u4e24\u4e2a\u4ea4\u70b9<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u6c42\u692d\u5706\u4e0e\u76f4\u7ebf\u7684\u4ea4\u70b9(\u8ba1\u7b97\u51e0\u4f55\u65b9\u5f0f2,\u4f3c\u4e4e\u6bd4\u65b9\u5f0f1\u6162)<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u7684\u957f\u8f74a,\u77ed\u8f74b\uff0c\u4e24\u70b9P1,P2.<br \/>\n;;; \u8f93\u51fa: \u76f4\u7ebfP1P2\u4e0e\u692d\u5706\u7684\u4ea4\u70b9\u3002<br \/>\n;;;=====================================================================<br \/>\n(Defun ELL:Inters_Ellipse_Line_1 (a b P1 P2 \/ K1 K2 K3 M N L MA NB PS X X1 X2 Y Y1 Y2)<br \/>\n  (Setq X1 (Car  P1))<br \/>\n  (Setq Y1 (Cadr P1))<br \/>\n  (Setq X2 (Car  P2))<br \/>\n  (Setq Y2 (Cadr P2))<br \/>\n  (Setq M  (float (- Y1 Y2)))                                           ;\u76f4\u7ebf\u65b9\u7a0b\u7cfb\u6570M<br \/>\n  (Setq N  (float (- X2 X1)))                                           ;\u76f4\u7ebf\u65b9\u7a0b\u7cfb\u6570N<br \/>\n  (Setq L  (float (- (* Y2 X1) (* Y1 X2))))                             ;\u76f4\u7ebf\u65b9\u7a0b\u7cfb\u6570L<br \/>\n  (setq Nb (* N b))<br \/>\n  (if (equal M 0 1e-8)                                                  ;\u6c34\u5e73\u76f4\u7ebf<br \/>\n    (cond<br \/>\n      ( (equal (setq K1 (* (+ Nb L) (- Nb L))) 0 1e-8)<br \/>\n        (list (list 0 (- (\/ L N))))<br \/>\n      )<br \/>\n      ( (&gt; K1 0)<br \/>\n        (setq x (\/ (* a (sqrt k1)) Nb))<br \/>\n        (setq y (- (\/ L N)))<br \/>\n        (list (list x y) (list (- x) y))<br \/>\n      )<br \/>\n    )<br \/>\n    (progn<br \/>\n      (setq Ma (* M a))<br \/>\n      (setq k1 (+ (* Ma Ma) (* Nb Nb)))<br \/>\n      (setq k2 (* 2 L Nb))<br \/>\n      (setq k3 (- (* L L) (* Ma Ma)))<br \/>\n      (foreach e (Math:Quadratic_Equation_1 k1 k2 k3)<br \/>\n        (setq x (\/ (+ L (* N e b)) (- M)))<br \/>\n        (setq y (* e b))<br \/>\n        (setq ps (cons (list x y) ps))<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u6c42\u5e73\u9762\u692d\u5706\u4e0e\u76f4\u7ebf\u7684\u4ea4\u70b9<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u7684\u4e2d\u5fc3Center,\u957f\u8f74\u65b9\u5411major,\u692d\u7387ratio\uff0c\u4e24\u70b9P1,P2.<br \/>\n;;; \u8f93\u51fa: \u76f4\u7ebfP1P2\u4e0e\u692d\u5706\u7684\u4ea4\u70b9\u3002<br \/>\n;;;=====================================================================<br \/>\n(Defun ELL:Inters_Ellipse_Line_2D (Center major Ratio P1 P2 \/ v1 v2 a b s)<br \/>\n  (setq v1 (mapcar &#8216;- p1 center))<br \/>\n  (setq v2 (mapcar &#8216;- p2 center))<br \/>\n  (setq v1 (trans v1 0 major T))<br \/>\n  (setq v2 (trans v2 0 major T))<br \/>\n  (setq v1 (list (caddr v1) (car v1)))<br \/>\n  (setq v2 (list (caddr v2) (car v2)))<br \/>\n  (setq a  (distance &#8216;(0 0 0) major))<br \/>\n  (setq b  (* ratio a))<br \/>\n  (foreach p (ELL:Inters_Ellipse_Line_1 a b v1 v2)<br \/>\n    (setq p (trans (list (cadr p) 0 (car p)) major 0 T))<br \/>\n    (setq p (mapcar &#8216;+ center p))<br \/>\n    (setq s (cons p s))<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u6c42\u7a7a\u95f4\u692d\u5706\u4e0e\u76f4\u7ebf\u7684\u4ea4\u70b9\uff08\u6ce8\u610f\uff0c\u8fd9\u4e2a\u4ea4\u70b9\u4e3a\u5728\u692d\u5706\u5e73\u9762\u4e0a\u7684\u4ea4\u70b9\uff09<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u7684\u4e2d\u5fc3Center,\u957f\u8f74\u65b9\u5411major,\u692d\u7387ratio,\u6cd5\u7ebfNormal,\u4e24\u70b9P1,P2.<br \/>\n;;; \u8f93\u51fa: \u76f4\u7ebfP1P2\u4e0e\u692d\u5706\u7684\u4ea4\u70b9\u3002<br \/>\n;;;=====================================================================<br \/>\n(Defun ELL:Inters_Ellipse_Line_3D (Center major Ratio Normal P1 P2 \/ A B M1 M2 S V1 V2)<br \/>\n  (setq v1 (mapcar &#8216;- p1 center))<br \/>\n  (setq v2 (mapcar &#8216;- p2 center))<br \/>\n  (setq m1 (ELL:RotationMatrix major Normal))<br \/>\n  (setq m2 (cadr m1))<br \/>\n  (setq m1 (car m1))<br \/>\n  (setq v1 (mat:mxv m2 v1))<br \/>\n  (setq v2 (mat:mxv m2 v2))<br \/>\n  (setq a  (distance &#8216;(0 0 0) major))<br \/>\n  (setq b  (* ratio a))<br \/>\n  (foreach p (ELL:Inters_Ellipse_Line_1 a b v1 v2)<br \/>\n    (setq p (mat:mxv m1 (append p &#8216;(0))))<br \/>\n    (setq p (mapcar &#8216;+ center p))<br \/>\n    (setq s (cons p s))<br \/>\n  )<br \/>\n)<\/p>\n<p>;;; \u692d\u5706\u7684\u4e0e\u76f4\u7ebf\u76f8\u4ea4\u51fd\u6570\u7684\u6d4b\u8bd5<br \/>\n(defun C:iel (\/ p1 p2 sel ent dxf cen maj rat nrm a b ret)<br \/>\n  (initget 1)<br \/>\n  (setq P1 (getpoint &#8220;n\u9009\u53d6\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P2 (getpoint P1 &#8220;n\u9009\u53d6\u70b92: &#8220;))<br \/>\n  (setq p1 (trans p1 1 0))<br \/>\n  (setq p2 (trans p2 1 0))<br \/>\n  (Ent:Make_Line p1 p2)<br \/>\n  (if (setq sel (ssget &#8220;:S&#8221; &#8216;((0 . &#8220;ELLIPSE&#8221;))))<br \/>\n    (progn<br \/>\n      (setq ent (ssname sel 0))<br \/>\n      (setq dxf (entget ent))<br \/>\n      (setq cen (cdr (assoc 10 dxf)))<br \/>\n      (setq maj (cdr (assoc 11 dxf)))<br \/>\n      (setq rat (cdr (assoc 40 dxf)))<br \/>\n      (setq Nrm (cdr (assoc 210 DXF)))<br \/>\n      (setq a   (distance &#8216;(0 0 0) maj))<br \/>\n      (setq b   (* rat a))<br \/>\n      (MISC:test 100<br \/>\n        &#8216;((ELL:Inters_Ellipse_Line_2d cen maj rat P1 P2)<br \/>\n          (ELL:Inters_Ellipse_Line_3d cen maj rat Nrm P1 P2)))<br \/>\n      ;(setq ret (ELL:Inters_Ellipse_Line_2d cen maj rat P1 P2))<br \/>\n      (setq ret (ELL:Inters_Ellipse_Line_3d cen maj rat Nrm P1 P2))<br \/>\n      (and ret (mapcar &#8216;Ent:Make_Point ret))<br \/>\n    )<br \/>\n  )<br \/>\n)[\/codesyntax]<br \/>\n\u516d\u3001\u4e0e\u692d\u5706\u7684\u6700\u8fd1\u70b9\u548c\u6700\u8fdc\u70b9<br \/>\n[codesyntax lang=&#8221;lisp&#8221;];;;=====================================================================<br \/>\n;;; \u6c42\u5e73\u9762\u4e0a\u4e00\u70b9\u5230\u692d\u5706\u7684\u8ddd\u79bb\u7684\u6781\u503c\uff08\u5305\u62ec\u6700\u5c0f\u503c\u548c\u6700\u5927\u503c\uff09\u65b9\u5f0f1<br \/>\n;;; \u8f93\u5165\uff1a\u692d\u5706\u7684\u957f\u8f74a\uff0c\u77ed\u8f74b\u548c\u5e73\u9762\u7684\u4e00\u70b9P<br \/>\n;;; \u8f93\u51fa\uff1a\u692d\u5706\u7684\u8ddf\u5e73\u9762\u7684P\u70b9\u8ddd\u79bb\u4e3a\u6781\u503c\u7684\u70b9<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:GetExtremumDist (a b P \/ am cc K1 K2 K3 m n v x y ps)<br \/>\n  (setq m (car p))<br \/>\n  (setq n (cadr p))<br \/>\n  (setq cc (* (+ a b) (- a b)))<br \/>\n  (setq k1 (* n b))<br \/>\n  (setq am (* a m))<br \/>\n  (setq k2 (+ am cc))<br \/>\n  (setq k2 (+ k2 k2))<br \/>\n  (setq k3 (- am cc))<br \/>\n  (setq k3 (+ k3 k3))<br \/>\n  (foreach s (Math:Quartic_Equation k1 k2 0 k3 (- k1))<br \/>\n    (if (equal (cadr s) 0 1e-8)<br \/>\n      (progn<br \/>\n        (setq s (car s))<br \/>\n        (setq v (* s s))<br \/>\n        (setq x (\/ (* a (- 1 v)) (1+ v)))<br \/>\n        (setq y (\/ (* b (+ s s)) (1+ v)))<br \/>\n        (setq ps (cons (list x y) ps))<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n  (if (equal k1 0 1e-8)<br \/>\n    (setq ps (cons (list (- a) 0) ps))<br \/>\n    (reverse ps)<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u6c42\u5e73\u9762\u4e0a\u4e00\u70b9\u5230\u692d\u5706\u7684\u8ddd\u79bb\u7684\u6781\u503c\uff08\u5305\u62ec\u6700\u5c0f\u503c\u548c\u6700\u5927\u503c\uff09\u65b9\u5f0f2<br \/>\n;;; \u8f93\u5165\uff1a\u692d\u5706\u7684\u957f\u8f74a\uff0c\u77ed\u8f74b\u548c\u5e73\u9762\u7684\u4e00\u70b9P<br \/>\n;;; \u8f93\u51fa\uff1a\u692d\u5706\u7684\u8ddf\u5e73\u9762\u7684P\u70b9\u8ddd\u79bb\u4e3a\u6781\u503c\u7684\u70b9<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:GetExtremumDist1 (a b P \/ c cc e ee f K1 K2 K3 K4 K5 m n x y ps)<br \/>\n  (setq m (car p))<br \/>\n  (setq n (cadr p))<br \/>\n  (if (equal m 0 1e-10)<br \/>\n    (list (list 0 (- b)) (list 0 b))<br \/>\n    (progn<br \/>\n      (setq cc (* (+ a b) (- a b)))<br \/>\n      (setq c  (sqrt cc))<br \/>\n      (setq e  (\/ c a))<br \/>\n      (setq f  (\/ b a))<br \/>\n      (setq ee (* e e))<br \/>\n      (setq k1 (* ee ee))<br \/>\n      (setq k2 (* -2 m ee))<br \/>\n      (setq k3 (- (+ (* n n f f) (* m m)) (* ee cc)))<br \/>\n      (setq k4 (* 2 m cc))<br \/>\n      (setq k5 (- (* a a m m)))<br \/>\n      (foreach s (Math:Quartic_Equation k1 k2 k3 k4 k5)<br \/>\n        (if (equal (cadr s) 0 1e-6)<br \/>\n          (progn<br \/>\n            (setq x (car s))<br \/>\n            (setq y (\/ (* n b b) (- (\/ (* m a a) x) cc)))<br \/>\n            (setq ps (cons (list x y) ps))<br \/>\n          )<br \/>\n        )<br \/>\n      )<br \/>\n      ps<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u6c42\u7a7a\u95f4\u4e0a\u4e00\u70b9\u5230\u7a7a\u95f4\u692d\u5706\u7684\u8ddd\u79bb\u7684\u6781\u503c\uff08\u5305\u62ec\u6700\u5c0f\u503c\u548c\u6700\u5927\u503c\uff09<br \/>\n;;; \u8f93\u5165: \u692d\u5706\u7684\u4e2d\u5fc3Center,\u957f\u8f74\u77e2\u91cfmajor,\u692d\u7387ratio,\u6cd5\u7ebfNormal,\u7a7a\u95f4\u4e00\u70b9P.<br \/>\n;;; \u8f93\u51fa: \u692d\u5706\u7684\u8ddf\u7a7a\u95f4\u7684P\u70b9\u8ddd\u79bb\u4e3a\u6781\u503c\u7684\u70b9<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:GetExtremumDist_3D (Center major Ratio Normal P \/ A B M1 M2 S V1)<br \/>\n  (setq v1 (mapcar &#8216;- p center))<br \/>\n  (setq m1 (ELL:RotationMatrix major Normal))<br \/>\n  (setq m2 (cadr m1))<br \/>\n  (setq m1 (car m1))<br \/>\n  (setq v1 (mat:mxv m2 v1))<br \/>\n  (setq a  (distance &#8216;(0 0 0) major))<br \/>\n  (setq b  (* ratio a))<br \/>\n  (foreach n (ELL:GetExtremumDist a b v1)<br \/>\n    (setq n (mat:mxv m1 (append n &#8216;(0))))<br \/>\n    (setq n (mapcar &#8216;+ center n))<br \/>\n    (setq s (cons n s))<br \/>\n  )<br \/>\n)<\/p>\n<p>;;; \u6d4b\u8bd5\u6c42\u6781\u503c\u8ddd\u79bb\u7a0b\u5e8f<br \/>\n(defun C:GetExtremumDist (\/ p sel ent dxf cen maj rat nrm a b)<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u9009\u53d6\u70b91: &#8220;))<br \/>\n  (setq p (trans p 1 0))<br \/>\n  (Ent:Make_Point p)<br \/>\n  (if (setq sel (ssget &#8220;:S&#8221; &#8216;((0 . &#8220;ELLIPSE&#8221;))))<br \/>\n    (progn<br \/>\n      (setq ent (ssname sel 0))<br \/>\n      (setq dxf (entget ent))<br \/>\n      (setq cen (cdr (assoc 10 dxf)))<br \/>\n      (setq maj (cdr (assoc 11 dxf)))<br \/>\n      (setq rat (cdr (assoc 40 dxf)))<br \/>\n      (setq Nrm (cdr (assoc 210 DXF)))<br \/>\n      (setq a   (distance &#8216;(0 0 0) maj))<br \/>\n      (setq b   (* rat a))<br \/>\n;;;      (misc:test<br \/>\n;;;     1001<br \/>\n;;;     &#8216;((ELL:GetExtremumDist1 a b P)<br \/>\n;;;       (ELL:GetExtremumDist a b P)<br \/>\n;;;       (vlax-curve-getclosestpointto ent p)<br \/>\n;;;     )<br \/>\n;;;      )<br \/>\n      ;(mapcar &#8216;Ent:Make_Point (ELL:GetExtremumDist1 a b P))<br \/>\n      (mapcar &#8216;Ent:Make_Point (ELL:GetExtremumDist_3D cen maj rat Nrm P))<br \/>\n    )<br \/>\n  )<br \/>\n)[\/codesyntax]<br \/>\n\u4e03 \u692d\u5706\u7684\u5305\u56f4\u76d2\u548c\u6700\u5c0f\u5305\u56f4\u76d2<br \/>\n[codesyntax lang=&#8221;lisp&#8221;];;;=====================================================================<br \/>\n;;;\u529f\u80fd\uff1a\u83b7\u53d6\u692d\u5706\u7684\u6700\u5c0f\u5305\u56f4\u76d2(\u672a\u5b8c\u6574\u6d4b\u8bd5\uff0c\u53ef\u80fd\u5bf9\u4e8e\u67d0\u4e9b\u53d8\u5f62\u692d\u5706\u65e0\u6548)<br \/>\n;;;\u53c2\u6570\uff1a\u692d\u5706\u5b9e\u4f53<br \/>\n;;;\u8fd4\u56de\uff1a\u5305\u56f4\u8fd9\u4e2a\u692d\u5706\u7684\u6700\u5c0f\u77e9\u5f62\u7684\u56db\u4e2a\u89d2\u70b9<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:GetMinBox (ent \/ CEN DXF MAJ Pt1 Pt2 Pt3 Pt4 PTB PTD)<br \/>\n  (setq dxf (entget ent))<br \/>\n  (setq cen (cdr (assoc 10 dxf)))<br \/>\n  (setq maj (cdr (assoc 11 dxf)))<br \/>\n  (setq ptb (vlax-curve-getPointAtParam ent (* pi 0.5)))<br \/>\n  (setq ptd (vlax-curve-getPointAtParam ent (* pi 1.5)))<br \/>\n  (setq pt1 (mapcar &#8216;- ptd maj))<br \/>\n  (setq pt2 (mapcar &#8216;+ ptd maj))<br \/>\n  (setq pt3 (mapcar &#8216;+ ptb maj))<br \/>\n  (setq pt4 (mapcar &#8216;- ptb maj))<br \/>\n  (list pt1 pt2 pt3 pt4)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;;\u529f\u80fd\uff1a\u83b7\u53d6\u692d\u5706OCS\u7684\u5305\u56f4\u76d2<br \/>\n;;;\u53c2\u6570\uff1a\u692d\u5706\u7684\u4e2d\u5fc3\uff0c\u534a\u957f\u8f74\uff0c\u534a\u77ed\u8f74\uff0c\u65cb\u8f6c\u89d2<br \/>\n;;;\u8fd4\u56de\uff1a\u5305\u56f4\u8fd9\u4e2a\u692d\u5706\u7684OCS\u65b9\u5411\u7684\u56db\u4e2a\u89d2\u70b9<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:GetOCSBox (C a b ang \/ l x p 90D LL LR UL UR)<br \/>\n  (setq 90d (* pi 0.5))<br \/>\n  (foreach n (list 0 90d)<br \/>\n    (setq x (- n ang))<br \/>\n    (setq x (atan (* a (sin x)) (* b (cos x))))<br \/>\n    (setq x (+ x 90d))<br \/>\n    (setq p (list (* a (cos x)) (* b (sin x))))<br \/>\n    (setq p (GEO:Rot2D p &#8216;(0 0) ang))<br \/>\n    (setq l (cons (mapcar &#8216;+ C p) l))<br \/>\n    (setq l (cons (mapcar &#8216;- C p) l))<br \/>\n  )<br \/>\n  (setq ll (apply &#8216;mapcar (cons &#8216;min l)))<br \/>\n  (setq ur (apply &#8216;mapcar (cons &#8216;max l)))<br \/>\n  (setq lr (list (car ur) (cadr ll)))<br \/>\n  (setq ul (list (car ll) (cadr ur)))<br \/>\n  (list ll lr ur ul)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;;\u529f\u80fd\uff1a\u83b7\u53d6\u692d\u5706\u7684\u5305\u56f4\u76d2\uff08\u6b64\u5305\u56f4\u76d2\u65b9\u5411\u5e73\u884c\u4e8e\u5f53\u524d\u5750\u6807\u7cfb\uff09<br \/>\n;;;\u53c2\u6570\uff1a\u692d\u5706\u5b9e\u4f53<br \/>\n;;;\u8fd4\u56de\uff1a\u5305\u56f4\u8fd9\u4e2a\u692d\u5706\u7684\u5e73\u884c\u5f53\u524d\u5750\u6807\u7cfb\u65b9\u5411\u7684\u56db\u4e2a\u89d2\u70b9<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:GetBoundingBox (ent \/ lst obj pta ptb C Cen Maj Mnr Ret)<br \/>\n  (setq obj (vlax-ename-&gt;vla-object ent))<br \/>\n  (if (= 1 (getvar &#8216;WORLDUCS))<br \/>\n    (progn<br \/>\n      (setq lst (vla-getboundingbox obj &#8216;pta &#8216;ptb))<br \/>\n      (setq pta (vlax-safearray-&gt;list pta))<br \/>\n      (setq ptb (vlax-safearray-&gt;list ptb))<br \/>\n      (list<br \/>\n        (list (car pta) (cadr pta) 0)<br \/>\n        (list (car ptb) (cadr pta) 0)<br \/>\n        (list (car ptb) (cadr ptb) 0)<br \/>\n        (list (car pta) (cadr ptb) 0)<br \/>\n      )<br \/>\n    )<br \/>\n    (progn<br \/>\n      (setq cen (vlax-get obj &#8216;center))<br \/>\n      (setq maj (vlax-get obj &#8216;MajorAxis))<br \/>\n      (setq mnr (vlax-get obj &#8216;MinorAxis))<br \/>\n      (setq C   (trans cen 0 1))<br \/>\n      (setq pta (mapcar &#8216;+ C (trans maj 0 1 T)))<br \/>\n      (setq ptb (mapcar &#8216;+ C (trans mnr 0 1 T)))<br \/>\n      (if (setq ret (ELL:2ConjugateDiameters C pta ptb))<br \/>\n        (mat:translist (apply &#8216;ELL:GetOCSBox ret) 1 0 nil)<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;\u6d4b\u8bd5\u692d\u5706\u7684\u5305\u56f4\u76d2\u7a0b\u5e8f<br \/>\n(defun c:test3 (\/ i sel ent)<br \/>\n  (setq i 0)<br \/>\n  (if (setq sel (ssget &#8216;((0 . &#8220;ELLIPSE&#8221;))))<br \/>\n    (repeat (sslength sel)<br \/>\n      (setq ent (ssname sel i))<br \/>\n      (Ent:Make_Poly (ELL:GetBoundingBox ent))<br \/>\n      (setq i (1+ i))<br \/>\n    )<br \/>\n  )<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;\u6d4b\u8bd5\u692d\u5706\u7684\u6700\u5c0f\u5305\u56f4\u76d2\u7a0b\u5e8f<br \/>\n(defun c:test4 (\/ i sel ent ret)<br \/>\n  (setq i 0)<br \/>\n  (if (setq sel (ssget &#8216;((0 . &#8220;ELLIPSE&#8221;))))<br \/>\n    (repeat (sslength sel)<br \/>\n      (setq ent (ssname sel i))<br \/>\n      (setq ret (ELL:getMinBox ent))<br \/>\n      (Ent:Make_Poly ret)<br \/>\n      (setq i (1+ i))<br \/>\n    )<br \/>\n  )<br \/>\n  (princ)<br \/>\n)[\/codesyntax]<br \/>\n\u516b\u3001\u692d\u5706\u6784\u5efa\u4e0e\u4f5c\u56fe\u95ee\u9898<br \/>\n[codesyntax lang=&#8221;lisp&#8221;];;;=====================================================================<br \/>\n;;; Given a pair of conjugate diameters, construct an ellipse<br \/>\n;;; \u529f\u80fd: \u5df2\u77e5\u4e24\u5171\u8f6d\u534a\u8f74\u4f5c\u692d\u5706<br \/>\n;;; \u8f93\u5165: \u5171\u8f6d\u8f74\u7684\u4ea4\u70b9C(\u5373\u692d\u5706\u5706\u5fc3)\u3001\u5171\u8f6d\u534a\u8f74\u7684\u4e24\u7aef\u70b9P,Q<br \/>\n;;; \u8f93\u51fa: \u6210\u529f\u8fd4\u56de\u692d\u5706\u7684\u57fa\u672c\u8981\u7d20\uff0c\u5426\u5219\u8fd4\u56denil<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:2ConjugateDiameters (C P Q \/ a b K M R U W)<br \/>\n  (if (not (LINE:Colinearity C P Q))<br \/>\n    (progn<br \/>\n      (setq C (list (car C) (cadr C)))<br \/>\n      (setq P (list (car P) (cadr P)))<br \/>\n      (setq Q (list (car Q) (cadr Q)))<br \/>\n      (setq K (GEO:Rot90 C C Q))<br \/>\n      (setq M (GEO:Midpoint K P))<br \/>\n      (setq R (distance M C))<br \/>\n      (setq U (polar M (angle M P) R))<br \/>\n      (setq W (polar M (angle M K) R))<br \/>\n      (setq a (distance W P))<br \/>\n      (setq b (distance U P))<br \/>\n      (list C a b (angle C U))<br \/>\n    )<br \/>\n  )<br \/>\n)<br \/>\n;|<br \/>\n;;;\u6d4b\u8bd5\u5171\u8f6d\u534a\u5f84\u7684\u692d\u5706<br \/>\n(defun C:CDD (\/ c p q ret ent obj)<br \/>\n  (initget 1)<br \/>\n  (setq C (getpoint &#8220;n\u4e2d\u5fc3&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint C &#8220;n\u534a\u5f841&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq Q (getpoint C &#8220;n\u534a\u5f842&#8221;))<br \/>\n  (foreach n (list C P Q)<br \/>\n    (Ent:make_Point (trans n 1 0))<br \/>\n  )<br \/>\n  (if (setq ret (ELL:2ConjugateDiameters C P Q))<br \/>\n    (progn<br \/>\n      (setq ent (apply &#8216;Ent:Make_Ellipse ret))<br \/>\n      (setq obj (vlax-ename-&gt;vla-object ent))<br \/>\n      (vla-transformby obj (vlax-tmatrix (mat:u2w)))<br \/>\n    )<br \/>\n  )<br \/>\n)|;<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse with a given axis to pass through a given point<br \/>\n;;; \u529f\u80fd: \u5df2\u77e5\u692d\u5706\u7684\u4e00\u4e2a\u957f\u8f74\uff0c\u548c\u692d\u5706\u4e0a\u7684\u4e00\u70b9<br \/>\n;;; \u8f93\u5165: \u957f\u8f74\u7684\u4e24\u4e2a\u7aef\u70b9M\u3001N\u548c\u692d\u5706\u4e0a\u7684\u4e00\u70b9P<br \/>\n;;; \u8f93\u51fa: \u6210\u529f\u8fd4\u56de\u692d\u5706\u7684\u57fa\u672c\u8981\u7d20\uff0c\u5426\u5219\u8fd4\u56denil<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Axis_Point (M N P \/ C a b Maj Vec x y d)<br \/>\n  (setq C (Geo:Midpoint M N))<br \/>\n  (setq A (distance C M))<br \/>\n  (setq Maj (mapcar &#8216;- M C))<br \/>\n  (setq vec (trans (mapcar &#8216;- P C) 0 Maj T))                            ;???<br \/>\n  (setq x (caddr vec))<br \/>\n  (setq y (car vec))<br \/>\n  (if (not (&gt;= (abs x) a))<br \/>\n    (progn<br \/>\n      (setq d (sqrt (* (+ a x) (- a x))))<br \/>\n      (setq b (abs (* (\/ y d) a)))<br \/>\n      (list C a b (angle C M))<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse with a given axis to touch a given line<br \/>\n;;; \u529f\u80fd: \u5df2\u77e5\u692d\u5706\u7684\u4e00\u4e2a\u534a\u957f\u8f74\uff0c\u548c\u692d\u5706\u5916\u7684\u4e00\u6761\u5207\u7ebf<br \/>\n;;; \u8f93\u5165: \u534a\u957f\u8f74\u7684\u4e24\u4e2a\u7aef\u70b9M\u3001N\u548c\u692d\u5706\u4e0a\u7684\u4e00\u70b9P<br \/>\n;;; \u8f93\u51fa: \u6210\u529f\u8fd4\u56de\u692d\u5706\u7684\u57fa\u672c\u8981\u7d20\uff0c\u5426\u5219\u8fd4\u56denil<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Axis_Tangent (M N P Q \/ C A Ax an v1 v2 y1 x1 y2 x2 d1 d2 d3)<br \/>\n  (setq C  (Geo:Midpoint M N))<br \/>\n  (setq A  (distance C M))<br \/>\n  (setq Ax (mapcar &#8216;- M C))<br \/>\n  (setq an (angle C M))<br \/>\n  (setq v1 (trans (mapcar &#8216;- P C) 0 Ax T))                              ;???<br \/>\n  (setq v2 (trans (mapcar &#8216;- Q C) 0 Ax T))                              ;???<br \/>\n  (setq y1 (car   v1))<br \/>\n  (setq x1 (caddr v1))<br \/>\n  (setq y2 (car   v2))<br \/>\n  (setq x2 (caddr v2))<br \/>\n  (setq d1 (- (* x1 y2) (* x2 y1)))<br \/>\n  (setq d2 (- y1 y2))<br \/>\n  (setq d3 (- (* D1 D1) (* d2 d2 a a)))<br \/>\n  (if (and (not (equal x1 x2 1e-14)) (&gt; d3 0))<br \/>\n    (list C a (abs (\/ (sqrt d3) (- x1 x2))) an)<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun ELL:Axis_Tangent_1 (M N P Q \/ C A Maj I L x Ang G H J)<br \/>\n  (setq C (Geo:Midpoint M N))<br \/>\n  (setq A (distance C M))<br \/>\n  (setq Maj (mapcar &#8216;- M C))<br \/>\n  (if (setq I (inters M N P Q nil))<br \/>\n    (progn<br \/>\n      (setq L (distance C I))<br \/>\n      (setq x (\/ (* a a) L))<br \/>\n      (setq ang (angle C I))<br \/>\n      (setq G (polar C ang (abs x)))<br \/>\n      (setq H (polar G (+ ang (* pi 0.5)) a))<br \/>\n      (setq J (inters G H P Q nil))<br \/>\n      (if J<br \/>\n        (ELL:Axis_Point M N J)<br \/>\n      )<br \/>\n    )<br \/>\n    (progn<br \/>\n      (setq ang (angle C M))<br \/>\n      (setq G (polar C (+ ang (* pi 0.5)) A))<br \/>\n      (setq H (inters C G P Q nil))<br \/>\n      (if H<br \/>\n        (list C a (distance C H) ang)<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:Axis_Tangent ()<br \/>\n  (initget 1)<br \/>\n  (setq M (getpoint &#8220;n\u7aef\u70b91&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq N (getpoint M &#8220;n\u7aef\u70b92&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u70b91\uff1a&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq Q (getpoint P &#8220;n\u70b92\uff1a&#8221;))<br \/>\n  (setq M (trans M 1 0))<br \/>\n  (setq N (trans N 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq Q (trans Q 1 0))<br \/>\n  (mapcar &#8216;Ent:make_Point (list M N P Q))<br \/>\n  (Ent:make_line P Q)<br \/>\n  ;(setq E (ELL:Axis_Point M N P))<br \/>\n  (MISC:test 1001 &#8216;((ELL:Axis_Tangent M N P Q) (ELL:Axis_Tangent_1 M N P Q)))<br \/>\n  (setq E (ELL:Axis_Tangent M N P Q))<br \/>\n  (and E (apply &#8216;Ent:Make_Ellipse E))<br \/>\n  (setq E (ELL:Axis_Tangent_1 M N P Q))<br \/>\n  (and E (apply &#8216;Ent:Make_Ellipse E))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, Given the directions of a pair of conjugate<br \/>\n;;; diameters, a tangent and its point of contact being given<br \/>\n;;; \u529f\u80fd: \u5df2\u77e5\u692d\u5706\u7684\u4e24\u4e2a\u5171\u8f6d\u8f74\u65b9\u5411\uff0c\u4e00\u6761\u5207\u7ebf\u548c\u8fd9\u4e2a\u5207\u70b9<br \/>\n;;; \u8f93\u5165: \u4e24\u6761\u5171\u8f6d\u8f74JK\u548cMN,\u5207\u7ebfPQ\u5e76\u5207\u4e8eP\u70b9<br \/>\n;;; \u8f93\u51fa: \u6210\u529f\u8fd4\u56de\u692d\u5706\u7684\u57fa\u672c\u8981\u7d20\uff0c\u5426\u5219\u8fd4\u56denil<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:2Directions_Tangent_Point (J K M N P Q \/ C G H A B E F U W r s x y)<br \/>\n  (if (and (setq C (inters J K M N nil))<br \/>\n           (setq G (inters P Q J K nil))<br \/>\n           (setq H (inters P Q M N nil))<br \/>\n      )<br \/>\n    (progn<br \/>\n      (setq A (angle C G))<br \/>\n      (setq B (angle C H))<br \/>\n      (setq U (inters P (polar P B 1) J K nil))<br \/>\n      (setq W (inters P (polar P A 1) M N nil))<br \/>\n      (setq r (distance C G))<br \/>\n      (setq s (distance C H))<br \/>\n      (setq x (distance C U))<br \/>\n      (setq y (distance C W))<br \/>\n      (if (and (&lt; x r) (&lt; y s))<br \/>\n        (progn<br \/>\n          (setq x (sqrt (* x r)))<br \/>\n          (setq y (sqrt (* y s)))<br \/>\n          (setq E (polar C A X))<br \/>\n          (setq F (polar C B Y))<br \/>\n          (ELL:2ConjugateDiameters C E F)<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:2Directions_Tangent_Point ()<br \/>\n  (initget 1)<br \/>\n  (setq J (getpoint &#8220;n\u7aef\u70b91&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq K (getpoint J &#8220;n\u7aef\u70b92&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq M (getpoint &#8220;n\u7aef\u70b91&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq N (getpoint M &#8220;n\u7aef\u70b92&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u5207\u70b9\uff1a&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq Q (getpoint P &#8220;n\u53e6\u4e00\u70b9\uff1a&#8221;))<br \/>\n  (setq J (trans J 1 0))<br \/>\n  (setq K (trans K 1 0))<br \/>\n  (setq M (trans M 1 0))<br \/>\n  (setq N (trans N 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq Q (trans Q 1 0))<br \/>\n  (mapcar &#8216;Ent:make_Point (list J K M N P Q))<br \/>\n  (Ent:make_line P Q)<br \/>\n  (Ent:make_line J K)<br \/>\n  (Ent:make_line M N)<br \/>\n  (setq E (ELL:2Directions_Tangent_Point J K M N P Q))<br \/>\n  (and E (apply &#8216;Ent:Make_Ellipse E))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, the center, two points on the curve and<br \/>\n;;; directions of a pair of conjugate diameters being given.<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:2Directions_2Points (C M N P Q \/ A B D E F G I P1 Q1 R S U W X Y Z)<br \/>\n  (if (and  (inters P Q C M nil) (inters P Q C N nil))<br \/>\n    (progn<br \/>\n      (setq x (angle C M))<br \/>\n      (setq y (angle C N))<br \/>\n      (setq D (inters P (polar P x 1) C N nil))<br \/>\n      (setq S (inters Q (polar Q y 1) C M nil))<br \/>\n      (setq E (inters P D Q S nil))<br \/>\n      (setq P1 (polar D (angle P D) (distance P D)))<br \/>\n      (setq Q1 (polar S (angle Q S) (distance Q S)))<br \/>\n      (setq F (polar S (angle P Q) 1))<br \/>\n      (setq F (inters S F D E nil))<br \/>\n      (setq G (polar S (angle P1 Q1) 1))<br \/>\n      (setq G (inters S G D E nil))<br \/>\n      (setq z (sqrt (* (distance E F) (distance E G))))<br \/>\n      (setq i (angle E P))<br \/>\n      (setq r (distance P D))<br \/>\n      (setq a (sqrt (+ (* r r) (* z z))))<br \/>\n      (setq U (polar C I a))<br \/>\n      (setq b (\/ (* (distance C D) a) z))<br \/>\n      (setq W (polar C (angle C D) b))<br \/>\n      (ELL:2ConjugateDiameters C U W)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:2Directions_2Points  ()<br \/>\n  (initget 1)<br \/>\n  (setq C (getpoint &#8220;n\u4e2d\u5fc3: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq M (getpoint C &#8220;n\u7aef\u70b91&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq N (getpoint C &#8220;n\u7aef\u70b92&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u4e00\u70b9\uff1a&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq Q (getpoint P &#8220;n\u53e6\u4e00\u70b9\uff1a&#8221;))<br \/>\n  (setq C (trans C 1 0))<br \/>\n  (setq M (trans M 1 0))<br \/>\n  (setq N (trans N 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq Q (trans Q 1 0))<br \/>\n  (mapcar &#8216;Ent:make_Point (list C M N P Q))<br \/>\n  (setq K (ELL:2Directions_2Points C M N P Q))<br \/>\n  (and K (apply &#8216;Ent:Make_Ellipse K))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, the center, the directions of the major axis<br \/>\n;;; and two tangents being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:MajorDirection_2Tangents (C M P D E \/ A A0 A1 A2 A3 A4 A5 B F F1 F2 F3 G H L O R S T1)<br \/>\n  (setq a0 (angle C M))                                                 ;\u957f\u8f74\u7684\u65b9\u5411\u89d2<br \/>\n  (setq a1 (angle p D))                                                 ;\u76f4\u7ebf\u4e00\u7684\u65b9\u5411\u89d2<br \/>\n  (setq a2 (angle p E))                                                 ;\u76f4\u7ebf\u4e8c\u7684\u65b9\u5411\u89d2<br \/>\n  (setq a3 (* (+ a1 a2) 0.5))                                           ;\u4e24\u76f4\u7ebf\u5185\u89d2\u5e73\u5206\u7ebf<br \/>\n  (setq a4 (+ a3 (* pi 0.5)))                                           ;\u4e24\u76f4\u7ebf\u5916\u89d2\u5e73\u5206\u7ebf<br \/>\n  (setq G (inters P (polar P a3 1) C M nil))                            ;\u5185\u89d2\u5e73\u5206\u7ebf\u4e0e\u957f\u8f74\u4ea4\u4e8eG<br \/>\n  (setq H (inters P (polar p a4 1) C M nil))                            ;\u5916\u89d2\u5e73\u5206\u7ebf\u4e0e\u957f\u8f74\u4ea4\u4e8eH<br \/>\n  (if (and G H)                                                         ;\u5982\u679c\u4ea4\u70b9\u90fd\u5b58\u5728\uff08\u5426\u5219\u65e0\u89e3\u6216\u65e0\u7a77\u89e3\uff09<br \/>\n    (progn<br \/>\n      (setq O (Geo:MidPoint G H))                                       ;GH\u7684\u4e2d\u70b9\u4e3a\u5706\u5fc3\uff0cGH\u4e3a\u76f4\u5f84\u505a\u4f5c\u5706<br \/>\n      (setq R (distance O G))                                           ;OG\u4e3a\u8fd9\u4e2a\u5706\u7684\u534a\u5f84<br \/>\n      (setq L (distance O C))<br \/>\n      (if (&gt;= L R)                                                      ;\u5982\u679c\u53ef\u4ee5\u4f5c\u5207\u7ebf<br \/>\n        (progn<br \/>\n          (setq F  (sqrt (* (+ L R) (- L R))))                          ;\u5207\u7ebf\u957f\u5373\u4e3a\u7126\u8ddd<br \/>\n          (setq F1 (polar C a0 (- F)))                                  ;\u5de6\u7126\u70b9F1<br \/>\n          (setq F2 (polar C a0 F))                                      ;\u53f3\u7126\u70b9F2<br \/>\n          (setq F3 (polar P (+ a1 (- a1 (angle P F1))) (distance P F1)));F1\u5173\u4e8ePD\u7684\u5bf9\u79f0\u70b9F3<br \/>\n          (setq T1 (inters F2 F3 P D nil))                              ;F2F3\u4e0ePD\u7684\u4ea4\u70b9\u4e3a\u5207\u70b9<br \/>\n          (setq a5 (* (+ (angle T1 F1) (angle T1 F2)) 0.5))             ;\u89d2F1T1F2\u7684\u5e73\u5206\u7ebf<br \/>\n          (if (or (equal a5 a1 1e-6) (equal (abs (- a1 a5)) pi 1e-6))   ;\u5982\u679c\u5e73\u5206\u7ebf\u4e0ePD\u91cd\u5408<br \/>\n            nil                                                         ;\u65e0\u89e3<br \/>\n            (setq a (* 0.5 (+ (distance F1 T1) (distance F2 T1)))       ;\u5426\u5219\u5f97\u5230\u692d\u5706\u7684\u957f\u8f74\u957f<br \/>\n                  b (sqrt (* (- a f) (+ a f)))                          ;\u7531\u7126\u8ddd\u548c\u957f\u8f74\u5f97\u5230\u77ed\u8f74<br \/>\n                  s (list C a b a0)                                     ;\u56e0\u800c\u5f97\u89e3<br \/>\n            )<br \/>\n          )<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:MajorDirection_2Tangents ()<br \/>\n  (initget 1)<br \/>\n  (setq C (getpoint &#8220;n\u4e2d\u5fc3: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq M (getpoint C &#8220;n\u4e3b\u8981\u65b9\u5411: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u4ea4\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq D (getpoint P &#8220;n\u76f4\u7ebf1\uff1a&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq E (getpoint P &#8220;n\u76f4\u7ebf2\uff1a&#8221;))<br \/>\n  (setq C (trans C 1 0))<br \/>\n  (setq M (trans M 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq D (trans D 1 0))<br \/>\n  (setq E (trans E 1 0))<br \/>\n  (mapcar &#8216;Ent:make_Point (list C M P D E))<br \/>\n  (Ent:make_line P D)<br \/>\n  (Ent:make_line P E)<br \/>\n  (Ent:make_line C M)<br \/>\n  (setq S (ELL:MajorDirection_2Tangents C M P D E))<br \/>\n  (and S (apply &#8216;Ent:Make_Ellipse S))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, the center, the directions of a pair of<br \/>\n;;; conjugate diameters, a tangent and a point on the curve being given<br \/>\n;;; \u5df2\u77e5\u692d\u5706\u7684\u5171\u8f6d\u8f74\u7684\u65b9\u5411\u548c\u692d\u5706\u7684\u4e0a\u7684\u4e00\u70b9\u4ee5\u53ca\u4e00\u6761\u5207\u7ebf\uff0c\u4f5c\u8fd9\u4e2a\u692d\u5706<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:ConjugateDirections_Point_Tangent (C D E P P1 P2 \/)<br \/>\n  (if (or (LINE:Colinearity C D E)<br \/>\n          (LINE:Colinearity C P1 P2)<br \/>\n          (equal P C 1e-8)<br \/>\n      )<br \/>\n    nil<br \/>\n    (progn<br \/>\n      (setq M (inters P1 P2 C D nil))<br \/>\n      (setq N (inters P1 P2 C E nil))<br \/>\n      (setq L1 (distance C P))<br \/>\n      (if (and M N)<br \/>\n        (if (setq F (inters C P M N nil))<br \/>\n          (if (&gt;= (setq L2 (distance C F)) L1)<br \/>\n            (progn<br \/>\n              (setq L3 (sqrt (* (+ L2 L1) (- L2 L1))))<br \/>\n              (setq O (Geo:MidPoint M N))<br \/>\n              (setq R (distance O M))<br \/>\n              (setq a1 (angle F O))<br \/>\n              (setq a2 (+ a1 (* pi 0.5)))<br \/>\n              (setq J (polar F a1 L3))<br \/>\n              (setq K (polar J a2 L1))<br \/>\n              (setq S nil)<br \/>\n              (foreach I (CIR:Inters_Circle_Line O R F K)<br \/>\n                (setq H (inters I (polar I a2 1) M N nil))<br \/>\n                (setq G (polar C a1 (distance H I)))<br \/>\n                (setq S (cons (ELL:2ConjugateDiameters C G H) S))<br \/>\n              )<br \/>\n            )<br \/>\n          )<br \/>\n          (cond<br \/>\n            ( (equal L1 (setq R (* 0.5 (distance M N))) 1e-8)<br \/>\n              (List (ELL:2ConjugateDiameters C P (Geo:MidPoint M N)))<br \/>\n            )<br \/>\n            ( (&lt; L1 R)<br \/>\n              (setq O (Geo:MidPoint M N))<br \/>\n              (setq L2 (sqrt (* (+ R L1) (- R L1))))<br \/>\n              (setq a1 (angle O M))<br \/>\n              (setq J  (polar O a1 L2))<br \/>\n              (setq K  (polar O a1 (- L2)))<br \/>\n              (setq S  nil)<br \/>\n              (foreach I (list J K)<br \/>\n                (setq S (cons (ELL:2ConjugateDiameters C I P) S))<br \/>\n              )<br \/>\n            )<br \/>\n          )<br \/>\n        )<br \/>\n        (progn<br \/>\n          (and N (setq M N N D D E E N))<br \/>\n          (if (setq F (inters C P P1 P2 nil))<br \/>\n            (if (&lt; L1 (setq L2 (distance C F)))<br \/>\n              (progn<br \/>\n                (setq L3 (sqrt (* (+ L2 L1) (- L2 L1))))<br \/>\n                (setq L4 (\/ (* L1 (distance F M)) L3))<br \/>\n                (setq E  (polar C (angle C E) L4))<br \/>\n                (list (ELL:2ConjugateDiameters C E M))<br \/>\n              )<br \/>\n            )<br \/>\n            (list (ELL:2ConjugateDiameters C P M))<br \/>\n          )<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun C:ConjugateDirections_Point_Tangent ()<br \/>\n  (initget 1)<br \/>\n  (setq C (getpoint &#8220;n\u4e2d\u5fc3: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq D (getpoint C &#8220;n\u5171\u8f6d\u65b9\u54111: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq E (getpoint C &#8220;n\u5171\u8f6d\u65b9\u54112: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u692d\u5706\u4e0a\u4e00\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq M (getpoint  &#8220;n\u76f4\u7ebf\u7aef\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq N (getpoint M &#8220;n\u76f4\u7ebf\u7aef\u70b92: &#8220;))<br \/>\n\u3000\u3000<br \/>\n  (setq C (trans C 1 0))<br \/>\n  (setq D (trans D 1 0))<br \/>\n  (setq E (trans E 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq M (trans M 1 0))<br \/>\n  (setq N (trans N 1 0))<\/p>\n<p>  (mapcar &#8216;Ent:make_Point (list C D E P M N))<br \/>\n  (Ent:make_line M N)<br \/>\n  (Ent:make_line C E)<br \/>\n  (Ent:make_line C D)<br \/>\n  (setq S (ELL:ConjugateDirections_Point_Tangent C D E P M N))<br \/>\n  (foreach x S (apply &#8216;Ent:Make_Ellipse x))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, the center, two tangents and a point on the<br \/>\n;;; curve being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Center_Point_2Tangents (C P I M N \/ A1 A2 A3 D E F G H L1 L2 L3 O R S)<br \/>\n  (if (not (setq E (inters C P I N nil)))<br \/>\n    (setq E N N M M E E (inters C P I N nil))<br \/>\n  )<br \/>\n  (setq L1 (distance C P))<br \/>\n  (setq L2 (distance C E))<br \/>\n  (if (&gt; L2 L1)<br \/>\n    (progn<br \/>\n      (setq L3 (sqrt (* (+ L2 L1) (- L2 L1))))<br \/>\n      (setq a1 (angle I M))<br \/>\n      (setq a2 (angle I N))<br \/>\n      (setq a3 (+ a2 (* pi 0.5)))<br \/>\n      (setq O  (inters C (polar C a1 1) I N nil))<br \/>\n      (setq F  (polar E a2 L3))<br \/>\n      (setq G  (polar F a3 L1))<br \/>\n      (setq R  (distance O I))<br \/>\n      (foreach K (CIR:Inters_Circle_Line O R G E)<br \/>\n        (setq H (inters K (polar K a3 1) I N nil))<br \/>\n        (setq D (polar C a2 (distance K H)))<br \/>\n        (setq s (cons (ELL:2ConjugateDiameters C H D) s))<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:Center_Point_2Tangents ()<br \/>\n  (initget 1)<br \/>\n  (setq C (getpoint &#8220;n\u4e2d\u5fc3: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint C &#8220;n\u692d\u5706\u4e0a\u4e00\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq I (getpoint &#8220;n\u5207\u7ebf\u4ea4\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq M (getpoint I &#8220;n\u5207\u7ebf1: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq N (getpoint I &#8220;n\u5207\u7ebf2: &#8220;))<br \/>\n\u3000\u3000<br \/>\n  (setq C (trans C 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq I (trans I 1 0))<br \/>\n  (setq M (trans M 1 0))<br \/>\n  (setq N (trans N 1 0))<\/p>\n<p>  (mapcar &#8216;Ent:make_Point (list C P I M N))<br \/>\n  (Ent:make_line I M)<br \/>\n  (Ent:make_line I N)<br \/>\n  (Ent:make_line C P)<br \/>\n  (setq S (ELL:Center_Point_2Tangents C P I M N))<br \/>\n  (foreach x S (apply &#8216;Ent:Make_Ellipse x))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, the center, two points on curve and a tangent<br \/>\n;;; being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Center_2Points_Tangent (C A B P Q \/ d e)<br \/>\n  (setq D (GEO:MidPoint A B))<br \/>\n  (setq E (inters C (polar C (angle A B) 1) P Q nil))<br \/>\n  (ELL:ConjugateDirections_Point_Tangent C D E A P Q)<br \/>\n)<\/p>\n<p>(defun c:vvv()<br \/>\n  (initget 1)<br \/>\n  (setq C (getpoint &#8220;n\u4e2d\u5fc3: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq A (getpoint C &#8220;n\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq B (getpoint C &#8220;n\u70b92: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u5207\u7ebf\u70b91: &#8220;))\u3000\u3000<br \/>\n  (initget 1)<br \/>\n  (setq Q (getpoint P &#8220;n\u5207\u7ebf\u70b92: &#8220;))\u3000\u3000<br \/>\n  (setq C (trans C 1 0))<br \/>\n  (setq A (trans A 1 0))<br \/>\n  (setq B (trans B 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq Q (trans Q 1 0))<br \/>\n  (mapcar &#8216;Ent:make_Point (list C A B P Q))<br \/>\n  (Ent:make_line P Q)<br \/>\n  (foreach x (ELL:Center_2Points_Tangent C A B P Q)<br \/>\n    (apply &#8216;Ent:Make_Ellipse x)<br \/>\n  )<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, the center, three tangents being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Center_3Tangents (C D E F \/ A B D1 D2 D3 G H I J K L1 L2 L3 P Q U W X Y)<br \/>\n  (setq d1 (distance C D))<br \/>\n  (setq d2 (distance C E))<br \/>\n  (setq d3 (distance C F))<br \/>\n  (setq l3 (distance D E))<br \/>\n  (setq l2 (distance D F))<br \/>\n  (setq l1 (distance E F))<\/p>\n<p>  (if (and (TRI:IsTriangle l1 l2 l3)<br \/>\n           (TRI:IsTriangle d1 d2 l3)<br \/>\n           (TRI:IsTriangle d2 d3 l1)<br \/>\n           (TRI:IsTriangle d3 d1 l2)<br \/>\n      )<br \/>\n    (progn<br \/>\n      (setq X (inters (GEO:scale2 C D) (GEO:scale2 C F) D E nil))<br \/>\n      (setq Y (GEO:Scale2 C X))<br \/>\n      (setq G (inters Y (polar Y (angle C E) 1) E F nil))<br \/>\n      (setq H (inters X (polar X (angle C F) 1) E F nil))<br \/>\n      (setq I (inters X G Y H nil))<br \/>\n      (setq J (inters I D E F nil))<br \/>\n      (setq K (inters J (polar J (angle X G) 1) D E nil))<br \/>\n      (setq A (angle C X))<br \/>\n      (setq B (angle C D))<br \/>\n      (setq P (inters K (polar K B 1) X Y nil))<br \/>\n      (setq Q (inters K (polar K A 1) C D nil))<br \/>\n      (setq D1 (distance C P))<br \/>\n      (setq D2 (distance C X))<br \/>\n      (setq L1 (distance C Q))<br \/>\n      (setq L2 (distance C D))<br \/>\n      (if (and (&lt; D1 D2) (&lt; L1 L2))<br \/>\n        (progn<br \/>\n          (setq U (polar C A (sqrt (* D1 D2))))<br \/>\n          (setq W (polar C B (sqrt (* L1 L2))))<br \/>\n          (ELL:2ConjugateDiameters C U W)<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;;highflybird  2012.5.29 \u521b\u4f5c\u4e8e\u6df1\u5733 2013.5.5 \u4fee\u6539\u4e8e\u6df1\u5733<br \/>\n;;;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n;;;\u529f\u80fd\uff1a\u6839\u636e\u4e2d\u5fc3\u548c\u692d\u5706\u4e0a\u7684\u4e09\u70b9\u753b\u8fd9\u4e2a\u692d\u5706<br \/>\n;;;\u53c2\u6570\uff1a\u4e2d\u5fc3\u70b9\uff0c\u548c\u5176\u4ed6\u4e09\u70b9<br \/>\n;;;\u8fd4\u56de\uff1a\u4e2d\u5fc3\u70b9\uff0c\u534a\u957f\u8f74\u503c\u3001\u534a\u77ed\u8f74\u3001\u65cb\u8f6c\u89d2<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:C3P (Cen p1 p2 p3 \/ a b c abc ac bb aX bY an I J PT1 PT2 PT3 SS)<br \/>\n  (setq p1 (mapcar &#8216;- p1 cen))<br \/>\n  (setq p2 (mapcar &#8216;- p2 cen))<br \/>\n  (setq p3 (mapcar &#8216;- p3 cen))<br \/>\n  (setq abc (Mat:3VLE (* (car  p1) (car  p1))<br \/>\n                      (* (car  p1) (cadr p1))<br \/>\n                      (* (cadr p1) (cadr p1))<br \/>\n                      (* (car  p2) (car  p2))<br \/>\n                      (* (car  p2) (cadr p2))<br \/>\n                      (* (cadr p2) (cadr p2))<br \/>\n                      (* (car  p3) (car  p3))<br \/>\n                      (* (car  p3) (cadr p3))<br \/>\n                      (* (cadr p3) (cadr p3))<br \/>\n                      1. 1. 1.<br \/>\n            )<br \/>\n  )<br \/>\n  (if abc<br \/>\n    (progn<br \/>\n      (setq a  (car   abc))<br \/>\n      (setq b  (cadr  abc))<br \/>\n      (setq c  (caddr abc))<br \/>\n      (setq b  (\/ b 2))<br \/>\n      (setq bb (* b b))<br \/>\n      (setq ac (* a c))<br \/>\n      (setq I  (+ a c))<br \/>\n      (setq J  (- a c))<br \/>\n      (setq ss (sqrt (+ (* J J) (* 4 bb))))<br \/>\n      (if (&gt; I ss)<br \/>\n        (progn<br \/>\n          (setq aX (sqrt (\/ 2 (- I ss))))<br \/>\n          (setq bY (sqrt (\/ 2 (+ I ss))))<br \/>\n          (if (equal (\/ J I) 0 1e-16)<br \/>\n            (setq an (\/ (atan b 0) 2))<br \/>\n            (setq an (\/ (atan (\/ (+ b b) J)) 2))<br \/>\n          )<br \/>\n          (and (&gt; a c) (setq an (+ an (\/ pi 2))))<br \/>\n          (list cen aX bY an)                                           ;\u8fd4\u56de\u4e2d\u5fc3\uff0c\u534a\u957f\u8f74\uff0c\u534a\u77ed\u8f74\uff0c\u65cb\u8f6c\u89d2\u5ea6<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;;highflybird  2012.5.29<br \/>\n;;;\u529f\u80fd\uff1a\u6839\u636e\u4e2d\u5fc3\u548c\u692d\u5706\u4e0a\u7684\u4e09\u70b9\u753b\u8fd9\u4e2a\u692d\u5706\uff08\u53e6\u4e00\u7b97\u6cd5\uff09<br \/>\n;;;\u53c2\u6570\uff1a\u4e2d\u5fc3\u70b9\uff0c\u548c\u5176\u4ed6\u4e09\u70b9<br \/>\n;;;\u8fd4\u56de\uff1a\u4e2d\u5fc3\u70b9\uff0c\u534a\u957f\u8f74\u503c\u3001\u534a\u77ed\u8f74\u3001\u65cb\u8f6c\u89d2<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:C3P_1 (Cen p1 p2 p3 \/ A11 A12 A13 A21 A22 A23 A31 A32 A33<br \/>\n                                 ANG A B PT1 PT2 PT3 UVW U V W)<br \/>\n  (setq pt1 (mapcar &#8216;- p1 cen))<br \/>\n  (setq pt2 (mapcar &#8216;- p2 cen))<br \/>\n  (setq pt3 (mapcar &#8216;- p3 cen))<br \/>\n  (setq a11 (* (car  pt1) (car  pt1)))<br \/>\n  (setq a12 (* (car  pt1) (cadr pt1)))<br \/>\n  (setq a13 (* (cadr pt1) (cadr pt1)))<br \/>\n  (setq a21 (* (car  pt2) (car  pt2)))<br \/>\n  (setq a22 (* (car  pt2) (cadr pt2)))<br \/>\n  (setq a23 (* (cadr pt2) (cadr pt2)))<br \/>\n  (setq a31 (* (car  pt3) (car  pt3)))<br \/>\n  (setq a32 (* (car  pt3) (cadr pt3)))<br \/>\n  (setq a33 (* (cadr pt3) (cadr pt3)))<br \/>\n  (setq uvw (MAT:3VLE a11 a12 a13 a21 a22 a23 a31 a32 a33 1. 1. 1.))<br \/>\n  (setq u (car uvw))<br \/>\n  (setq v (cadr uvw))<br \/>\n  (setq w (caddr uvw))<br \/>\n  (if uvw<br \/>\n    (if (and (zerop v) (equal u w 1e-16))                               ;\u8fd9\u662f\u4e2a\u5706<br \/>\n      (list cen (sqrt (\/ 1 u)))<br \/>\n      (progn<br \/>\n        (if (zerop v)<br \/>\n          (setq ang (\/ (atan 0 (- u w)) 2)<br \/>\n                a   (\/ (+ u w (\/ (- u w) (cos (* 2 ang)))) 2.0)<br \/>\n          )<br \/>\n          (progn<br \/>\n            (if (equal u w 1e-16)<br \/>\n              (setq ang (\/ (atan v 0) 2))<br \/>\n              (setq ang (\/ (atan (\/ v (- u w))) 2))<br \/>\n            )<br \/>\n            (setq a (\/ (+ u w (\/ v (sin (* 2 ang)))) 2.0))<br \/>\n          )<br \/>\n        )<br \/>\n        (setq b (+ u w (- a)))<br \/>\n        (if (and (&gt; a 0) (&gt; b 0))<br \/>\n          (progn<br \/>\n            (setq a (sqrt (\/ 1 a)))<br \/>\n            (setq b (sqrt (\/ 1 b)))<br \/>\n            (if (&gt; b a)<br \/>\n              (list cen b a (+ ang (\/ pi 2)))<br \/>\n              (list cen a b ang)<br \/>\n            )<br \/>\n          )<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;;highflybird  2012.5.29 \u521b\u4f5c\u4e8e\u6df1\u5733 2013.5.5 \u4fee\u6539\u4e8e\u6df1\u5733<br \/>\n;;;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n;;;\u529f\u80fd\uff1a\u6839\u636e\u692d\u5706\u4e0a\u7684\u56db\u70b9\u753b\u6c34\u5e73(\u6216\u8005\u5782\u76f4)\u65b9\u5411\u692d\u5706<br \/>\n;;;\u53c2\u6570\uff1a\u56db\u4e2a\u7ed9\u5b9a\u7684\u4e8c\u4f4d\u6216\u8005\u4e09\u7ef4\u70b9<br \/>\n;;;\u8fd4\u56de\uff1a\u4e2d\u5fc3\u70b9\uff0c\u534a\u957f\u8f74\u503c\u3001\u534a\u77ed\u8f74\u3001\u65cb\u8f6c\u89d2<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:4P (p0 p1 p2 p3 \/ A B C D K M N O X1 X2 X3 Y1 Y2 Y3 U1 U2 U3 W1 W2 W3)<br \/>\n  (setq p1 (mapcar &#8216;- p1 p0)<br \/>\n        p2 (mapcar &#8216;- p2 p0)<br \/>\n        p3 (mapcar &#8216;- p3 p0)<br \/>\n        x1 (car  p1)<br \/>\n        y1 (cadr p1)<br \/>\n        x2 (car  p2)<br \/>\n        y2 (cadr p2)<br \/>\n        x3 (car  p3)<br \/>\n        y3 (cadr p3)<br \/>\n        U1 (* x1 x1)<br \/>\n        W1 (* y1 y1)<br \/>\n        U2 (* x2 x2)<br \/>\n        W2 (* y2 y2)<br \/>\n        U3 (* x3 x3)<br \/>\n        W3 (* y3 y3)<br \/>\n        A  (MAT:Det3 W1 x1 y1 W2 x2 y2 W3 x3 y3)<br \/>\n        B  (MAT:Det3 U1 x1 y1 U2 x2 y2 U3 x3 y3)<br \/>\n        C  (MAT:Det3 U1 W1 y1 U2 W2 y2 U3 W3 y3)<br \/>\n        D  (MAT:Det3 U1 W1 x1 U2 W2 x2 U3 W3 x3)<br \/>\n        B  (- B)<br \/>\n        D  (- D)<br \/>\n  )<br \/>\n  (if (or (and (&gt; A 0) (&gt; B 0)) (and (&lt; A 0) (&lt; B 0)))<br \/>\n    (progn<br \/>\n      (setq K (+ (\/ (* C C) 4 A) (\/ (* D D) 4 B)))<br \/>\n      (setq m (sqrt (\/ K A)))<br \/>\n      (setq n (sqrt (\/ K B)))<br \/>\n      (setq O (list (\/ C A -2) (\/ D B -2) 0))<br \/>\n      (setq O (mapcar &#8216;+ O P0))<br \/>\n      (if (\/= m 0.0 n 0.0)<br \/>\n        (if (&gt; n m)<br \/>\n          (list O n m (\/ pi 2))                                         ;\u8fd4\u56de\u4e2d\u5fc3\uff0c\u534a\u957f\u8f74\uff0c\u534a\u77ed\u8f74\uff0c\u65cb\u8f6c\u89d2\u5ea690\u5ea6<br \/>\n          (list O m n 0.0)                                              ;\u8fd4\u56de\u4e2d\u5fc3\uff0c\u534a\u957f\u8f74\uff0c\u534a\u77ed\u8f74\uff0c\u65cb\u8f6c\u89d2\u5ea60\u5ea6<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun C:test (\/ pt1 pt2 pt3 pt4 mod res)<br \/>\n  (initget &#8220;C P&#8221;)<br \/>\n  (setq mod (getkword &#8220;nDraw an ellipse by [C3P(C)\/4P(P)] &lt;C&gt;:&#8221;))<br \/>\n  (and (\/= mod &#8220;P&#8221;) (setq mod nil))<\/p>\n<p>  (setq pt1 (getpoint &#8220;nEnter 1st point: &#8220;))<br \/>\n  (setq pt2 (getpoint &#8220;nEnter 2nd point: &#8220;))<br \/>\n  (setq pt3 (getpoint &#8220;nEnter 3rd point: &#8220;))<br \/>\n  (if mod<br \/>\n    (setq pt4 (getpoint &#8220;nEnter 4th point: &#8220;))<br \/>\n    (setq pt4 (getpoint &#8220;nEnter the center: &#8220;))<br \/>\n  )<br \/>\n  (if (and pt4 pt1 pt2 pt3)<br \/>\n    (progn<br \/>\n      (setq pt1 (trans pt1 1 0))<br \/>\n      (setq pt2 (trans pt2 1 0))<br \/>\n      (setq pt3 (trans pt3 1 0))<br \/>\n      (setq pt4 (trans pt4 1 0))<\/p>\n<p>      (mapcar &#8216;ENT:Make_Point (list pt4 pt1 pt2 pt3))<br \/>\n      (if mod<br \/>\n        (setq res (ELL:4P pt4 pt1 pt2 pt3))<br \/>\n        (progn<br \/>\n          ;(MISC:test 10001 &#8216;((ELL:C3p pt4 pt1 pt2 pt3) (ELL:C3P_1 pt4 pt1 pt2 pt3)))<br \/>\n          (setq res (ELL:C3P pt4 pt1 pt2 pt3))<br \/>\n        )<br \/>\n      )<br \/>\n      (if res<br \/>\n        (if (caddr res)<br \/>\n          (apply &#8216;ENT:Make_Ellipse res)<br \/>\n          (apply &#8216;ENT:Make_Circle res)<br \/>\n        )<br \/>\n        (princ &#8220;nInvalid input or can&#8217;t construct the ellipse!&#8221;)<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, the center, 3 points on the curve being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Center_3Points (C D E F \/ G H I J K M P Q R)<br \/>\n  (setq G (GEO:MidPoint E F))<br \/>\n  (setq H (GEO:MidPoint D F))<br \/>\n  (setq I (GEO:MidPoint D E))<br \/>\n  (if (setq J (inters C G D F nil))<br \/>\n    (setq K (inters C I E J nil)<br \/>\n          M (inters H K E F nil)<br \/>\n    )<br \/>\n    (setq K (inters C G D E nil)<br \/>\n          J (inters C H F K nil)<br \/>\n          M (inters I J E F nil)<br \/>\n    )<br \/>\n  )<br \/>\n  (and (null M )(setq M (polar D (angle E F) (distance E F))))<br \/>\n  (setq P (inters C I D M nil))<br \/>\n  (setq Q (inters C H D M nil))<br \/>\n  (if (and P Q (setq R (inters E P F Q nil)))<br \/>\n    (ELL:Center_3Tangents C P Q R)<br \/>\n  )<br \/>\n)<br \/>\n(defun c:aaa ()<br \/>\n  (initget 1)<br \/>\n  (setq C (getpoint &#8220;n\u4e2d\u5fc3: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq D (getpoint &#8220;n\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq E (getpoint &#8220;n\u70b92: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq F (getpoint &#8220;n\u70b93: &#8220;))\u3000\u3000<\/p>\n<p>  (setq C (trans C 1 0))<br \/>\n  (setq D (trans D 1 0))<br \/>\n  (setq E (trans E 1 0))<br \/>\n  (setq F (trans F 1 0))<\/p>\n<p>  (mapcar &#8216;Ent:make_Point (list C D E F))<br \/>\n  (Ent:make_line D E)<br \/>\n  (Ent:make_line D F)<br \/>\n  (Ent:make_line E F)<br \/>\n  ;(setq S (ELL:Center_3Tangents C D E F))<br \/>\n  ;(misc:test 100001 &#8216;((ELL:Center_3Points C D E F) (ELL:C3P C D E F)))<br \/>\n  ;(setq S (ELL:Center_3Points C D E F))<br \/>\n  (setq s (ELL:C3P C D E F))<br \/>\n  (and S (apply &#8216;Ent:Make_Ellipse S))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, the foci and a point on the curve being given.<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Foci_Point (E F P \/ o a b c)<br \/>\n  (setq O (GEO:MidPoint E F))<br \/>\n  (setq c (distance O F))<br \/>\n  (setq a (* 0.5 (+ (distance E P) (distance F P))))<br \/>\n  (setq b (sqrt (* (+ a c) (- a c))))<br \/>\n  (list O a b (angle E F))<br \/>\n)<br \/>\n(defun c:zzz ()<br \/>\n  (initget 1)<br \/>\n  (setq E (getpoint &#8220;n\u7126\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq F (getpoint E &#8220;n\u7126\u70b92: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u4e00\u70b9: &#8220;))<\/p>\n<p>  (setq E (trans E 1 0))<br \/>\n  (setq F (trans F 1 0))<br \/>\n  (setq P (trans P 1 0))<\/p>\n<p>  (mapcar &#8216;Ent:make_Point (list E F P))<br \/>\n  (setq s (ELL:Foci_Point E F P))<br \/>\n  (and S (apply &#8216;Ent:Make_Ellipse S))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse,the foci and a tangent to the curve being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Foci_Tangent (E F P Q \/ G H I)<br \/>\n  (setq I (inters P Q E F nil))<br \/>\n  (if (and I (equal (angle E I) (angle I F) 1e-8))<br \/>\n    nil<br \/>\n    (progn<br \/>\n      (setq G (GEO:Mirror2D E P (angle P Q)))<br \/>\n      (setq H (inters P Q F G nil))<br \/>\n      (ELL:Foci_Point E F H)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:Foci_Tangent()<br \/>\n  (initget 1)<br \/>\n  (setq E (getpoint &#8220;n\u7126\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq F (getpoint E &#8220;n\u7126\u70b92: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u4e00\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq Q (getpoint P &#8220;n\u53e6\u4e00\u70b9: &#8220;))<\/p>\n<p>  (setq E (trans E 1 0))<br \/>\n  (setq F (trans F 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq Q (trans Q 1 0))<\/p>\n<p>  (mapcar &#8216;Ent:make_Point (list E F P Q))<br \/>\n  ;(apply &#8216;Ent:Make_Ellipse (ELL:Foci_Point E F P))<br \/>\n  (setq S (ELL:Foci_Tangent E F P Q))<br \/>\n  (and S (apply &#8216;Ent:Make_Ellipse))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, a focus, a tangent with its point of contact<br \/>\n;;; and second point on the curve being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Focus_Point_Tangent (F P R S \/ G H M J E)<br \/>\n  (if (LINE:IsSameSide F P R S)<br \/>\n    (progn<br \/>\n      (setq G (GEO:Mirror2D F R (angle R S)))<br \/>\n      (setq H (polar G (angle G R) (distance F P)))<br \/>\n      (setq M (GEO:MidPoint H P))<br \/>\n      (setq J (polar M (+ (angle H P) (* pi 0.5)) 1))<br \/>\n      (setq E (inters M J R G nil))<br \/>\n      (if (LINE:IsSameSide E F R S)<br \/>\n        (ELL:Foci_Point E F P)<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:Focus_Point_Tangent ()<br \/>\n  (initget 1)<br \/>\n  (setq F (getpoint &#8220;n\u7126\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq A (getpoint  &#8220;n\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u5207\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq Q (getpoint P &#8220;n\u53e6\u4e00\u70b9: &#8220;))<\/p>\n<p>  (setq F (trans F 1 0))<br \/>\n  (setq A (trans A 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq Q (trans Q 1 0))<\/p>\n<p>  (mapcar &#8216;Ent:make_Point (list F A P Q))<br \/>\n  (Ent:Make_line P Q)<br \/>\n  (setq S (ELL:Focus_Point_Tangent F A P Q))<br \/>\n  (and S (apply &#8216;Ent:Make_Ellipse s))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, a focus, a tangent and two points on the curve<br \/>\n;;; being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Focus_Tangent_2Points (F M N P Q \/ d1 d2 d3 d4 d5 E O S X)<br \/>\n  (if (and (LINE:IsSameSide F P M N) (LINE:IsSameSide F Q M N))<br \/>\n    (progn<br \/>\n      (setq E (GEO:Mirror2D F M (angle M N)))<br \/>\n      (setq d1 (distance F P))<br \/>\n      (setq d2 (distance F Q))<br \/>\n      (if (equal d1 d2 1e-8)<br \/>\n        (setq X (CIR:PPC P Q E d1))<br \/>\n        (if (&gt; d1 d2)<br \/>\n          (setq X (CIR:PCC P Q (- d1 d2) E d1))<br \/>\n          (setq X (CIR:PCC Q P (- d2 d1) E d2))<br \/>\n        )<br \/>\n      )<br \/>\n      (foreach v X<br \/>\n        (setq O  (car v))<br \/>\n        (setq d3 (distance O E))<br \/>\n        (setq d4 (+ d1 (distance O P)))<br \/>\n        (setq d5 (+ d2 (distance O Q)))<br \/>\n        (if (and (equal d3 d4 1e-8) (equal d3 d5 1e-8))<br \/>\n          (setq s (cons (ELL:Foci_Point O F P) s))<br \/>\n        )<br \/>\n      )<br \/>\n      (reverse S)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:Focus_Tangent_2Points ()<br \/>\n  (initget 1)<br \/>\n  (setq F (getpoint &#8220;n\u7126\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq M (getpoint &#8220;n\u5207\u7ebf\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq N (getpoint M &#8220;n\u5207\u7ebf\u70b92: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq Q (getpoint &#8220;n\u70b92: &#8220;))<\/p>\n<p>  (setq F (trans F 1 0))<br \/>\n  (setq M (trans M 1 0))<br \/>\n  (setq N (trans N 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq Q (trans Q 1 0))<\/p>\n<p>  (mapcar &#8216;Ent:make_Point (list F M N P Q))<br \/>\n  (Ent:Make_line M N)<br \/>\n  (setq S (ELL:Focus_Tangent_2Points F M N P Q))<br \/>\n  (foreach el S<br \/>\n    (apply &#8216;Ent:Make_Ellipse el)<br \/>\n  )<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, a focus, a point on the curve and two tangents<br \/>\n;;; being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Focus_Point_2Tangents (F P L1 L2 L3 L4 \/ D1 D2 D3 E G H R s)<br \/>\n  (setq G (GEO:Mirror2D F L1 (angle L1 L2)))<br \/>\n  (setq H (GEO:Mirror2D F L3 (angle L3 L4)))<br \/>\n  (setq S nil)<br \/>\n  (setq R (distance P F))<br \/>\n  (foreach n (CIR:PPC G H P R)<br \/>\n    (setq E (car n))<br \/>\n    (setq d1 (distance E G))<br \/>\n    (setq d2 (distance E H))<br \/>\n    (setq d3 (+ R (distance E P)))<br \/>\n    (if (and (equal d1 d2 1e-6) (equal d2 d3 1e-6))<br \/>\n      (setq s (cons (ELL:Foci_Point E F P) s))<br \/>\n    )<br \/>\n  )<br \/>\n  S<br \/>\n)<\/p>\n<p>(defun c:Focus_Point_2Tangents ()<br \/>\n  (initget 1)<br \/>\n  (setq F (getpoint &#8220;n\u7126\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u70b9: &#8220;))<\/p>\n<p>  (initget 1)<br \/>\n  (setq J (getpoint &#8220;n\u5207\u7ebf\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq K (getpoint J &#8220;n\u5207\u7ebf\u70b92: &#8220;))<\/p>\n<p>  (initget 1)<br \/>\n  (setq M (getpoint &#8220;n\u5207\u7ebf\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq N (getpoint M &#8220;n\u5207\u7ebf\u70b92: &#8220;))<\/p>\n<p>  (setq F (trans F 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq J (trans J 1 0))<br \/>\n  (setq K (trans K 1 0))<br \/>\n  (setq M (trans M 1 0))<br \/>\n  (setq N (trans N 1 0))<\/p>\n<p>  (mapcar &#8216;Ent:make_Point (list F P J K M N))<br \/>\n  (Ent:Make_line M N)<br \/>\n  (Ent:Make_line J K)<br \/>\n  (setq S (ELL:Focus_Point_2Tangents F P J K M N))<br \/>\n  (foreach el S<br \/>\n    (apply &#8216;Ent:Make_Ellipse el)<br \/>\n  )<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, a focus and three tangents being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Focus_3Tangents (F L1 L2 L3 L4 L5 L6 \/ E G H I)<br \/>\n  (setq G (GEO:Mirror2D F L1 (angle L1 L2)))<br \/>\n  (setq H (GEO:Mirror2D F L3 (angle L3 L4)))<br \/>\n  (setq I (GEO:Mirror2D F L5 (angle L5 L6)))<br \/>\n  (if (setq E (car (TRI:CircumCenter G H I)))<br \/>\n    (if (and (LINE:IsSameSide E F L1 L2)<br \/>\n             (LINE:IsSameSide E F L3 L4)<br \/>\n             (LINE:IsSameSide E F L5 L6)<br \/>\n        )<br \/>\n      (ELL:Foci_Point E F (inters E G L1 L2 nil))<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:vvv ()<br \/>\n  (initget 1)<br \/>\n  (setq F (getpoint &#8220;n\u7126\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u5207\u7ebf\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq Q (getpoint P &#8220;n\u5207\u7ebf\u70b92: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq J (getpoint &#8220;n\u5207\u7ebf\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq K (getpoint J &#8220;n\u5207\u7ebf\u70b92: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq M (getpoint &#8220;n\u5207\u7ebf\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq N (getpoint M &#8220;n\u5207\u7ebf\u70b92: &#8220;))<\/p>\n<p>  (setq F (trans F 1 0))<br \/>\n  (setq P (trans P 1 0))<br \/>\n  (setq Q (trans Q 1 0))<br \/>\n  (setq J (trans J 1 0))<br \/>\n  (setq K (trans K 1 0))<br \/>\n  (setq M (trans M 1 0))<br \/>\n  (setq N (trans N 1 0))<\/p>\n<p>  (Ent:make_Point F)<br \/>\n  (Ent:Make_line P Q)<br \/>\n  (Ent:Make_line M N)<br \/>\n  (Ent:Make_line J K)<br \/>\n  (setq S (ELL:Focus_3Tangents F P Q J K M N))<br \/>\n  (and S (apply &#8216;Ent:Make_Ellipse s))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, a focus and three points being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:Focus_3Points (F I J K \/ a1 a2 a3 b1 b2 b3 p1 p2 p3 M N Pt)<br \/>\n  (setq a1 (angle F I))<br \/>\n  (setq A2 (angle F J))<br \/>\n  (setq A3 (angle F K))<br \/>\n  (setq b1 (* 0.5 (+ a1 a2)))<br \/>\n  (setq b2 (* 0.5 (+ a2 a3)))<br \/>\n  (setq b3 (* 0.5 (+ a3 a1)))<br \/>\n  (setq p1 (polar F b1 pi))<br \/>\n  (setq p2 (polar F b2 pi))<br \/>\n  (setq P3 (polar F b3 pi))<br \/>\n  (setq M  (inters I P3 F P1 nil))<br \/>\n  (setq N  (inters K P3 F P2 nil))<br \/>\n  (setq Pt (inters M N I K nil))<br \/>\n  (and (null pt) (setq Pt (polar J (angle I K) Pi)))<br \/>\n  (setq M  (inters Pt J F P1 nil))<br \/>\n  (setq N  (inters Pt J F P2 nil))<br \/>\n  (ELL:Focus_3Tangents F I M Pt J N K)<br \/>\n)<\/p>\n<p>(defun c:Focus_3Points ()<br \/>\n  (initget 1)<br \/>\n  (setq F (getpoint &#8220;n\u7126\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq I (getpoint &#8220;n\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq J (getpoint &#8220;n\u70b92: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq K (getpoint &#8220;n\u70b93: &#8220;))<\/p>\n<p>  (setq F (trans F 1 0))<br \/>\n  (setq I (trans I 1 0))<br \/>\n  (setq J (trans J 1 0))<br \/>\n  (setq K (trans K 1 0))<\/p>\n<p>  (mapcar &#8216;Ent:make_Point (list F I J K))<br \/>\n  (setq S (ELL:Focus_3Points F I J K))<br \/>\n  (and S (apply &#8216;Ent:Make_Ellipse s))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, two tangents with their points of contact and<br \/>\n;;; a third point being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:2Tangents_Point (V Q R P \/ s u w x y m n c)<br \/>\n  (setq S (inters Q P V R nil))<br \/>\n  (setq U (inters V Q R P nil))<br \/>\n  (cond<br \/>\n    ( (and S U)<br \/>\n      (setq W (inters U S Q R nil))<br \/>\n    )<br \/>\n    ( U<br \/>\n      (setq W (polar U (angle V R) 1))<br \/>\n      (setq W (inters U W Q R nil))<br \/>\n    )<br \/>\n    ( S<br \/>\n      (setq W (polar S (angle V Q) 1))<br \/>\n      (setq W (inters S W Q R nil))<br \/>\n    )<br \/>\n    (t<br \/>\n      (setq W (polar P (angle Q R) 1))<br \/>\n    )<br \/>\n  )<br \/>\n  (setq X (inters P W V R nil))<br \/>\n  (setq Y (inters P W V Q nil))<br \/>\n  (setq M (Geo:Midpoint Q R))<br \/>\n  (setq N (Geo:MidPoint P R))<br \/>\n  (setq C (inters V M X N nil))<br \/>\n  (ELL:Center_3Tangents C V X Y)<br \/>\n)<\/p>\n<p>(defun c:vvv ()<br \/>\n  (initget 1)<br \/>\n  (setq V (getpoint &#8220;n\u4ea4\u70b9: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq Q (getpoint V &#8220;n\u5207\u70b91: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq R (getpoint V &#8220;n\u5207\u70b92: &#8220;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u70b9: &#8220;))<\/p>\n<p>  (setq V (trans V 1 0))<br \/>\n  (setq Q (trans Q 1 0))<br \/>\n  (setq R (trans R 1 0))<br \/>\n  (setq P (trans P 1 0))<\/p>\n<p>  (mapcar &#8216;Ent:make_Point (list V Q R P))<br \/>\n  (setq S (ELL:2Tangents_Point V Q R P))<br \/>\n  (and S (apply &#8216;Ent:Make_Ellipse s))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>(defun c:mean (\/ p0 p1 p2 an dd)<br \/>\n  (initget 1)<br \/>\n  (setq p0 (getpoint &#8220;n\u539f\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq p1 (getpoint &#8220;n\u7b2c\u4e00\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq p2 (getpoint &#8220;n\u7b2c\u4e8c\u70b9:&#8221;))<br \/>\n  (setq an (angle p1 p2))<br \/>\n  (setq dd (sqrt (* (distance p0 p1) (distance p0 p2))))<br \/>\n  (ent:make_point (polar p0 an dd))<br \/>\n  (ent:make_point (polar p0 an (- dd)))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>(defun GEO:Mean(p A B)<br \/>\n  (polar P (angle p A) (sqrt (* (distance p A) (distance p B))))<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Function: Two pairs of conjugate points A,B and P,Q (collineation),<br \/>\n;;; being given,to find the center and foci of involution.<br \/>\n;;;=====================================================================<br \/>\n(defun GEO:Cen_Foci (A B P Q  \/ M L an x x1 x2 cen len)<br \/>\n  (setq M (GEO:Midpoint A B))<br \/>\n  (setq L (distance M A))<br \/>\n  (setq an (angle A B))<br \/>\n  (setq x1 (distance M P))<br \/>\n  (setq x2 (distance M Q))<\/p>\n<p>  (if (not (equal (angle P M) an 1e-8)) (setq x1 (- x1)))<br \/>\n  (if (not (equal (angle Q M) an 1e-8)) (setq x2 (- x2)))<br \/>\n  (if (equal (setq x (+ x1 x2)) 0 1e-14)<br \/>\n    (progn<br \/>\n      (setq cen (polar M an 1e600))<br \/>\n      (list cen M (polar M an 2e600))<br \/>\n    )<br \/>\n    (progn<br \/>\n      (setq cen (polar M an (- (\/ (+ (* l l) (* x1 x2)) x))))<br \/>\n      (setq len (sqrt (* (distance cen A) (distance cen B))))<br \/>\n      (list cen (polar cen an len) (polar cen an (- len)))<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:fff ()<br \/>\n  (initget 1)<br \/>\n  (setq A (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e00\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq B (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e8c\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq P (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e09\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq Q (getpoint &#8220;n\u8f93\u5165\u7b2c\u56db\u70b9:&#8221;))<br \/>\n  (mapcar &#8216;ent:make_point (geo:cen_foci a b p q))<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, Construct an ellipse, two tangents and three<br \/>\n;;; points being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:2Tangents_3Points (T1 T2 A B C \/ p1 p2 q1 q2 p q pts x1 x2 res s)<br \/>\n  (setq p1 (car  t1))<br \/>\n  (setq p2 (cadr t1))<br \/>\n  (setq q1 (car  t2))<br \/>\n  (setq q2 (cadr t2))<br \/>\n  (foreach i (list B C)<br \/>\n    (setq P (inters A i P1 P2 nil))<br \/>\n    (setq q (inters A i Q1 Q2 nil))<br \/>\n    (setq pts (cons (cdr (GEO:Cen_Foci A i p q)) pts))<br \/>\n  )<\/p>\n<p>  (foreach p (car pts)<br \/>\n    (foreach q (cadr pts)<br \/>\n      (setq x1 (inters p q p1 p2 nil))<br \/>\n      (setq x2 (inters p q q1 q2 nil))<br \/>\n      (if (and x1 x2)<br \/>\n        (if (setq s (ELL:5PEllipse x1 x2 A B C))<br \/>\n          (setq res (cons s res))<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n  res<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; Construct an ellipse, Construct an ellipse, two tangents and three<br \/>\n;;; points being given<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:3Tangents_2Points (T1 T2 T3 A B \/ p1 p2 q1 q2 r1 r2 p q r M N L U V W X Y res s)<br \/>\n  (setq p1 (car  t1))<br \/>\n  (setq p2 (cadr t1))<br \/>\n  (setq q1 (car  t2))<br \/>\n  (setq q2 (cadr t2))<br \/>\n  (setq R1 (car  t3))<br \/>\n  (setq R2 (cadr t3))<br \/>\n  (setq P  (inters q1 q2 r1 r2 nil))<br \/>\n  (setq Q  (inters r1 r2 p1 p2 nil))<br \/>\n  (setq R  (inters p1 p2 q1 q2 nil))<\/p>\n<p>  (setq M (inters A B R1 R2 nil))<br \/>\n  (setq N (inters A B P1 P2 nil))<br \/>\n  (setq L (inters A B Q1 Q2 nil))<\/p>\n<p>  (foreach D (cdr (GEO:Cen_Foci A B M L))<br \/>\n    (foreach E (cdr (Geo:Cen_FOci A B M N))<br \/>\n      (setq V (Geo:Mean M D E))<br \/>\n      (setq W (inters R V R1 R2 nil))<br \/>\n      (setq X (inters W D Q1 Q2 nil))<br \/>\n      (setq Y (inters W E P1 P2 nil))<br \/>\n      (if (and W X Y)<br \/>\n        ;;(if (setq S (ELL:2Tangents_Point Q W X A))<br \/>\n        (if (setq S (ELL:5PEllipse A B W X Y))<br \/>\n          (setq Res (cons S Res))<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n  (reverse Res)<br \/>\n)<\/p>\n<p>(defun c:tt1()<br \/>\n  (initget 1)<br \/>\n  (setq en1 (car (entsel &#8220;n\u9009\u62e9\u7b2c\u4e00\u6761\u7ebf:&#8221;)))<br \/>\n  (initget 1)<br \/>\n  (setq en2 (car (entsel &#8220;n\u9009\u62e9\u7b2c\u4e8c\u6761\u7ebf:&#8221;)))<br \/>\n  (initget 1)<br \/>\n  (setq A (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e00\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq B (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e8c\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq C (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e09\u70b9:&#8221;))<br \/>\n  (if (and en1 en2 A B C)<br \/>\n    (progn<br \/>\n      (setq dxf1 (entget en1))<br \/>\n      (setq dxf2 (entget en2))<br \/>\n      (setq t1 (list (cdr (assoc 10 dxf1)) (cdr (assoc 11 dxf1))))<br \/>\n      (setq t2 (list (cdr (assoc 10 dxf2)) (cdr (assoc 11 dxf2))))<br \/>\n      (mapcar &#8216;ENT:MAKE_POINT (list A B C))<br \/>\n      (foreach s (ELL:2Tangents_3Points t1 t2 A B C)<br \/>\n        (and s (apply &#8216;ENT:MAKE_ELLIPSE s))<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:tt2()<br \/>\n  (setq en1 (car (entsel &#8220;n\u9009\u62e9\u7b2c\u4e00\u6761\u7ebf:&#8221;)))<br \/>\n  (setq en2 (car (entsel &#8220;n\u9009\u62e9\u7b2c\u4e8c\u6761\u7ebf:&#8221;)))<br \/>\n  (setq en3 (car (entsel &#8220;n\u9009\u62e9\u7b2c\u4e09\u6761\u7ebf:&#8221;)))<br \/>\n  (initget 1)<br \/>\n  (setq A (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e00\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq B (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e8c\u70b9:&#8221;))<br \/>\n  (if (and en1 en2 en3 A B)<br \/>\n    (progn<br \/>\n      (setq dxf1 (entget en1))<br \/>\n      (setq dxf2 (entget en2))<br \/>\n      (setq dxf3 (entget en3))<br \/>\n      (setq t1 (list (cdr (assoc 10 dxf1)) (cdr (assoc 11 dxf1))))<br \/>\n      (setq t2 (list (cdr (assoc 10 dxf2)) (cdr (assoc 11 dxf2))))<br \/>\n      (setq t3 (list (cdr (assoc 10 dxf3)) (cdr (assoc 11 dxf3))))<br \/>\n      (mapcar &#8216;ENT:MAKE_POINT (list A B))<br \/>\n      (foreach s (ELL:3Tangents_2Points t1 t2 t3 A B)<br \/>\n        (and s (apply &#8216;ENT:MAKE_ELLIPSE s))<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;==========================<br \/>\n;;;\u7a0b\u5e8f\u4e3b\u6bb5\uff0c\u53ef\u4ee5\u5355\u72ec\u6210\u4e3a\u51fd\u6570<br \/>\n;;;==========================<br \/>\n(defun Graham-scan (ptlist \/ hullpt maxXpt sortPt P Q)<br \/>\n  (if (&lt; (length ptlist) 4)                                             ;3\u70b9\u4ee5\u4e0b<br \/>\n    ptlist                                                              ;\u662f\u672c\u96c6\u5408<br \/>\n    (progn<br \/>\n      (setq maxXpt (assoc (apply &#8216;max (mapcar &#8216;car ptlist)) ptlist))    ;\u6700\u53f3\u8fb9\u7684\u70b9<br \/>\n      (setq sortPt (sort-by-angle-distance ptlist maxXpt))              ;\u5206\u7c7b\u70b9\u96c6<br \/>\n      (setq hullPt (list (cadr sortPt) maxXpt))                         ;\u5f00\u59cb\u7684\u4e24\u70b9<br \/>\n      (foreach n (cddr sortPt)                                          ;\u4ece\u7b2c3\u70b9\u5f00\u59cb<br \/>\n        (setq hullPt (cons n HullPt))                                   ;\u628aPi\u52a0\u5165\u5230\u51f8\u96c6<br \/>\n        (setq P (cadr hullPt))                                          ;Pi-1<br \/>\n        (setq Q (caddr hullPt))                                         ;Pi-2<br \/>\n        (while (and q (&gt; (det3P n P Q) -1e-6))                          ;\u5982\u679c\u5de6\u8f6c<br \/>\n          (setq hullPt (cons n (cddr hullPt)))                          ;\u5220\u9664Pi-1\u70b9<br \/>\n          (setq P (cadr hullPt))                                        ;\u5f97\u5230\u65b0\u7684Pi-1\u70b9<br \/>\n          (setq Q (caddr hullPt))                                       ;\u5f97\u5230\u65b0\u7684Pi-2\u70b9<br \/>\n        )<br \/>\n      )<br \/>\n      (reverse hullpt)                                                  ;\u8fd4\u56de\u51f8\u96c6<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;\u4ee5\u6700\u4e0b\u9762\u7684\u70b9\u4e3a\u57fa\u70b9\uff0c\u6309\u7167\u89d2\u5ea6\u548c\u8ddd\u79bb\u5206\u7c7b\u70b9\u96c6<br \/>\n(defun sort-by-angle-distance (lst p \/)<br \/>\n  (vl-sort<br \/>\n    lst<br \/>\n    (function<br \/>\n      (lambda (e1 e2 \/ a1 a2)<br \/>\n        (if (equal (setq a1 (angle p e1)) (setq a2 (angle p e2)) 1e-8)<br \/>\n          (&lt; (distance p e1) (distance p e2))<br \/>\n          (&lt; a1 a2)<br \/>\n        )<br \/>\n      )<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;\u5b9a\u4e49\u4e09\u70b9\u7684\u884c\u5217\u5f0f,\u5373\u4e09\u70b9\u4e4b\u500d\u9762\u79ef<br \/>\n(defun det3P (p1 p2 p3 \/)<br \/>\n  (- (* (- (car p2) (car p3)) (- (cadr p2) (cadr p1)))<br \/>\n     (* (- (car p2) (car p1)) (- (cadr p2) (cadr p3)))<br \/>\n  )<br \/>\n)<br \/>\n;;;=====================================================================<br \/>\n;;;\u529f\u80fd: \u8fc7\u4e94\u70b9\u753b\u4e00\u4e2a\u692d\u5706<br \/>\n;;;\u53c2\u6570: \u6ee1\u8db3\u5df2\u77e5\u6761\u4ef6\u7684\u4e94\u70b9<br \/>\n;;;\u8fd4\u56de: \u4e00\u4e2a\u692d\u5706\u5b9e\u4f53<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:5PEllipse (p1 p2 p3 p4 p5 \/ p12 p23 p34 p45 t2 t3 t4 t23 t34 t42 m23 m34 m42 cen lst)<br \/>\n  (setq lst (Graham-scan (list p1 p2 p3 p4 p5)))<br \/>\n  (if (= (length lst) 5)<br \/>\n    (progn<br \/>\n      (setq p1 (car lst))<br \/>\n      (setq p4 (cadr lst))<br \/>\n      (setq p2 (caddr lst))<br \/>\n      (setq p5 (cadddr lst))<br \/>\n      (setq p3 (last lst))<\/p>\n<p>      (setq p12 (inters p5 p1 p2 p3 nil))<br \/>\n      (setq p23 (inters p1 p2 p3 p4 nil))<br \/>\n      (setq p34 (inters p2 p3 p4 p5 nil))<br \/>\n      (setq p45 (inters p3 p4 p5 p1 nil))<\/p>\n<p>      (setq t2 (inters p12 p23 p4 p5 nil))<br \/>\n      (setq t3 (inters p23 p34 p5 p1 nil))<br \/>\n      (setq t4 (inters p34 p45 p1 p2 nil))<\/p>\n<p>      (if (setq t23 (inters t2 p2 t3 p3 nil))<br \/>\n        (if (setq t34 (inters t3 p3 t4 p4 nil))<br \/>\n          (setq m23 (GEO:Midpoint p2 p3)<br \/>\n                m34 (GEO:Midpoint p3 p4)<br \/>\n                cen (inters t23 m23 t34 m34 nil)<br \/>\n          )<br \/>\n          (setq t42 (inters t4 p4 t2 p2 nil)<br \/>\n                m42 (GEO:Midpoint p4 p2)<br \/>\n                m23 (GEO:Midpoint p2 p3)<br \/>\n                cen (inters t23 m23 t42 m42 nil)<br \/>\n          )<br \/>\n        )<br \/>\n        (setq t42 (inters t4 p4 t2 p2 nil)<br \/>\n              t34 (inters t3 p3 t4 p4 nil)<br \/>\n              m34 (GEO:Midpoint p3 p4)<br \/>\n              m42 (GEO:Midpoint p4 p2)<br \/>\n              cen (inters t42 m42 t34 m34 nil)<br \/>\n        )<br \/>\n      )<br \/>\n      (ELL:C3P cen p2 p3 p4)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>(defun c:test5 (\/ p1 p2 p3 p4 p5 ret)<br \/>\n  (initget 1)<br \/>\n  (setq p1 (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e00\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq p2 (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e8c\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq p3 (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e09\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq p4 (getpoint &#8220;n\u8f93\u5165\u7b2c\u56db\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq p5 (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e94\u70b9:&#8221;))<br \/>\n  (setq ret (ELL:5PEllipse p1 p2 p3 p4 p5))<br \/>\n  (and ret (apply &#8216;Ent:Make_Ellipse ret))<br \/>\n  (Ent:Make_Poly (list p1 p2 p3 p4 p5))<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: \u753bSteiner\u692d\u5706(\u4e09\u89d2\u5f62\u5185\u5177\u6709\u6700\u5927\u9762\u79ef\u7684\u5185\u5207\u692d\u5706)<br \/>\n;;; \u8f93\u5165: \u5e73\u9762\u7684\u4e09\u70b9<br \/>\n;;; \u8f93\u51fa: \u5e73\u9762\u7684\u692d\u5706\u7684\u57fa\u672c\u8981\u7d20\u8868<br \/>\n;;; \u53c2\u8003:<br \/>\n;;;   http:\/\/bbs.mjtd.com\/thread-96417-1-1.html<br \/>\n;;;   http:\/\/www.theswamp.org\/index.php?topic=42698.msg480873#msg480873<br \/>\n;;;   http:\/\/en.wikipedia.org\/wiki\/Steiner_inellipse#cite_note-Scimemi-6<br \/>\n;;; \u65e5\u671f: 2012-09-11<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:SteinerEllipse (pt1 pt2 pt3 \/ a b D E F G H M N O P R w)<br \/>\n  (setq w (angle pt2 pt3))<br \/>\n  (setq G (GEO:CENTROID (list pt1 pt2 pt3)))<br \/>\n  (setq H (polar pt2 (+ w (\/ pi 3)) (distance pt2 pt3)))<br \/>\n  (setq O (GEO:CENTROID (list H pt2 pt3)))<br \/>\n  (setq N (GEO:MIDPOINT pt2 pt3))<br \/>\n  (setq R (distance O N))<br \/>\n  (setq M (GEO:MIDPOINT O G))<br \/>\n  (setq P (polar M (+ (angle O G) (\/ pi 2)) (distance O G)))<br \/>\n  (if (setq P (inters pt2 pt3 M P nil))<br \/>\n    (progn<br \/>\n      (setq d (distance P O))<br \/>\n      (setq E (polar P w d))<br \/>\n      (setq F (polar P w (- d)))<br \/>\n      (setq a (* (distance G E) (\/ R (distance O E))))<br \/>\n      (setq b (* (distance G F) (\/ R (distance O F))))<br \/>\n      (list G a b (angle G E))<br \/>\n    )<br \/>\n    (progn<br \/>\n      (setq a R)<br \/>\n      (setq b (distance G N))<br \/>\n      (list G a b w)<br \/>\n    )<br \/>\n  )<br \/>\n)<\/p>\n<p>;;;=====================================================================<br \/>\n;;; \u529f\u80fd: Steiner\u692d\u5706(\u4e09\u89d2\u5f62\u5185\u5177\u6709\u6700\u5927\u9762\u79ef\u7684\u5185\u5207\u692d\u5706)\u7684\u6d4b\u8bd5\u6837\u4f8b<br \/>\n;;; \u8f93\u5165: \u65e0\u3002<br \/>\n;;; \u8f93\u51fa: \u65e0\u3002<br \/>\n;;; \u65e5\u671f: 2012-09-11<br \/>\n;;;=====================================================================<br \/>\n(defun C:Steiner (\/ pt1 pt2 pt3 res ent obj)<br \/>\n  (initget 9)<br \/>\n  (setq pt1 (getpoint &#8220;n1st point:&#8221;))<br \/>\n  (initget 9)<br \/>\n  (setq pt2 (getpoint pt1 &#8220;n2nd point:&#8221;))<br \/>\n  (initget 9)<br \/>\n  (setq pt3 (getpoint pt2 &#8220;n3rd point:&#8221;))<br \/>\n  (setq pt1 (trans pt1 1 0))<br \/>\n  (setq pt2 (trans pt2 1 0))<br \/>\n  (setq pt3 (trans pt3 1 0))<br \/>\n  (mapcar &#8216;ENT:MAKE_LINE (list pt1 pt2 pt3) (list pt2 pt3 pt1))<br \/>\n  (if (setq res (ELL:SteinerEllipse pt1 pt2 pt3))<br \/>\n    (if (setq ent (apply &#8216;ENT:MAKE_ELLIPSE res))<br \/>\n      (progn<br \/>\n        (setq obj (vlax-ename-&gt;vla-object ent))<br \/>\n        (vla-copy obj)<br \/>\n        (vla-scaleentity obj (vlax-3d-point (car res)) 2)<br \/>\n      )<br \/>\n    )<br \/>\n    (princ &#8220;nInvalid input!&#8221;)<br \/>\n  )<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;|<br \/>\n1. \u56db\u70b9\u753b\u6c34\u5e73\u692d\u5706\u3002<br \/>\nhttp:\/\/bbs.mjtd.com\/thread-91856-1-1.html<br \/>\n2. \u5df2\u77e5\u692d\u5706\u7684\u5706\u5fc3\u548c\u692d\u5706\u4e0a\u7684\u4e09\u70b9\u521b\u5efa\u4e00\u4e2a\u692d\u5706\u3002<br \/>\nhttp:\/\/bbs.mjtd.com\/thread-91856-1-1.html<br \/>\n3. \u5df2\u77e5\u692d\u5706\u7684\u56db\u6761\u5207\u7ebf\u521b\u5efa\u4e00\u4e2a\u6c34\u5e73\u692d\u5706\u3002<br \/>\nhttp:\/\/bbs.mjtd.com\/forum.php?mod=viewthread&#038;tid=55068<br \/>\n4. \u8fc7\u4e94\u70b9\u753b\u692d\u5706\uff0c\u6b64\u95ee\u9898\u6ca1lisp\u7a0b\u5e8f\uff0c\u4f46\u6709\u51e0\u4f55\u89e3\u6cd5\uff0c\u53c2\u89c1\uff1a<br \/>\nhttp:\/\/bbs.mjtd.com\/forum.php?mod=viewthread&#038;tid=77145&#038;page=1#pid410208<br \/>\n|;<\/p>\n<p>;|\u516b \u692d\u5706\u62df\u5408\u95ee\u9898\uff1a<br \/>\nhttp:\/\/bbs.mjtd.com\/thread-56692-1-1.html<br \/>\n\u4e0b\u9762\u7684\u5e16\u5b50\u662f\u7528\u5706\u5f27\u62df\u5408\u692d\u5706\u7684\u8ba8\u8bba\uff1a<br \/>\nhttp:\/\/bbs.mjtd.com\/thread-86496-3-1.html<br \/>\n|;<\/p>\n<p>;|\u5341\u4e00 \u6700\u4f3c\u5706\u692d\u5706\u95ee\u9898<br \/>\nhttp:\/\/bbs.mjtd.com\/thread-62903-1-1.html<br \/>\n|;<\/p>\n<p>;;;=====================================================================<br \/>\n;;;\u8fc7\u56db\u70b9\u7684\u6700\u63a5\u8fd1\u5706\u7684\u692d\u5706<br \/>\n;;;=====================================================================<br \/>\n(defun Ell:NearToCircleEllipse (Pa Pb Pc Pd \/ CCC InC Pd1 Pe Pe1)<br \/>\n  (setq CCC (Tri:CircumCenter Pa Pb Pc))<br \/>\n  (setq InC (Tri:InCenter Pa Pb Pc))<br \/>\n  (setq Pd1 (Tri:Isogonal-Conjugate-Point-1 Pd Pa Pb InC))<br \/>\n  (setq Pe  (polar Pd1 (+ (angle Pd1 CCC) (\/ pi 2)) 1))<br \/>\n  (setq Pe1 (Tri:Isogonal-Conjugate-Point-1 Pe Pa Pb InC))<br \/>\n  (ELL:5PEllipse pa pb pc pd pe1)<br \/>\n)<\/p>\n<p>;semiminor axis  semimajor axis<br \/>\n;;;\u6d4b\u8bd5\u7a0b\u5e8f<br \/>\n(defun c:test7 (\/ pa pb pc pd ret)<br \/>\n  (initget 1)<br \/>\n  (setq pa (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e00\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq pb (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e8c\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq pc (getpoint &#8220;n\u8f93\u5165\u7b2c\u4e09\u70b9:&#8221;))<br \/>\n  (initget 1)<br \/>\n  (setq pd (getpoint &#8220;n\u8f93\u5165\u6620\u5c04\u70b9:&#8221;))<\/p>\n<p>  (Ent:Make_Poly (list pa pb pc pd))<br \/>\n  (setq ret (Ell:NearToCircleEllipse Pd pa pb pc))<br \/>\n  (and ret (apply &#8216;Ent:Make_Ellipse ret))<br \/>\n  ;;(setq InC (Tri:InCenter pa pb pc))<br \/>\n  ;;(setq CCC (Tri:CircumCenter pa pb pc))<br \/>\n  ;;(setq Pd1 (Tri:Isogonal-Conjugate-Point Pd Pa Pb Pc))<br \/>\n  ;;(mapcar &#8216;Ent:Make_Point (list pa pb pc pd Inc CCC Pd1))<\/p>\n<p>  (princ)<br \/>\n)<\/p>\n<p>;|\u5341\u4e8c \u692d\u5706JIG \u6559\u7a0b<br \/>\n;;;http:\/\/bbs.mjtd.com\/forum.php?mod=viewthread&amp;tid=66579<br \/>\n|;<\/p>\n<p>;|\u5341\u4e09 \u692d\u5706\u7684UCS\u6295\u5f71<br \/>\nhttp:\/\/bbs.mjtd.com\/forum.php?mod=viewthread&#038;tid=84527<br \/>\nhttp:\/\/www.theswamp.org\/index.php?topic=43031.0<br \/>\n|;<\/p>\n<p>;;;=====================================================================<br \/>\n;;;\u628a\u4ee5\u524d\u7528\u591a\u6bb5\u7ebf\u753b\u7684\u692d\u5706\u6539\u6210\u771f\u5b9e\u7684\u692d\u5706\u3002<br \/>\n;;;=====================================================================<br \/>\n(defun ELL:GetEllipseFromPoly (poly \/ pts pt0 pt1 pt2 pt3 cen a b rat maj)<br \/>\n  (defun Get-3dpoly-Coordinates (poly \/ v e l)<br \/>\n    (setq v (entnext poly))<br \/>\n    (while (\/= (cdr (assoc 0 (setq e (entget v)))) &#8220;SEQEND&#8221;)<br \/>\n      (setq l (cons (cdr (assoc 10 e)) l)<br \/>\n            v (entnext v)<br \/>\n      )<br \/>\n    )<br \/>\n    (reverse l)<br \/>\n  )<br \/>\n  (setq pts (Get-3dpoly-Coordinates poly))<br \/>\n  (setq pt0 (car pts))<br \/>\n  (setq pt1 (nth 4 pts))<br \/>\n  (setq pt2 (nth 8 pts))<br \/>\n  (setq pt3 (nth 12 pts))<br \/>\n  (setq cen (mapcar &#8216;* (mapcar &#8216;+ pt0 pt2) &#8216;(0.5 0.5 0.5)))<br \/>\n  (setq a   (distance cen pt0))<br \/>\n  (setq b   (distance cen pt1))<br \/>\n  (setq rat (\/ b a))<br \/>\n  (setq maj (mapcar &#8216;- pt0 cen))<br \/>\n  (list cen maj rat)<br \/>\n)<br \/>\n;;;\u6d4b\u8bd5\u7a0b\u5e8f<br \/>\n(defun c:test6(\/ pl ret)<br \/>\n  (setq pl  (car (entsel)))<br \/>\n  (setq ret (ELL:GetEllipseFromPoly pl))<br \/>\n  (entmakeX<br \/>\n    (list<br \/>\n      &#8216;(0 . &#8220;ELLIPSE&#8221;)<br \/>\n      &#8216;(100 . &#8220;AcDbEntity&#8221;)<br \/>\n      &#8216;(100 . &#8220;AcDbEllipse&#8221;)<br \/>\n      (cons 10 (car ret))<br \/>\n      (cons 11 (cadr ret))<br \/>\n      (cons 40 (caddr ret))<br \/>\n    )<br \/>\n  )<br \/>\n  (princ)<br \/>\n)<\/p>\n<p>;;;=====================================================<br \/>\n;;; Romberg Integration<br \/>\n;;; \u9f99\u8d1d\u683c\u79ef\u5206\u6cd5<br \/>\n;;;=====================================================<br \/>\n(defun Math:Romberg (a b eps \/ EP H I K M N P Q S X Y Y0)<br \/>\n  (setq h (- b a))<br \/>\n  (setq y nil)<br \/>\n  (setq i 0)<br \/>\n  (repeat 20<br \/>\n    (setq y (cons (cons i 0.0) y))<br \/>\n    (setq i (1+ i))<br \/>\n  )<br \/>\n  (setq y (reverse y))<br \/>\n  (setq y0 (* h (+ (func a) (func b)) 0.5))<br \/>\n  (setq y (cons (cons 0 y0) (cdr y)))<br \/>\n  (setq m  1<br \/>\n        n  1<br \/>\n        ep (1+ eps)<br \/>\n  )<br \/>\n  (while (and (&gt;= ep eps) (&lt;= m 19))<br \/>\n    (setq p 0.0)<br \/>\n    (setq i 0)<br \/>\n    (repeat n<br \/>\n      (setq x (+ a (* (+ i 0.5) h)))<br \/>\n      (setq p (+ p (func x)))<br \/>\n      (setq i (1+ i))<br \/>\n    )<br \/>\n    (setq p (\/ (+ (cdar y) (* h p)) 2.0))<br \/>\n    (setq s 1.0)<br \/>\n    (setq k 1)<br \/>\n    (repeat m<br \/>\n      (setq s (+ s s s s))<br \/>\n      (setq q (\/ (- (* s p) (cdr (assoc (1- k) y))) (1- s)))<br \/>\n      (setq y (subst (cons (1- k) p) (assoc (1- k) y) y))<br \/>\n      (setq p q)<br \/>\n      (setq k (1+ k))<br \/>\n    )<br \/>\n    (setq ep (abs (- q (cdr (assoc (1- m) y)))))<br \/>\n    (setq m (1+ m))<br \/>\n    (setq y (subst (cons (1- m) q) (assoc (1- m) y) y))<br \/>\n    (setq n (+ n n))<br \/>\n    (setq h (\/ h 2.0))<br \/>\n  )<br \/>\n  q<br \/>\n)<br \/>\n[\/codesyntax]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5bf9\u692d\u5706\u7684\u7814\u7a76\u3002\u5176\u4e2d\u6709\u5927\u91cf\u7684\u4f7f\u7528\u51fd\u6570\uff1a \u5305\u62ec\u692d\u5706\u7684\u5c55\u5f00\uff0c\u692d\u5706\u7684\u76f8\u4ea4\uff0c\u692d\u5706\u7684\u4f5c\u56fe\uff0c\u692d\u5706\u7684\u9762\u79ef\uff0c\u5468\u957f\u7b97\u6cd5\u4ee5\u53ca\u4e0e\u692d\u5706\u76f8<\/p>\n<p class=\"more-link\"><a href=\"https:\/\/www.highflybird.com\/blog\/?p=1299\" class=\"themebutton2\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[9],"tags":[29],"class_list":["post-1299","post","type-post","status-publish","format-standard","hentry","category-programming","tag-29"],"_links":{"self":[{"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1299"}],"version-history":[{"count":0,"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1299\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1299"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1299"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.highflybird.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}