明经CAD社区

?找回密码
?注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 7025|回复: 34
打印 上一365体育投注手机客户端下载_365体育投注滚球_bt365-体育投注 下一365体育投注手机客户端下载_365体育投注滚球_bt365-体育投注

[【高飞鸟】] 曲线的转弯半径和曲率

? ? [复制链接]
跳转到指定楼层
楼主
发表于 2017-8-14 15:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在下面的这个帖子中讨论了椭圆的曲率和转弯半径
http://bbs.mjtd.com/thread-62980-1-1.html
现在我把这个365体育投注手机客户端下载_365体育投注滚球_bt365-体育投注深化一下,讨论一下曲线的两个函数:
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代码:
  1. ;;;=============================================================
  2. ;;; 一般平面曲线参数方程的曲率离心公式? ?? ?? ?? ?? ?? ?? ?? ???
  3. ;;; 功能: 获取曲线上一点处的离心半径和离心圆圆心? ?? ?? ?? ?? ?
  4. ;;; 参数: 曲线实体和曲线上的一点? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
  5. ;;; 返回: 此处离心圆圆心、离心半径? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
  6. ;;;=============================================================
  7. (defun CUR:GetCurvature (en pt / ob px v1 v2 v3 x1 y1 x2 y2 cen rad d1 d2)
  8. ??(setq ob (vlax-ename->vla-object en))
  9. ??(setq pt (vlax-curve-getclosestpointto en pt))? ?? ?? ?? ?? ? ;保证此点在曲线上
  10. ??(setq px (vlax-curve-getParamAtPoint en pt))? ?? ?? ?? ?? ?? ?;此点的曲线参数
  11. ??(setq v1 (vlax-curve-getFirstDeriv en px))? ?? ?? ?? ?? ?? ???;此点的一阶矢量
  12. ??(setq v2 (vlax-curve-getSecondDeriv en px))? ? ? ? ? ? ? ? ? ? ? ? ;此点的二阶矢量
  13. ??(setq v3 (list (- (cadr v1)) (car v1) (caddr v1)))? ?? ?? ?? ?;此点的切线矢量
  14. ??(setq x1 (car??v1))? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? ;一阶导数的 X值
  15. ??(setq y1 (cadr v1))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;一阶导数的 Y值
  16. ??(setq x2 (car??v2))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;二阶导数的 X值
  17. ??(setq y2 (cadr v2))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;二阶导数的 Y值
  18. ??(setq d1 (expt (+ (* y1 y1) (* x1 x1)) 1.5))? ?? ?? ???
  19. ??(setq d2 (- (* x1 y2) (* x2 y1)))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;转弯内外的判定
  20. ??(if (/= d2 0)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? ;如果不为直线段
  21. ? ? (progn
  22. ? ?? ?(setq rad (/ d1 d2))
  23. ? ?? ?(if (vlax-method-applicable-p ob 'GetBulge)? ?? ?? ?? ?? ?;如果为多段线(含圆弧)
  24. ? ? ? ? (if (< (vla-GetBulge ob (fix px)) 0)? ? ? ? ? ? ? ? ? ? ? ? ;如果此段凸度小于0
  25. ? ? ? ?? ?(setq rad (- rad))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  26. ? ?? ???)
  27. ? ?? ?)
  28. ? ?? ?(list (polar pt (angle '(0 0 0) v3) rad) (abs rad))? ? ? ? ;圆心及半径
  29. ? ? )
  30. ??)
  31. )


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 2明经币 +2 收起 理由
头大无恼 + 1 赞一个!
springwillow + 1 经典讲解

查看全部评分

本帖被以下淘专辑推荐:

沙发
?楼主| 发表于 2017-8-14 15:49 | 只看该作者
本帖最后由 highflybird 于 2017-8-14 17:08 编辑

另外附上几个测试程序和一个动态演示:
完整代码请见附件:


椭圆的离心率的轨迹线:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
板凳
发表于 2017-8-14 16:36 | 只看该作者
谢谢大师分享!!!
地板
发表于 2017-8-14 16:43 | 只看该作者
谢谢大师的分享,谢谢
6#
发表于 2017-8-14 18:55 | 只看该作者
仰视高讲堂
7#
发表于 2017-8-14 21:15 | 只看该作者
大师出品,默默收藏
8#
发表于 2017-8-14 21:58 | 只看该作者
哇,飞鸟版主好久不见啊
9#
发表于 2017-8-14 22:20 来自手机 | 只看该作者
重出江湖,笨鸟不再
10#
发表于 2017-8-15 08:26 | 只看该作者
非常感谢大师分享程序!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )???
?2000-2017 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2019-10-30 19:29 , Processed in 0.284469 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.3

? 2001-2013 Comsenz Inc.

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