这个问题应该比较有趣,于是查了一下资料
A. acad本身的帮助,first second
vlax-curve-getFirstDeriv:返回曲线在指定位置的第一个衍生(在 WCS 中),vlax-curve-getSecondDeriv第二个
应该可以说看了等于白看,于是google,发现如下两个讨论
B.mjtd的http://www.mjtd.com/bbs/printpage.asp?BoardID=3&id=14731
C. Autodesk论坛的http://discussion.autodesk.com/thread.jspa?threadID=328817
看了B之后,有了一定的认识,C的讨论比较深入,也有诸多高人开口。
于是借B中的程序,修改了一下,得到如下测试程序
- (defun c:test (/ os ent curve-obj pt para dir1 ang)
- (vl-load-com)
- (setq os (getvar "osmode"))
- (setq ent (car (entsel)))
- (setq curve-obj (vlax-ename->vla-object ent))
- (setvar "osmode" 512)
- (while (setq pt (getpoint "Pick a point:"))
- (setq para (vlax-curve-getParamAtPoint curve-obj pt))
- (setq dir0 (vlax-curve-getFirstDeriv curve-obj para))
- (setq dir1 (vlax-curve-getsecondDeriv curve-obj para))
- (setq oring (list 0 0 0))
- (grdraw oring dir0 2)
- (grdraw oring dir1 3)
- (setq ang0 (angle oring dir0))
- (setq ang (angle oring dir1))
- (setq leng0 (distance oring dir0))
- (setq leng (distance oring dir1))
- (setvar "osmode" 0)
- (command "_.color" 2)
- (command "_.line" pt (polar pt ang0 leng0) "")
- (getstring "\nBreakpoint 1, 这个是firstderiv画出来的线...");Erase_BP
- (command "_.color" 3)
- (command "_.line" pt (polar pt ang leng) "")
- (getstring "\nBreakpoint 1, 这个是secondderiv画出来的线...");Erase_BP
- (setvar "osmode" os)
- )
- (setvar "osmode" os)
- (princ)
- )
然后作几个测试,参照C中的好多思路,得到如下个人一些看法
1. 按道理一条曲线的一阶导数和二阶导数都应该是一个标量(数值),为什么会变成一个矢量
个人看法:
这个是基于笛卡儿座标系的标量代数(这个说法可能不标准)和矢量代数的区别,
在平面标量代数中,一个曲线的表达是y=f(x),它只有数值,没有方向
而在矢量代数中,函数的表达是r=r(t),它和时间有关系,其中的r是一个从原点指向函数上一点的一个矢量。
在标量代数中,导数就是dy/dx,这个得到的是一个数值,二阶导数d2y/d2x仍然是一个数值。
而在矢量代数中,导数是dr/dt=dx/dt+dy/dt,可以看出,它是由一个x方向的增量矢量和一个y方向的增量矢量的叠加,从下图可以看出,一阶导数dr1或者dr2,在时间t为无穷小时,就代表了曲线的切线,把这个切线的斜率取出,就是标量代数的斜率数值,对于二阶导数,标量代数代表的是曲线的凹度,也就是曲率变化程度
而对于矢量代数,同样的道理,它是一阶导数矢量的变化率,把dr1和dr2平移到蓝色位置(为了好显示),得到一个d2r/dt2,这个就是二阶导数的矢量数值
也就是acad中vlax-curve-getSecondDeriv得到的矢量方向(注意,这个时候得到的一个点和原点要连接,就代表了这个向量,而向量是可以平移的),因此楼主说的大小比较,其实也可以从一个曲线的弯曲变化程度来看的,曲的越厉害,二阶导数越大
但是那么这个矢量长度究竟是多少,其实我们可以发现,在前面的过程中,存在着一个时间t的函数,那么时间又代表什么意思呢。
在mjtd里面,最后一位大哥提到了位移,速度,加速度这个,应该让人豁然开朗。
这里面,首先要假设的是:一个物体沿着这条直线作匀速运动(这个很重要),那么,一阶导数就代表了速度,二阶导数就代表了加速度,比如我们平常
提到的匀速圆周运动,速度就是圆的切线,而加速度就对准圆心,各位可以用lisp测试一下。这里面,由于运动速度不知道,因此一阶导数和二阶导数的
具体大小(矢量的模)其实存在着问题,acad会自己规定一个大小,这个在2中讨论
不过mjtd的那位大哥提到的有了切线,法线还难么,个人有些不同的看法,二阶导数不一定是垂直于一阶导数的,对椭圆而言,其二阶导数是指向椭圆中心的
2.矢量长度具体大小的多少,似乎随着不同的曲线类型有所变化,大家可以测试一下各种曲线
个人参考C中说法,测试了直线、椭圆、圆、pline,spline几种
发现,对于直线而言,vlax-curve-getFirstDeriv得到的是一个与直线切线方向相同矢量,长度和直线长度相同,vlax-curve-getSecondDeriv为0(这个是肯定的)
对于圆而言,vlax-curve-getFirstDeriv得到的一个切线矢量,长度和圆半径相同,vlax-curve-getSecondDeriv为得到的矢量和一阶矢量垂直,大小等于圆半径(这个是规定的)
对于椭圆而言,vlax-curve-getFirstDeriv得到的一个切线矢量,长度等于某种椭圆半径(这个比较难表达,大家测试就知道),vlax-curve-getSecondDeriv为得到的矢量指向椭圆中心,大小等于点到中心半径(这个是规定的)
对于折线型pline,vlax-curve-getFirstDeriv得到的一个切线矢量,长度等于所选段pline长度,vlax-curve-getSecondDeriv为得到0(这个是肯定的)
对于spline而言,vlax-curve-getFirstDeriv得到的一个切线矢量,长度很小,不知道怎么规定的,vlax-curve-getSecondDeriv一个切线矢量的变化率矢量,长度也不知道怎么规定的(这个是肯定的)
不好意思,罗里罗嗦讲了一堆,可能把一个简单的问题复杂化了,也可能不是很对题,也说不定讲错了,请指正。 |