无痕 发表于 2003-12-29 05:41:00

再探 vlax-curve-getsecondDeriv和曲线上一点的切线和法线

一直以来对 vlax-curve-getsecondDeriv 和vlax-curve-getfirsetDeriv 有概念上的疑惑。
有人说是曲线上一点的切线和法线方向点。
但是,请看图。这到底是求什么点?
曲线上一点的切线和法线又该如何求?

cy956 发表于 2005-11-13 20:06:00

(setq ang(angle '(0 0) dir1))

fangmin723 发表于 2023-5-4 12:34:31

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)
)

20060510412 发表于 2021-12-7 20:10:30

fxxpleasure 发表于 2011-12-18 11:22
(vlax-curve-getFirstDeriv curve-obj para)         ;得到曲线curve-obj 在para点的切向量。
(vlax-cur ...

getsecondderiv不是得到法向量吧,而是曲线的二阶导数值。
例如对于直线,secondderiv永远为0,因为直线的二阶导数就是0。

meflying 发表于 2003-12-29 08:54:00

看看这个程序,希望能看出这两个函数的意义(主要是返回值及参数的意义)

(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)
)

无痕 发表于 2003-12-29 13:53:00

是这个啊(setq ang (atan (/ (cadr dir1) (car dir1))))。非常感谢!如果是getsecondderiv 呢?

ZYB76 发表于 2005-11-11 18:26:00

高,真是高,感谢<A name=68665><FONT color=#990000><B>meflying</B></FONT></A>

bjzjt 发表于 2005-11-13 21:09:00

<P>呵呵,FLYING版主自己也忘了,VL-CURVE-*函数可以直接使用ENAME,不需要VLAX-ENAME-&gt;VLA-OBJECT的.</P>

bjzjt 发表于 2005-11-13 21:19:00

<P>恰好前几天研究了一下这个问题,本来对高数不太明白的.GETFIRSTDERIVE——一阶导数,GETSECONDDERIV——二阶导数。参考书中举了一个实例:运动曲线中,一阶导数就是速度,二阶导数就是加速度了。对于平面中的曲线,一阶导数即切线矢量,用5楼的方法或者FLYING版主的方法可以变成该点的切线角度,二阶导数吗,斜率的变化率,做什么用就得看曲线到底代表什么意义了。至于法线,有了切线还用愁法线吗?</P>

fxxpleasure 发表于 2011-12-18 11:22:27

无痕 发表于 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点的法向量。
利用解析几何算法时很有用。

fxxpleasure 发表于 2011-12-18 11:55:10

(0 0)点和getFirstDerivgetSecondDeriv得到的点,构成的矢量,矢长为曲线的曲率半径长度。

byghbcx 发表于 2011-12-18 22:47:16

矢长为曲线的曲率半径?
页: [1] 2 3
查看完整版本: 再探 vlax-curve-getsecondDeriv和曲线上一点的切线和法线