找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 332|回复: 0

曲线的转弯半径和曲率 - AutoLISP/Visual LISP 编程技术 - AutoCAD论坛 -

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-1-27 07:54:10 | 显示全部楼层 |阅读模式
在下面的这个帖子中讨论了椭圆的曲率和转弯半径
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 (car  v1))                                           ;一阶导数的 X值
  •   (setq y1 (cadr v1))                                                ;一阶导数的 Y值
  •   (setq x2 (car  v2))                                                ;二阶导数的 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))        ;圆心及半径
  •     )
  •   )
  • )


;;;============================================================= ;;; 一般平面曲线参数方程的曲率离心公式                           ;;; 功能: 获取曲线上一点处的离心半径和离心圆圆心                 ;;; 参数: 曲线实体和曲线上的一点                                 ;;; 返回: 此处离心圆圆心、离心半径                               ;;;============================================================= (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 (car  v1))                                           ;一阶导数的 X值   (setq y1 (cadr v1))                                                ;一阶导数的 Y值   (setq x2 (car  v2))                                                ;二阶导数的 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))        ;圆心及半径     )   ) )  
来源:http://bbs.mjtd.com/forum.php?mod=viewthread&tid=175285&extra=page%3D1%26filter%3Dtypeid%26typeid%3D108
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 02:18 , Processed in 0.148607 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表