再探 vlax-curve-getsecondDeriv和曲线上一点的切线和法线
一直以来对 vlax-curve-getsecondDeriv 和vlax-curve-getfirsetDeriv 有概念上的疑惑。有人说是曲线上一点的切线和法线方向点。
但是,请看图。这到底是求什么点?
曲线上一点的切线和法线又该如何求?
(setq ang(angle '(0 0) dir1)) meflying 发表于 2003-12-29 08:54
看看这个程序,希望能看出这两个函数的意义(主要是返回值及参数的意义)
优化了当拾取点为第一象限点时除数为零的错误
(defun c:test(/ angf angs ent obj os para pt vecf vecs)
(setq os (getvar "osmode"))
(setq ent (car (entsel)))
(setq obj (vlax-ename->vla-object ent))
(while (setq pt (getpoint "\n拾取点:"))
(setq para (vlax-curve-getParamAtPoint obj (setq pt (vlax-curve-getClosestPointTo obj pt))))
;;切线
(setq vecf (vlax-curve-getFirstDeriv obj para))
(setq angf (angle pt (mapcar '+ pt vecf)))
;;法线
(setq vecs (vlax-curve-getsecondDeriv obj para))
(setq angs (angle pt (mapcar '+ pt vecs)))
(setvar "osmode" 0)
(command "_.line" (polar pt (+ angf pi) 100) (polar pt angf 100) "")
(command "_.line" (polar pt (+ angs pi) 100) (polar pt angs 100) "")
(setvar "osmode" os)
)
(setvar "osmode" os)
(princ)
) fxxpleasure 发表于 2011-12-18 11:22
(vlax-curve-getFirstDeriv curve-obj para) ;得到曲线curve-obj 在para点的切向量。
(vlax-cur ...
getsecondderiv不是得到法向量吧,而是曲线的二阶导数值。
例如对于直线,secondderiv永远为0,因为直线的二阶导数就是0。 看看这个程序,希望能看出这两个函数的意义(主要是返回值及参数的意义)
(defun c:test( / os ent curve-obj pt para dir1 ang)
(setq os (getvar "osmode"))
(setq ent (car (entsel)))
(setq curve-obj (vlax-ename->vla-object ent))
(while (setq pt (getpoint "Pick a point:"))
(setq para (vlax-curve-getParamAtPoint curve-obj pt))
(setq dir1 (vlax-curve-getFirstDeriv curve-obj para))
(setq ang (atan (/ (cadr dir1) (car dir1))))
(setvar "osmode" 0)
(command "_.line" (polar pt (+ ang pi) 100) (polar pt ang 100) "")
(setvar "osmode" os)
)
(setvar "osmode" os)
(princ)
)
是这个啊(setq ang (atan (/ (cadr dir1) (car dir1))))。非常感谢!如果是getsecondderiv 呢? 高,真是高,感谢<A name=68665><FONT color=#990000><B>meflying</B></FONT></A> <P>呵呵,FLYING版主自己也忘了,VL-CURVE-*函数可以直接使用ENAME,不需要VLAX-ENAME->VLA-OBJECT的.</P> <P>恰好前几天研究了一下这个问题,本来对高数不太明白的.GETFIRSTDERIVE——一阶导数,GETSECONDDERIV——二阶导数。参考书中举了一个实例:运动曲线中,一阶导数就是速度,二阶导数就是加速度了。对于平面中的曲线,一阶导数即切线矢量,用5楼的方法或者FLYING版主的方法可以变成该点的切线角度,二阶导数吗,斜率的变化率,做什么用就得看曲线到底代表什么意义了。至于法线,有了切线还用愁法线吗?</P> 无痕 发表于 2003-12-29 13:53 static/image/common/back.gif
是这个啊(setq ang (atan (/ (cadr dir1) (car dir1))))。非常感谢!如果是getsecondderiv 呢?
(vlax-curve-getFirstDeriv curve-obj para) ;得到曲线curve-obj 在para点的切向量。
(vlax-curve-getSecondDeriv curve-obj para) ;得到曲线curve-obj 在para点的法向量。
利用解析几何算法时很有用。
(0 0)点和getFirstDerivgetSecondDeriv得到的点,构成的矢量,矢长为曲线的曲率半径长度。 矢长为曲线的曲率半径?