明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8901|回复: 27

[越飞越高] 圆锥曲线在AutoCAD的精确表达法

[复制链接]
发表于 2020-9-13 00:10:52 | 显示全部楼层 |阅读模式
本帖最后由 highflybird 于 2021-9-9 00:16 编辑

圆锥曲线有三类:椭圆、抛物线和双曲线。
椭圆在AutoCAD的画法为众人熟知,我现在说说剩下的两类。
1、抛物线。
如果熟悉三维建模的,可以创建一个三维的圆锥体,然后用section命令得到圆锥曲线的轮廓。
炸开这个轮廓,可以得到一个精确的圆锥曲线,这个方法有点费时,不好操作。
现在通过举例讲解抛物线的画法。
画: y=a*x^2 ,区间段为(-1,1)。
输入命令:spline回车

当前设置: 方式=拟合   节点=弦
指定第一个点或 [方式(M)/节点(K)/对象(O)]: m         <-----在这里输入m
输入样条曲线创建方式 [拟合(F)/控制点(CV)] <拟合>: cv   <-----在这里输入CV
当前设置: 方式=控制点   阶数=3
指定第一个点或 [方式(M)/阶数(D)/对象(O)]: d        <-----在这里输入d
输入样条曲线阶数 <3>:                   <-----在这里输入2,形成2阶的样条曲线。                    
(上面的这些设置输入一次址后,CAD下次可以不用输入了)

当前设置: 方式=控制点   阶数=2
指定第一个点或 [方式(M)/阶数(D)/对象(O)]:
输入下一个点:                                 <-----捕捉第一点坐标为(-1,a)。
输入下一个点或 [放弃(U)]:               <-----捕捉第二点坐标为(0,-a)。
输入下一个点或 [闭合(C)/放弃(U)]:  <-----捕捉第三点坐标为(1,a)。

回车。
这样就得到了一条抛物线,这是一条精确的抛物线,不是拟合出来的,读者可以自行验证。
其它形式的方程,均可由此平移和旋转变换得到。如果大家有兴趣,不妨参考相关知识。
譬如下面的链接:
https://zhuanlan.zhihu.com/p/91649187

2、双曲线。
双曲线与抛物线的画法类似,也是要设置为二阶样条曲线,方式为控制点的模式。
举例:画双曲线x^2-y^2=1,区间为(-2,2)
先画半边。
输入spline, 像抛物线那样设置,如果已经设置好了,回车即可。
要依次输入这三点,这三点坐标是A(2,sqrt(3)), C(0.5,0),B(2,-sqrt(3))
输入后,回车。
下面的步骤可能在属性里面操作容易写。
选取刚才形成的样条曲线,ctrl+1打开属性面板,在属性的当前控制点设置为2,即C点。
把权值-1修改为2,那么,这样就形成了右半边,镜像一下,得到左半边。
所需双曲线绘制完成。
上面的属性修改也可以用splinedit命令来完成
选择开始默认形成的样条曲线,输入splinedit或者双击。
命令: _splinedit
输入选项 [闭合(C)/合并(J)/拟合数据(F)/编辑顶点(E)/转换为多段线(P)/反转(R)/放弃(U)/退出(X)] <退出>: e
输入顶点编辑选项 [添加(A)/删除(D)/提高阶数(E)/移动(M)/权值(W)/退出(X)] <退出>: w
输入新权值 (当前值 = 1.00000000) 或 [下一个(N)/上一个(P)/选择点(S)/退出(X)] <下一个>:
输入新权值 (当前值 = 1.00000000) 或 [下一个(N)/上一个(P)/选择点(S)/退出(X)] <下一个>: 2   <-----在这里输入2,把第二点的权值修改为2。  
输入新权值 (当前值 = 2.00000000) 或 [下一个(N)/上一个(P)/选择点(S)/退出(X)] <下一个>: x
输入顶点编辑选项 [添加(A)/删除(D)/提高阶数(E)/移动(M)/权值(W)/退出(X)] <退出>: x
输入选项 [闭合(C)/合并(J)/拟合数据(F)/编辑顶点(E)/转换为多段线(P)/反转(R)/放弃(U)/退出(X)] <退出>: x



分析:
由曲线方程可知,曲线经过(2,sqrt(3))和(2,-sqrt(3))两点,这两点可作为样条的两个端点。
经过计算,可知在点(2,sqrt(3))双曲线的切线斜率为2Xsqrt(3)/3,交X轴线于C(0.5,0)点,又可知曲线经过D(1,0)点
所以权值为DE/CD=1/0.5=2,因此控制点C的权值要输入2.

3、总结方法,
a、首先找到曲线的两个端点(一般做对称的好些,不对称区间可以用对称区间画出,后期用裁剪命令修剪)作为第一个控制点和第三个控制点。
b、第二点为首位两个端点的切线相交点。
c、计算和修改权值,得到需要曲线。权值大于1为双曲线,等于1为抛物线,小于1为椭圆。读者自行验证。

如果读者觉得步骤麻烦,可以用简单的LISP程序来生成。

4、关于证明,大家可以参考样条曲线的知识,经过验证,用三个控制点的时候,二阶样条曲线的方程表达完全一致。
有什么不足的地方请大家多多指教。
转载此文需标明原作者和来源。

后续,下面我补充对于一般的双曲线的画法(以a=5,b=3为例):

关于其原理不再赘述了。
另外利用LISP程序绘制抛物线和双曲线,请参考如下链接:
用LISP绘制精确的抛物线和双曲线

本帖子中包含更多资源

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

x

点评

其实画抛物线阶数不一定需要设置成3,如果只给三个控制点就结束,阶数自动就会变成2。  发表于 2022-12-8 12:16

评分

参与人数 5明经币 +7 金钱 +150 收起 理由
vormittag + 1 + 50 很给力!
pzweng + 2 很给力!
chenmik + 1 + 20 赞一个!
qjchen + 2 + 30 很给力!
mahuan1279 + 1 + 50 很给力!

查看全部评分

发表于 2020-9-16 21:59:22 | 显示全部楼层
本帖最后由 纵横八方 于 2020-9-16 22:03 编辑
highflybir 发表于 2020-9-16 20:28
不是这样的,A1B2-A2B1不是判断两平面平行的,而是判断交线是否平行XY平面的。建议楼主另开帖子讨论,因 ...

;;;还是有BUG
(defun c:tt(/ a1 a2 b1 b2 c1 c2 d1 d2 e f g lst1 lst2 m n pt1 pt2 q u v x y z)
(setvar "cmdecho" 0)
(setq lst1 (APPLY 'PLANE:Equation_3P (setq ptlst1 (list (getpoint "\n第一点") (getpoint "\n第二点") (getpoint "\n第三点")))))
(setq lst2 (APPLY 'PLANE:Equation_3P (list (getpoint "\n第一点") (getpoint "\n第二点") (getpoint "\n第三点"))))
(setq A1 (CAR LST1) B1 (CADR LST1) C1 (CADDR LST1) D1 (CADDDR LST1))
(setq A2 (CAR LST2) B2 (CADR LST2) C2 (CADDR LST2) D2 (CADDDR LST2))
(setq u (list A1 B1 C1) v (list A2 B2 C2))
(setq pt2 (MAT:unit (MAT:vxv u v)))
(setq m (- (* A1 B2) (* A2 B1)))
(setq n (- (* A1 C2) (* A2 C1)))
(setq q (- (* B1 C2) (* B2 C1)))
(setq e (- (* B1 D2) (* B2 D1)))
(setq f  (- (* C2 D1) (* C1 D2)))
(setq g (- (* A1 D2) (* A2 D1)))
(if (/= m 0);平行于XY平面
(progn
(setq z (caddr (car ptlst1)))
(setq x (/ (+ (* q z) e) m) y (/ (+ (* n z) g) m))
(setq pt1 (list x y z))
)
(progn
(if (/= n 0);平行于XZ平面
(progn
(setq y (cadr (car ptlst1)))
(setq x (/ (+ (* q y) f) n) z (/ (+ (* m y) g) n))
(setq pt1 (list x y z))
)
(progn
(if (/= q 0);平行于YZ平面
(progn
(setq x (car (car ptlst1)))
(setq y (/ (+ (* n x) f) q) z (/ (- (* m x) e) q))
(setq pt1 (list x y z))
)
)
)
)
)
)
(entmake (list '(0 . "LINE") (cons 10 pt1) (cons 11 (mapcar '+ pt1 pt2)) (cons 62 2)))
(command "LENGTHEN" "dy" (entlast))
(princ)
)

点评

你程序写错了。要求出z=0和z=1时候的两点。  发表于 2020-9-17 00:52
发表于 2020-9-16 18:31:57 | 显示全部楼层
纵横八方 发表于 2020-9-16 07:55
大神,已知两平面上各三点,能不能写一个两平面的交线函数,gu版主的api函数里面有写某个平面交线函数返回 ...

关于三点的空间平面方程可以参考如下链接:
https://mathworld.wolfram.com/Plane.html

平面和平面的交线见如下链接:
https://mathworld.wolfram.com/Plane-PlaneIntersection.html
或可以参考下列解析表达式。

本帖子中包含更多资源

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

x
 楼主| 发表于 2020-9-16 00:01:49 | 显示全部楼层
本帖最后由 highflybird 于 2020-9-16 00:21 编辑
chenmik 发表于 2020-9-15 22:42
请教版主:你在双曲线分析中所说:
经过计算,可知在点(2,sqrt(3))双曲线的切线斜率为2Xsqrt(3)/3,交 ...

斜率就是切线的斜率,也就是此点的导数。可以用微分公式求得。
至于权重,可以参考如下的链接:
https://zhuanlan.zhihu.com/p/50626506
还可以参考如下链接:
https://blog.csdn.net/deepsprings/article/details/107828889

发表于 2020-9-13 07:25:28 | 显示全部楼层
这种功能都被找出来了。强悍!!!
发表于 2020-9-13 10:31:15 | 显示全部楼层
飞鸟大师666
 楼主| 发表于 2020-9-13 11:31:06 | 显示全部楼层
本帖最后由 highflybird 于 2020-9-13 11:35 编辑

通过研究,发现可以作出高阶的曲线,譬如作 在区间(0,1)上y=x^5的多项式曲线。
把区间(0,1)等分成5等分,用spline画样条曲线,阶数设置为5,
从原点开始,依次通过4个等分点,到达最后的控制点为(1,1),
这样就得到了所需曲线。

不过随着阶数的升高,精度会有所降低。不过依然可以达到一般需要。

本帖子中包含更多资源

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

x
发表于 2020-9-13 11:56:56 | 显示全部楼层
感谢高飞鸟大神的知识共享!
发表于 2020-9-13 13:16:53 | 显示全部楼层
感谢版主分享。先顶后看。
发表于 2020-9-13 13:54:20 来自手机 | 显示全部楼层
就是控制点,节点,权值不好理解
发表于 2020-9-14 10:05:57 | 显示全部楼层
看着像犀牛的画线模式
发表于 2020-9-14 23:28:24 | 显示全部楼层
大师出马必定精品
发表于 2020-9-15 22:42:26 | 显示全部楼层
请教版主:你在双曲线分析中所说:
经过计算,可知在点(2,sqrt(3))双曲线的切线斜率为2Xsqrt(3)/3,交X轴线于C(0.5,0)点,又可知曲线经过D(1,0)点
所以权值为DE/CD=1/0.5=2,因此控制点C的权值要输入2.
这个斜率和权值具体是怎么计算得到的?能说详细一点吗?谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 11:13 , Processed in 0.208278 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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