椭圆论
highflybird
- 登录 发表评论
对椭圆的研究。其中有大量的使用函数:
包括椭圆的展开,椭圆的相交,椭圆的作图,椭圆的面积,周长算法以及与椭圆相关的方程等较为高级知识。
下面是代码:
|一 椭圆的几个基本参数:
DXF 组码中的几个数值
10 椭圆中心
11 长轴矢量
40 长短比率
41 起点角度
42 终点角度
210 法线矢量
这些参数可以由entget得到,也可以由activeX方法得到。
注: 起点角度和终点角度的计算,如果是不是椭圆弧,是全椭圆,则这个数值为:
O 和2Pi,如果是椭圆弧,则如图1;
需要注意的是vla-get-StartAngle 和 vla-get-StartParameter 在一般情况
下,是两个不同数值,它们所代表的角度的意义如上图。同样去理解:
vla-get-EngAngle 和 vla-get-EndParameter. 但是:
vla-get-StartParameter = vlax-curve-getStartParam
vla-get-EndParameter = vlax-curve-getEndParam
vlax-curve-getParamAtPoint 其参数可按照上述方式去理解。|;
;;;=====================================================================
;;; 功能: 画一个椭圆
;;; 输入: 中心,长轴,短轴和旋转角度
;;; 输出: 成功返回椭圆的图元名,否则返回nil
;;;=====================================================================
(defun Ent:Make_Ellipse (cen a b ang / maj rat)
(if (> b a)
(setq maj (polar '(0 0 0) (+ ang (* pi 0.5)) b)
rat (/ a (float b))
)
(setq maj (polar '(0 0 0) ang a)
rat (/ b (float a))
)
)
(entmakeX
(list
'(0 . "ELLIPSE")
'(100 . "AcDbEntity")
'(100 . "AcDbEllipse")
(cons 10 cen)
(cons 11 maj)
(cons 40 rat)
)
)
)
(defun Ent:Make_Ellipse_1 (cen maj rat)
(entmakeX
(list
'(0 . "ELLIPSE")
'(100 . "AcDbEntity")
'(100 . "AcDbEllipse")
(cons 10 cen)
(cons 11 maj)
(cons 40 rat)
)
)
)
;;;=====================================================================
;;; 功能: 画一个空三维空间的椭圆
;;; 输入: 中心,长轴,短轴、旋转角度和法线矢量
;;; 输出: 成功返回椭圆的图元名,否则返回nil
;;;=====================================================================
(defun Ent:Make_Ellipse_3d (cen a b ang an1 an2 Normal / maj rat)
(if (> b a)
(setq maj (polar '(0 0 0) (+ ang (* pi 0.5)) b)
rat (/ a b 1.0)
)
(setq maj (polar '(0 0 0) ang a)
rat (/ b a 1.0)
)
)
(setq Normal (mat:unit Normal))
(setq maj (trans maj Normal 0 T))
(entmakeX
(list
'(0 . "ELLIPSE")
'(100 . "AcDbEntity")
'(100 . "AcDbEllipse")
(cons 10 cen)
(cons 11 maj)
(cons 40 rat)
(cons 41 an1)
(cons 42 an2)
(cons 210 Normal)
)
)
)
;;;=====================================================================
;;; 功能: 画一个椭圆弧
;;; 输入: 中心,长轴,短轴和旋转角度,起始角度,终点角度
;;; 输出: 成功返回椭圆弧的图元名,否则返回nil
;;;=====================================================================
(defun Ent:Make_EllipseArc (cen a b ang an1 an2 / maj rat)
(if (> b a)
(setq maj (polar '(0 0 0) (+ ang (* pi 0.5)) b)
rat (/ a b 1.0)
)
(setq maj (polar '(0 0 0) ang a)
rat (/ b a 1.0)
)
)
(entmakeX
(list
'(0 . "ELLIPSE")
'(100 . "AcDbEntity")
'(100 . "AcDbEllipse")
(cons 10 cen)
(cons 11 maj)
(cons 40 rat)
(cons 41 an1)
(cons 42 an2)
)
)
)
;;;=====================================================================
;;; 功能: 从某一点获取椭圆的参数(纯数学法)
;;; 输入: 椭圆上的一点和构成椭圆的参数:中心,半长轴,半短轴和旋转角
;;; 输出: 此点的参数值
;;;=====================================================================
(defun ELL:GetParam (pt Cen a b ang / x y p)
(setq p (mapcar '- pt cen))
(setq x (car p))
(setq y (cadr p))
(atan
(* a (- (* y (cos ang))(* x (sin ang))))
(* b (+ (* x (cos ang))(* y (sin ang))))
)
)
;;;=====================================================================
;;; 功能: 更新平面椭圆
;;; 输入: 要更新的实体名,更新后的中心,半长轴,半短轴和旋转角
;;; 输出: 成功返回该实体名,否则返回nil
;;;=====================================================================
(defun ELL:Update (ent cen a b ang / D C X R m n an)
(if (> b a)
(setq m b n a an (+ ang (/ pi 2)))
(setq m a n b an ang)
)
(setq D (entget ent))
(setq C (cons 10 cen))
(setq X (cons 11 (polar '(0. 0. 0.) an m)))
(setq R (cons 40 (/ n m 1.0)))
(setq D (subst C (assoc 10 D) D))
(setq D (subst X (assoc 11 D) D))
(setq D (subst R (assoc 40 D) D))
(entmod D)
(entupd ent)
)