用LISP绘制精确的抛物线和双曲线
highflybird
- 登录 发表评论
首先说一下,圆锥曲线在CAD中是有精确画法的。可以不用拟合方式或者很多个顶点的多段线模拟绘制。
这样绘制出来的抛物线是样条曲线,仅仅用三个控制点,就能满足高精度要求。
关于这个精确画法,请参考我的下面的帖子:
圆锥曲线在AutoCAD的精确表达法
因此根据这个画法,在这篇帖子里,对抛物线,我提供了三种画法的LISP程序:
下面是其动画演示:

三点式的核心代码如下:
;;;=============================================================
;;; 功能: 根据抛物线三点绘制抛物线
;;; 输入: 抛物线的起点和终点以及极值点
;;; 输出: 所求的抛物线
;;;=============================================================
;;;-------------------------------------------------------------
(defun c:pwx3 (/ A A1 A2 B d K K1 K2 M N P1 P2 P3 PT Q1 Q2 X1 X2 X3 Y1 Y2 Y3 Z3)
(initget 9)
(setq p1 (getpoint "\n请输入起始点:"))
(initget 9)
(setq p2 (getpoint "\n请输入终止点:"))
(initget 9)
(setq p3 (getpoint "\n请输入第三点:"))
(setq p1 (trans p1 1 0))
(setq p2 (trans p2 1 0))
(setq p3 (trans p3 1 0))
(mapcar 'set '(p1 p2 p3) (ALG:Sort3PbyX p1 p2 p3))
(mapcar 'set '(x1 x2 x3) (mapcar 'car (list p1 p2 p3)))
(if (or
(equal x1 x2 1e-8)
(equal x2 x3 1e-8)
(equal x3 x1 1e-8)
)
(alert
"输入的三点不符合要求!请满足如下要求后重新输入:
\n1. 输入的抛物线的三点不在同一直线上。
\n2. 最低点或者最高点的在两端点之上或之下。
\n3. 起始点和终止点的X值不相同。"
)
(progn
(mapcar 'set '(A B C) (MATH:GetArgumentsBy3P p1 p2 p3))
(setq S (MATH:GetArgumentsByEquation a b c x1 x3 '(0 0)))
(apply 'ent:SplineBy3p s)
)
)
(princ)
)
其它具体实现细节请参见附件。
后续: 此程序已经增加了双曲线的画法:
下面我继续介绍如何画双曲线:
经过研究,形成双曲线spline的三点对于P1,P3是容易得到的。对于P2点按照如下方式计算:
图像
其中p2的权重取值为x/a.
其实当x取一些特殊值的时候,容易得到更简易的画法,譬如当x=2a的时候,以a=5,b=3为例,画法参考如下链接:
圆锥曲线在AutoCAD的精确表达法
下面是用程序画出双曲线的演示:
代码在附件已经更新了。
文档
圆锥曲线研究.lsp
(26.64 KB)
原作于2021.9.15发表于明经通道上: