找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2687|回复: 38

[飞鸟集] 曲线的转弯半径和曲率

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2017-8-11 20:58:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 Highflybird 于 2017-8-11 21:17 编辑

在下面的这个帖子中讨论了椭圆的曲率和转弯半径
http://bbs.xdcad.net/thread-667933-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处的一阶导数,因而我们就理解了
vlax-curve-getFirstDeriv 函数返回值的意义,
对于vlax-curve-getSecondDeriv的意义类似,只不过这次换成了二阶导数。

那么如何求样条曲线或者椭圆的每一点的曲率及其半径呢?
根据参数方程的求曲率公式:
曲率1.jpg
我们可以得到相应的LISP代码:
  1. ;;;=============================================================
  2. ;;; 一般平面曲线参数方程的曲率离心公式                          
  3. ;;; 功能: 获取曲线上一点处的离心半径和离心圆圆心               
  4. ;;; 参数: 曲线实体和曲线上的一点                                
  5. ;;; 返回: 此处离心圆圆心、离心半径                              
  6. ;;;=============================================================
  7. (defun CUR:GetCurvature (en pt / px v1 v2 v3 x1 y1 x2 y2 cen rad d1 d2)
  8.   (setq pt (vlax-curve-getclosestpointto en pt))                ;保证此点在曲线上
  9.   (setq px (vlax-curve-getParamAtPoint en pt))                  ;此点的曲线参数
  10.   (setq v1 (vlax-curve-getFirstDeriv en px))                    ;此点的一阶矢量
  11.   (setq v2 (vlax-curve-getSecondDeriv en px))                        ;此点的二阶矢量
  12.   (setq v3 (list (- (cadr v1)) (car v1) (caddr v1)))            ;此点的切线矢量
  13.   (setq x1 (car  v1))                                           ;一阶导数的 X值
  14.   (setq y1 (cadr v1))                                                ;一阶导数的 Y值
  15.   (setq x2 (car  v2))                                                ;二阶导数的 X值
  16.   (setq y2 (cadr v2))                                                ;二阶导数的 Y值
  17.   (setq d1 (expt (+ (* y1 y1) (* x1 x1)) 1.5))           
  18.   (setq d2 (- (* x1 y2) (* x2 y1)))                                ;转弯内外的判定
  19.   (if (/= d2 0)                                                 ;如果不为直线段
  20.     (progn
  21.       (setq rad (/ d1 d2))
  22.       (list (polar pt (angle '(0 0 0) v3) rad) (abs rad))        ;圆心及半径
  23.     )
  24.   )
  25. )

关于椭圆可以用如下代码:
  1. ;;;=============================================================
  2. ;;;功能: 获取椭圆上一点处的曲率和离心半径(适用于单次利用此法)
  3. ;;;参数: 椭圆实体和椭圆上的一点                                 
  4. ;;;返回: 此处离心圆圆心、离心半径及其曲率(离心率)            
  5. ;;;说明: 如果要在CAD中几何作图,可以参考此贴:                  
  6. ;;;      http://bbs.mjtd.com/thread-62980-1-1.html              
  7. ;;;=============================================================
  8. (defun ELL:GetCurvature (en pt / obj a b px x y v1 v2 rad cen)
  9.   (setq obj (vlax-ename->vla-object en))
  10.   (setq a   (vla-get-MajorRadius obj))                          ;椭圆的半长轴
  11.   (setq b   (vla-get-MinorRadius obj))                                ;椭圆的半短轴
  12.   (setq pt  (vlax-curve-getclosestpointto en pt))                ;保证此点在椭圆上
  13.   (setq px  (vlax-curve-getParamAtPoint en pt))                        ;此点的椭圆参数
  14.   (setq v1  (vlax-curve-getFirstDeriv en px))                        ;此点的一阶矢量
  15.   (setq v2  (list (- (cadr v1)) (car v1) (caddr v1)))                ;此点的切线矢量
  16.   (setq x   (* a (sin px)))
  17.   (setq y   (* b (cos px)))
  18.   (setq rad (/ (expt (+ (* x x) (* y y)) 1.5) (* a b)))                ;得到转弯半径
  19.   (setq cen (polar pt (angle '(0 0 0) v2) rad))                        ;圆心
  20.   (list cen rad)                                                ;圆心及半径
  21. )

  22. ;;;=============================================================
  23. ;;; 利用参数方程的求椭圆的曲率及其离心半径(适用于多次利用此法)
  24. ;;; 功能: 获取椭圆上一点处的转弯半径和离心圆圆心               
  25. ;;; 参数: 椭圆实体和曲线上的一点                                
  26. ;;; 返回: 此处离心圆圆心、离心半径                              
  27. ;;;=============================================================
  28. (defun ELL:GetCurvature1 (en a b pt / px v1 v2 x y rad cen)
  29.   (setq pt  (vlax-curve-getclosestpointto en pt))                ;保证此点在椭圆上
  30.   (setq px  (vlax-curve-getParamAtPoint en pt))                        ;此点的椭圆参数
  31.   (setq v1  (vlax-curve-getFirstDeriv en px))                        ;此点的一阶矢量
  32.   (setq v2  (list (- (cadr v1)) (car v1) (caddr v1)))                ;此点的切线矢量
  33.   (setq x   (* a (sin px)))
  34.   (setq y   (* b (cos px)))
  35.   (setq rad (/ (expt (+ (* x x) (* y y)) 1.5) (* a b)))                ;得到转弯半径
  36.   (setq cen (polar pt (angle '(0 0 0) v2) rad))                        ;圆心
  37.   (list cen rad)                                                ;圆心及半径
  38. );;;=============================================================
  39. ;;;功能: 获取椭圆上一点处的曲率和离心半径(适用于单次利用此法)
  40. ;;;参数: 椭圆实体和椭圆上的一点                                 
  41. ;;;返回: 此处离心圆圆心、离心半径及其曲率(离心率)            
  42. ;;;说明: 如果要在CAD中几何作图,可以参考此贴:                  
  43. ;;;      http://bbs.mjtd.com/thread-62980-1-1.html              
  44. ;;;=============================================================
  45. (defun ELL:GetCurvature (en pt / obj a b px x y v1 v2 rad cen)
  46.   (setq obj (vlax-ename->vla-object en))
  47.   (setq a   (vla-get-MajorRadius obj))                          ;椭圆的半长轴
  48.   (setq b   (vla-get-MinorRadius obj))                                ;椭圆的半短轴
  49.   (setq pt  (vlax-curve-getclosestpointto en pt))                ;保证此点在椭圆上
  50.   (setq px  (vlax-curve-getParamAtPoint en pt))                        ;此点的椭圆参数
  51.   (setq v1  (vlax-curve-getFirstDeriv en px))                        ;此点的一阶矢量
  52.   (setq v2  (list (- (cadr v1)) (car v1) (caddr v1)))                ;此点的切线矢量
  53.   (setq x   (* a (sin px)))
  54.   (setq y   (* b (cos px)))
  55.   (setq rad (/ (expt (+ (* x x) (* y y)) 1.5) (* a b)))                ;得到转弯半径
  56.   (setq cen (polar pt (angle '(0 0 0) v2) rad))                        ;圆心
  57.   (list cen rad)                                                ;圆心及半径
  58. )

  59. ;;;=============================================================
  60. ;;; 利用参数方程的求椭圆的曲率及其离心半径(适用于多次利用此法)
  61. ;;; 功能: 获取椭圆上一点处的转弯半径和离心圆圆心               
  62. ;;; 参数: 椭圆实体和曲线上的一点                                
  63. ;;; 返回: 此处离心圆圆心、离心半径                              
  64. ;;;=============================================================
  65. (defun ELL:GetCurvature1 (en a b pt / px v1 v2 x y rad cen)
  66.   (setq pt  (vlax-curve-getclosestpointto en pt))                ;保证此点在椭圆上
  67.   (setq px  (vlax-curve-getParamAtPoint en pt))                        ;此点的椭圆参数
  68.   (setq v1  (vlax-curve-getFirstDeriv en px))                        ;此点的一阶矢量
  69.   (setq v2  (list (- (cadr v1)) (car v1) (caddr v1)))                ;此点的切线矢量
  70.   (setq x   (* a (sin px)))
  71.   (setq y   (* b (cos px)))
  72.   (setq rad (/ (expt (+ (* x x) (* y y)) 1.5) (* a b)))                ;得到转弯半径
  73.   (setq cen (polar pt (angle '(0 0 0) v2) rad))                        ;圆心
  74.   (list cen rad)                                                ;圆心及半径
  75. )


附上几个测试程序:
完整代码请见附件:
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:椭圆的曲率.LSP 
下载次数:21  文件大小:9.66 KB 
下载权限: 不限 以上  [免费赚D豆]


  1. ;;;=============================================================
  2. ;;;测试程序1: 获取曲线一点处的曲率和离心半径                    
  3. ;;;=============================================================
  4. (defun c:tt1 (/ ent pnt ret)
  5.   (setq ent (car (entsel "\n请选取曲线:")))
  6.   (while (setq pnt (getpoint "\n点取一点"))
  7.     (setq pnt (trans pnt 1 0))
  8.     (setq pnt (vlax-curve-getclosestpointto ent pnt))
  9.     (setq ret (CUR:GetCurvature ent pnt))
  10.     (princ "\n离心半径是:")
  11.     (princ ret)
  12.     (and ret (apply 'Ent:Make_Circle ret))
  13.   )
  14. )

  15. ;;;=============================================================
  16. ;;;测试程序2: 获取椭圆一点处的曲率和离心半径,并比较两种方法   
  17. ;;;=============================================================
  18. (defun c:tt2 ( / ent obj a b pnt par lst 2st r1 r2 r3)

  19.   (if (and (setq ent (car (entsel "\n请选取椭圆:")))
  20.            (setq obj (vlax-ename->vla-object ent))
  21.            (vlax-property-available-p obj 'MajorRadius)                ;这个地方应该加出错处理
  22.              (setq a (vla-get-MajorRadius obj))
  23.            (setq b (vla-get-MinorRadius obj))
  24.       )
  25.     (while (setq pnt (getpoint "\n点取一点"))
  26.       (setq pnt (trans pnt 1 0))
  27.       (setq pnt (vlax-curve-getclosestpointto ent pnt))
  28.       (setq par (vlax-curve-getparamatpoint ent pnt))
  29.       (setq 2st (vlax-curve-getSecondDeriv ent par))
  30.       (setq 1st (vlax-curve-getFirstDeriv ent par))
  31.       (setq r1  (distance '(0 0) 2st))                           ;这个secondDeriv并不意味着半径
  32.       (setq r2  (cadr (ELL:GetCurvature1 ent a b pnt)))
  33.       (setq r3  (cadr (CUR:getcurvature ent pnt)))
  34.       (princ "\nRadius 1 is:")
  35.       (princ r1)
  36.       (princ "\nRadius 2 is:")
  37.       (princ r2)
  38.       (princ "\nRadius 3 is:")
  39.       (princ r3)
  40.       (UTI:Bench
  41.         10000
  42.         (list
  43.           (list 'ELL:GetCurvature1 ent a b pnt)
  44.           (list 'CUR:getcurvature ent pnt)
  45.         )
  46.       )
  47.     )
  48.   )
  49. )

  50. ;;;=============================================================
  51. ;;;测试程序3: 由曲线的离心半径描绘其轨迹                        
  52. ;;;=============================================================
  53. (defun c:tt (/ ent lst par px1 px2 pxn pnt Inf cen)
  54.   (if (setq ent (car (entsel "\n请选取曲线:")))
  55.     (progn
  56.       (setq px1 (vlax-curve-getStartParam ent))
  57.       (setq px2 (vlax-curve-getendparam ent))
  58.       (setq pxn (* (- px2 px1) 0.05))
  59.       (setq par px1)
  60.       (while (<= par px2)
  61.         (setq pnt (vlax-curve-getpointatparam ent par))
  62.         ;(setq Inf (ELL:GetCurvature1 ent a b pnt))
  63.         (setq Inf (CUR:GetCurvature ent pnt))
  64.         (setq cen (car Inf))
  65.         (and cen (setq lst (cons cen lst)))
  66.         (setq par (+ par pxn))
  67.         ;(apply 'ent:make_circle Inf)
  68.       )
  69.       (setq lst (reverse lst))
  70.       (Ent:Make_LWPoly lst 1)
  71.     )
  72.   )
  73. )


评分

参与人数 1D豆 +5 收起 理由
newer + 5 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 19个

财富等级: 恭喜发财

发表于 2017-8-11 21:08:09 | 显示全部楼层
不是一阶导数和二阶导数吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-8-11 21:34:34 | 显示全部楼层
曲线上一点的一阶导数(vlax-curve-getfirstderiv)几何意义为 曲线 在该点 的 切线的单位向量

曲线上一点的二阶导数(vlax-curve-getsecondderiv)的单位向量几何意义为 曲线 在该点的曲率圆圆心的方向向量
曲线上一点的二阶导数(vlax-curve-getsecondderiv)的“长度”几何意义为 曲线在该点的曲率圆的半径

所以,

下面拿特例 圆实体做测试,因为圆的半径很容易求。

  1. (defun c:tt ()
  2.   (if (and (setq e (entsel))
  3.            (setq p (cadr e))
  4.            (setq e (car e))
  5.            (setq obj (vlax-ename->vla-object e))
  6.            (= (vla-get-objectname obj) "AcDbCircle"))
  7.           
  8.     (progn (setq p1 (vlax-curve-getclosestpointto e p))
  9.            (setq pa (vlax-curve-getparamatpoint e p1)
  10.                  se (vlax-curve-getsecondderiv e pa)
  11.                  r  (vla-get-radius obj)
  12.            )
  13.            (princ "\n圆的半径=")
  14.            (princ r)
  15.            (princ "   圆心坐标=")
  16.            (princ (vl-princ-to-string
  17.                     (xd::vla:variant->value (vla-get-center obj))
  18.                   )
  19.            )
  20.            (princ "\n\n该点的二阶导数=")
  21.            (princ se)
  22.            (princ "\n该点的二阶导数向量长度(曲率圆半径)=")
  23.            (princ (setq len (xd::vec:length se)))
  24.            (princ "\n该点的二阶导数向量单位长度=")
  25.            (princ (setq direc (xd::vec:unit se)))
  26.            (princ "\n曲率圆的圆心坐标=")
  27.            (princ (vl-princ-to-string (mapcar '+ p1 se)))
  28.     )
  29.   )
  30.   (princ)
  31. )



测试结果:
命令: tt
选择对象:
圆的半径=25.8468   圆心坐标=(120.38 29.588 0.0)

该点的二阶导数=(-21.6531 14.1139 0.0)
该点的二阶导数向量长度(曲率圆半径)=25.8468
该点的二阶导数向量单位长度=(-0.837747 0.546058 0.0)
曲率圆的圆心坐标=(120.38 29.588 0.0)


结果完全正确。

评分

参与人数 1D豆 +5 收起 理由
newer + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2017-8-11 21:36:10 | 显示全部楼层

楼上的一些说法是错误的,请参见一楼。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-11 21:39:51 | 显示全部楼层
高飞和marting都很给力
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-8-11 21:45:42 | 显示全部楼层

有可能有名词上的错误,但表达的意思是准确的。

为什么 vlax-curve-getsecondderiv 的结果不是一个单位向量,而 vlax-curve-firstderiv是单位向量,这个就是ADESK让vlax-curve-getsecondderiv的结果包含了含义。 那就是我上面论证的,向量的长度为“曲率圆”半径,而且带方向了,可以求“曲率圆”的圆心。


作为曲线特例的圆,任意点的曲率圆就是圆本身。曲率圆的几何意义就是在该点切线处,两个方向的一阶导数值相等,符号相反。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2017-8-11 21:49:26 | 显示全部楼层

首先vlax-curve-getfirstDeriv 不是一个单位向量!请看看一楼的解释。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2017-8-11 22:03:55 | 显示全部楼层
t11.gif
做了一个动态演示:
代码如下:
  1. ;;;=============================================================
  2. ;;;测试程序4: 动态演示曲线的离心半径                           
  3. ;;;=============================================================
  4. (defun c:tt3 (/ CIR ENT LIN PNT PT0 RET)
  5.   (setq ent (car (entsel "\n请选取曲线:")))
  6.   (setq cir (Ent:Make_Circle '(0 0 0) 1))
  7.   (setq lin (ent:make_Line '(0 0 0) '(0 0 0)))
  8.   (setq lin (vlax-ename->vla-object lin))
  9.   (setq cir (vlax-ename->vla-object cir))
  10.   (vla-put-color lin 1)
  11.   (vla-put-color cir 3)
  12.   (princ "\n按空格或者回车退出!")
  13.   (while (= (car (setq pt0 (grread 5 0))) 5)
  14.     (setq pnt (trans (cadr pt0) 1 0))
  15.     (setq pnt (vlax-curve-getclosestpointto ent pnt))
  16.     (if (setq ret (CUR:GetCurvature ent pnt))
  17.       (progn
  18.         (setq cen (car ret))
  19.         (vlax-put Cir 'Center cen )
  20.         (vlax-put cir 'Radius (cadr ret))
  21.         (vlax-put lin 'StartPoint cen)
  22.         (vlax-put lin 'EndPoint pnt)
  23.       )
  24.     )
  25.     ;(grdraw pnt (car ret) 1)
  26.     ;(and ret (apply 'Ent:Make_Circle ret))
  27.   )
  28.   (vla-erase cir)
  29.   (vla-erase lin)
  30. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-8-11 22:34:13 | 显示全部楼层

是不是单位向量不主要,主要是你主题里面问了vlax-curve-getsecondderiv这个函数的意思,这也是很多人困惑的地方,要比vlax-curve-getfirstderiv不好理解,所以我举个特例,用代码证明了它的返回值的确切含义。

而你的代码如果用了这个含义,可能精简些。
当然,对你用数学方法解题,表示敬佩。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2017-8-11 22:45:20 | 显示全部楼层

其实你对SecondDeriv理解也不准确,它并不一定就是指向圆心的向量,某些情况下是这样,但普遍并不是这样。这个向量实际上是二阶导数向量。请你验证一下就知道了




论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-8-11 23:04:46 | 显示全部楼层

secondderiv确实就是这样,既然一个圆能验证,不是偶然的,是科学的。这个有文献的,至于你说的某些情况不一样,那可能你说的那个应用超过了这个函数本身要表达的意义。也可能就是你说的名词上的,是不是应该叫二阶导数,但ADESK文本上确实是这么叫的。但它的值的几何意义确实是我验证的。

我验证的是这个函数返回值到底等于什么,怎么来的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2017-8-11 23:09:02 | 显示全部楼层
你要验证椭圆和样条曲线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-8-11 23:27:02 | 显示全部楼层
本帖最后由 marting 于 2017-8-11 23:29 编辑

存在就有意义,既然是曲线类函数,从面向对象的角度,它叫 vlax-curve-getsecondderiv 而不是叫 vlax-circle-getsecondderiv ,ADESK做的,对圆适用,对其他也适用。只能是你说的那个不是ADESK文本解释的“定义”。vlax-curve-getsecondderiv 说的是“曲率圆”,你那个可能是别的什么名词的圆,像你说的 “转弯半径” 和曲率半径是不是一个,我也拿不准。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-8-11 23:46:34 | 显示全部楼层
补充下二楼的帖子

vlax-curve-getfirstderiv 确实不是单位向量,是切线向量,它的向量的长度等于“曲率圆半径” 和 vlax-curve-getsecondderiv 一样。

  1. (defun c:tt ()
  2.   (if (and (setq e (entsel))
  3.            (setq p (cadr e))
  4.            (setq e (car e))
  5.            (setq obj (vlax-ename->vla-object e))
  6.            (= (vla-get-objectname obj) "AcDbCircle"))

  7.     (progn (setq p1 (vlax-curve-getclosestpointto e p))
  8.            (setq pa (vlax-curve-getparamatpoint e p1)
  9.                  se (vlax-curve-getfirstderiv e pa)
  10.                  r  (vla-get-radius obj)
  11.            )
  12.            (princ "\n圆的半径=")
  13.            (princ r)
  14.            (princ "\n\n该点的一阶导数=")
  15.            (princ se)
  16.            (princ "\n该点的一阶导数向量长度(曲率圆半径)=")
  17.            (princ (setq len (xd::vec:length se)))
  18.     )
  19.   )
  20.   (princ)
  21. )




命令: tt
选择对象:
圆的半径=330.721

该点的一阶导数=(-202.896 261.17 0.0)
该点的一阶导数向量长度(曲率圆半径)=330.721

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2017-8-12 00:27:39 | 显示全部楼层

首先你看看这段:
pc11.jpg
你不妨验证一下椭圆或者样条曲线。
我们再看看Autodesk开发文档的原文:
vlax-curve-getSecondDeriv
Returns the second derivative (in WCS) of a curve at the specified location
翻译derivative,在数学的名词就是导数
因此这个函数就是求曲线在某点的二阶导数。
因此,我才说你理解的不完全准确。对圆来说,这个SecondDeriv的确跟半径和半径矢量有关,但仅仅是适用圆而已。
对于椭圆和样条曲线来说,这个值不代表离心半径,也不指向圆心方向。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-22 10:07 , Processed in 0.499650 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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