曲线的转弯半径和曲率
在下面的这个帖子中讨论了椭圆的曲率和转弯半径http://bbs.mjtd.com/thread-62980-1-1.html
现在我把这个主题深化一下,讨论一下曲线的两个函数:
vlax-curve-getSecondDeriv
vlax-curve-getFirstDeriv
这两个函数是什么意思呢?
我们考察AutoCAD里面的曲线类,主要是圆,椭圆,弧和样条曲线,多段线由这几种组合而成。
椭圆和样条曲线实际上都是由参数形成,因此,对于这类曲线,它们每点的坐标可以由参数方程表达:
譬如椭圆x=a*cos(t); y=b*sin(t);
样条曲线也有方程,假设样条曲线的参数方程为:X= f(t);
Y=g(t);
因此可以对参数方程求导,得到每一点的切线矢量,曲线上每一点对应于一个参数 t0 ,
这个切线矢量的 的X值就是 f(t)在t0处的一阶导数,Y值就是g(t)在t0处的一阶导数,
即( f'(t0), g'(t0),0)
因而我们就理解了vlax-curve-getFirstDeriv 函数返回值的意义,
对于vlax-curve-getSecondDeriv的意义类似,只不过这次换成了二阶导数。
即( f''(t0), g''(t0),0)
那么如何求样条曲线或者椭圆的每一点的曲率及其半径呢?
根据参数方程的求曲率公式:
我们可以得到相应的LISP代码:
;;;=============================================================
;;; 一般平面曲线参数方程的曲率离心公式
;;; 功能: 获取曲线上一点处的离心半径和离心圆圆心
;;; 参数: 曲线实体和曲线上的一点
;;; 返回: 此处离心圆圆心、离心半径
;;;=============================================================
(defun CUR:GetCurvature (en pt / ob px v1 v2 v3 x1 y1 x2 y2 cen rad d1 d2)
(setq ob (vlax-ename->vla-object en))
(setq pt (vlax-curve-getclosestpointto en pt)) ;保证此点在曲线上
(setq px (vlax-curve-getParamAtPoint en pt)) ;此点的曲线参数
(setq v1 (vlax-curve-getFirstDeriv en px)) ;此点的一阶矢量
(setq v2 (vlax-curve-getSecondDeriv en px)) ;此点的二阶矢量
(setq v3 (list (- (cadr v1)) (car v1) (caddr v1))) ;此点的切线矢量
(setq x1 (carv1)) ;一阶导数的 X值
(setq y1 (cadr v1)) ;一阶导数的 Y值
(setq x2 (carv2)) ;二阶导数的 X值
(setq y2 (cadr v2)) ;二阶导数的 Y值
(setq d1 (expt (+ (* y1 y1) (* x1 x1)) 1.5))
(setq d2 (- (* x1 y2) (* x2 y1))) ;转弯内外的判定
(if (/= d2 0) ;如果不为直线段
(progn
(setq rad (/ d1 d2))
(if (vlax-method-applicable-p ob 'GetBulge) ;如果为多段线(含圆弧)
(if (< (vla-GetBulge ob (fix px)) 0) ;如果此段凸度小于0
(setq rad (- rad))
)
)
(list (polar pt (angle '(0 0 0) v3) rad) (abs rad)) ;圆心及半径
)
)
)
本帖最后由 highflybird 于 2017-8-14 17:08 编辑
另外附上几个测试程序和一个动态演示:
完整代码请见附件:
椭圆的离心率的轨迹线:
vlax-curve-系列的函数如此牛,可惜autodesk不对vba开放这些函数 AutoCAD2010 win732位加载后选择曲线一点但却不能计算出结果 谢谢大师分享!!! 谢谢大师的分享,谢谢 谢谢分享! 仰视高讲堂 大师出品,默默收藏 哇,飞鸟版主好久不见啊 重出江湖,笨鸟不再 非常感谢大师分享程序!