LISP 语言在CAD 道路设计中的各种应用

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三章LISP语言在CAD道路设计中的各种应用

3.1绘制平面任意函数曲线的AutoLISP程序设计

在各个工程设计领域中,经常要绘制一些曲线,特别是平面曲线,如水工结构的溢流曲线、机械设计的齿轮渐开曲线等。在AutoCAD绘图软件中,可以将曲线上的点先计算好,再用线、多义线、样条曲线等方法绘制,这种方法需要进行大量计算,工作量较大,如果用EXCEL软件来辅助计算,可以减轻工作量;另外,可以针对具体的曲线类型,用AutoCAD 内嵌的AutoLISP语言,实现边计算边绘制的功能。用这种方法绘制虽然快捷,但对于不同的曲线,则需编写同的AutoLISP程序,检查无误后才能运行,仍显繁琐。能否用统一的程序,来实现各种平面函数曲线的绘制,我们尝试利用AutoCAD中强大的表达式计算功能来实现这一目的。

3.1.1平面函数曲线的类型和绘制方法

平面函数曲线即是有简单函数表达式的曲线类型,可考虑经常遇到的4类:

(1)直角坐标下形如y=f(x)的曲线;

(2)直角坐标下的参数方程曲线;

(3)极坐标下形如r=f(θ)的曲线;

(4)极坐标下的参数方程曲线。

其中,只需增加一个平凡方程x=x,参数方程(2)就可以包括相应的直接表达形式(1),同样(4)可以包括(3)。同时,极坐标形式可以通过:

x=rcosθ

y=rsinθ

转换为直角坐标表达。因此从本质上说,4种类型都可以互相转换,把它们分类的目的是尽量采用函数的通常表达形式,以便于使用。绘制时,参照曲线的手工绘制方法,需要给出曲线上的多个点,然后将它们连接起来。若给出的点间隔很小,直接用折线段相连就可很好模拟该曲线,如果间隔较大,可以用样条曲线连接,使之比较光滑。假设我们计算出足够多的点,简单用折线连接即可,为使该曲线成为一个整体,可用多义线的方式连接。

关键的问题是,如何计算出曲线上点的坐标。由于曲线的函数表达式各种各样,不可能用统一的式子来表示。可以考虑从外部输入表达式,然后针对该表达式进行计算,给出相应结果,就能够解决点坐标的计算问题。但这个功能的实现比较困难,幸好AutoCAD为我们提供了CAL命令,可以对任意的表达式进行计算。该命令由函数库文件geomcal.arx提供,支持科学/工程计算器上的大多数标准函数,如三角函数、指数、对数等。若表达式中有变量,而该变量在程序中已设定了值,则按该值进行计算。由于该函数不是LISP内部函数,为使之可用,需要用ARXLOAD命令载入文件geomcal.arx,或者在命令行先输入CAL命令,由系统自动载入,这样,程序中就可以使用该函数了。总的程序定义为c:curve(),以便在AutoCAD命令行中与通常的命令一样使用。程序的总调用部分为:

(arxload "geomcal.arx");载入提供表达式计算功能的ARX文件

(vl- arx- import 'c:cal);让命令c:cal能够使用

(princ "(1)直角坐标下曲线y=f(x).\n")

(princ "(2)直角坐标下参数曲线x=f(i),y=g(i).\n")

(princ "(3)极坐标下曲线r=f(theta).\n")

(princ "(4)极坐标下参数曲线theta=f(i),r=g(i).\n")

(setq ichoice (getint " 选择绘制曲线类型:"));选择曲线类型

(if (= ichoice 1) (curve1));调用曲线绘制类型1

(if (= ichoice 2) (curve2));调用曲线绘制类型2

(if (= ichoice 3) (curve3));调用曲线绘制类型3

(if (= ichoice 4) (curve4));调用曲线绘制类型4

根据用户选择的曲线类型,转到相应的曲线类型绘制函数中,依次为直角坐标下的普通函数、参数方程,极坐标下的普通函数和参数方程。

3.1.2直角坐标下函数y=f(x)的曲线绘制

直角坐标下绘制函数曲线y=f(x)定义为AutoLISP子程序curve1,该子程序没有传入传出参数。程序的第一个步骤是读入有关的参数和控制变量。首先读入y=f(x)的表达式,然后输入自变量x的变化范围[low,up],接着根据模拟精度,输入曲线剖分数目steps,x的变化步长即为step=(up- low)/steps,该步骤相应的AutoLISP程序如下:

(setq funy (getstring "y=f(x)的表达式:")) (setq low(getreal "x 的下限值:"))

(setq up (getreal "x 的上限值:"))

(setq steps (getint " 剖分数目:"))

(setq step (/ (- up low) steps))

接下来就开始曲线的绘制,首先启动绘制多义线的命令,接着自变量x从下限值开始,由f(x)的表达式计算y坐标值,将该点的坐标输入到命令行,得到曲线的起点,然后自变量x 递增一个步长,计算下一个坐标点,曲线连接到该点,如此直到剖分数目结束,就完成了整个曲线的绘制,最后用一个空格退出多义线命令。相应的AutoLISP程序如下:(command "pline");启动多义线命令

(setq ii 0);循环变量ii设初值

(setq x low);自变量x设初值

(while (<= ii steps);控制循环数目

(setq y (c:cal funy));对表达式进行计算,得到y坐标值

(command (list x y));输入计算出的点坐标

(setq ii (+ 1 ii));循环变量ii增加1

(setq x (+ x step));自变量x递增一个步长

(command "");退出多义线命令

3.1.3直角坐标下参数方程曲线绘制

直角坐标下参数方程与直接函数表达不同的是,引入参变量,坐标x和y都表达为该参变量的函数,这样,能够表示的函数更灵活多样,形式如下:在曲线绘制时,只需要将变量改为参变量,坐标计算时对x、y坐标都用表达式计算即可,相应的AutoLISP程序如下:(setq ii 0);循环变量ii设初值

(setq i low) ;参变量i 设初值

(while (<= ii steps) ;循环控制

(setq x (c:cal funx)) ;由x=f(i)计算坐标x

(setq y (c:cal funy)) ;由y=g(i)计算坐标y

(command (list x1 y1)) ;向命令行输入点坐标

(setq ii (+ 1 ii)) ;循环变量ii 增加1

(setq i (+ i step)) ;参变量i 递增一个步长

3.1.4 极坐标下函数r = f(θ)曲线绘制

极坐标下函数r = f(θ)的不同之处在于输入点的坐标时,需要用极坐标输入方式,如20<30,表示极径为20,角度为30°,可以将得到的坐标值转换为字符串,再用角度符号“<”连接起来,输入到命令行。也可以用另外一个简便方法,即利用极坐标和直角坐标之间的转换关系,变换到直角坐标后输入到命令行,该方法对应的AutoLISP程序如下:(setq ii 0) (setq e low) ;设置极角θ的初始值

相关文档
最新文档