明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8779|回复: 22

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

  [复制链接]
发表于 2003-12-29 05:41:00 | 显示全部楼层 |阅读模式
一直以来对 vlax-curve-getsecondDeriv 和vlax-curve-getfirsetDeriv 有概念上的疑惑。
有人说是曲线上一点的切线和法线方向点。
但是,请看图。这到底是求什么点?
曲线上一点的切线和法线又该如何求?

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2005-11-13 20:06:00 | 显示全部楼层
(setq ang(angle '(0 0) dir1))
发表于 2023-5-4 12:34:31 | 显示全部楼层
meflying 发表于 2003-12-29 08:54
看看这个程序,希望能看出这两个函数的意义(主要是返回值及参数的意义)

优化了当拾取点为第一象限点时除数为零的错误
  1. (defun c:test(/ angf angs ent obj os para pt vecf vecs)
  2.   (setq os (getvar "osmode"))
  3.   (setq ent (car (entsel)))
  4.   (setq obj (vlax-ename->vla-object ent))  
  5.   (while (setq pt (getpoint "\n拾取点:"))
  6.     (setq para (vlax-curve-getParamAtPoint obj (setq pt (vlax-curve-getClosestPointTo obj pt))))
  7.                 ;;切线
  8.     (setq vecf (vlax-curve-getFirstDeriv obj para))
  9.                 (setq angf (angle pt (mapcar '+ pt vecf)))
  10.                 ;;法线
  11.                 (setq vecs (vlax-curve-getsecondDeriv obj para))
  12.                 (setq angs (angle pt (mapcar '+ pt vecs)))
  13.     (setvar "osmode" 0)
  14.                 (command "_.line" (polar pt (+ angf pi) 100) (polar pt angf 100) "")
  15.     (command "_.line" (polar pt (+ angs pi) 100) (polar pt angs 100) "")
  16.     (setvar "osmode" os)
  17.   )
  18.   (setvar "osmode" os)
  19.   (princ)
  20. )
发表于 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。
发表于 2003-12-29 08:54:00 | 显示全部楼层
看看这个程序,希望能看出这两个函数的意义(主要是返回值及参数的意义)

  1. (defun c:test( / os ent curve-obj pt para dir1 ang)
  2.   (setq os (getvar "osmode"))
  3.   (setq ent (car (entsel)))
  4.   (setq curve-obj (vlax-ename->vla-object ent))  
  5.   (while (setq pt (getpoint "Pick a point:"))
  6.     (setq para (vlax-curve-getParamAtPoint curve-obj pt))
  7.     (setq dir1 (vlax-curve-getFirstDeriv curve-obj para))
  8.     (setq ang (atan (/ (cadr dir1) (car dir1))))
  9.     (setvar "osmode" 0)
  10.     (command "_.line" (polar pt (+ ang pi) 100) (polar pt ang 100) "")
  11.     (setvar "osmode" os)
  12.   )
  13.   (setvar "osmode" os)
  14.   (princ)
  15. )
 楼主| 发表于 2003-12-29 13:53:00 | 显示全部楼层
是这个啊(setq ang (atan (/ (cadr dir1) (car dir1))))。非常感谢!如果是getsecondderiv 呢?
发表于 2005-11-11 18:26:00 | 显示全部楼层
高,真是高,感谢meflying
发表于 2005-11-13 21:09:00 | 显示全部楼层

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

点评

测试过确实有效,感谢分享。  发表于 2013-5-29 17:54
发表于 2005-11-13 21:19:00 | 显示全部楼层

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

评分

参与人数 1金钱 +20 收起 理由
川-派大星 + 20 很给力!

查看全部评分

发表于 2011-12-18 11:22:27 | 显示全部楼层
无痕 发表于 2003-12-29 13:53
是这个啊(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点的法向量。
利用解析几何算法时很有用。
发表于 2011-12-18 11:55:10 | 显示全部楼层
(0 0)点和getFirstDeriv  getSecondDeriv得到的点,构成的矢量,矢长为曲线的曲率半径长度。
发表于 2011-12-18 22:47:16 | 显示全部楼层
矢长为曲线的曲率半径?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 20:32 , Processed in 0.208326 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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