跳转到主要内容

椭圆论

主标签

对椭圆的研究。其中有大量的使用函数:
包括椭圆的展开,椭圆的相交,椭圆的作图,椭圆的面积,周长算法以及与椭圆相关的方程等较为高级知识。
下面是代码:

|一 椭圆的几个基本参数:
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)
)

分类