跳转到主要内容

用LISP绘制精确的抛物线和双曲线

主标签

首先说一下,圆锥曲线在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点按照如下方式计算:

图像
双曲线1

其中p2的权重取值为x/a.
其实当x取一些特殊值的时候,容易得到更简易的画法,譬如当x=2a的时候,以a=5,b=3为例,画法参考如下链接:

圆锥曲线在AutoCAD的精确表达法 
下面是用程序画出双曲线的演示:


代码在附件已经更新了。

文档

原作于2021.9.15发表于明经通道上:

用LISP绘制精确的抛物线和双曲线 

分类