14.14 polar与sqrt函数
1.polar函数
Polar函数利用相对于给定点的角度及距离定义一个点(见图12-11)。该角度以弧度表示,逆时针方向为正(假定angbase及angdir均为默认设置)。
polar函数的格式为:(polar point angle distance)
其中Point………………参照点
angle……………...对于参照点的角度
distance………...…与参照点间的距离
示例:
(Polar pt1 ang dis)
(setq pt2(polar pt1 ang dis))
(setq pt2(polar‘(2.0 3.25)ang dis))
2.Sqrt函数
sqrt函数计算一个数的平方根,且其返回值总为实数。sqrt函数的格式为:(sqrt number)
其中 number............待求平方根的数(实数或整数)
如图12-12所示,应用sqrt函数:(setq hyp(aqrt(+(* base base)(“ht ht))))
示例:
(sqrt 144) 返回12.0
(sqrt 144.0) 返回12.0
(setq x(sqrt 57.25)) 返回7.566373
(setq x(sqrt(* 25 36.5))) 返回30.207615
(setq x(sqrt(/ 7.5(cos 0.75)))) 返回3.2016035
(setq hyp(sqrt(+(* base base)(* ht ht))))
例4 编写一个AutoLISP程序,该程序可以画出一个等边三角形及其内切圆(见图12-13)。该程序还应提示用户输入圆的半径及圆心。
下面的文件为例4的程序清单。
(defun dtr(a)
(*a( Pi 180.0))
)
(〔defun c:trgcir(/ r c d p1 p2 p3)
(setvar“cmdecho”0)
(graphscr)
(setq r(getdist“\n Enter circle radius:\")
(setq c(getPoint“\n Enter center of circle:\"))
(setq d(/r(sin(dtr 30))))
(setq P1(Polar c(dtr 210)d))
(setq P2(Polar c(dtr 330)d))
(set P3(Polar c(dtr 90) d))
(command“circle” c r)
(Command“line” p1 p2 p3“c”)
(setval“cmdecho”1)
(princ)
)
练习3
编写一个AutoLISP程序,画出一个等腰三角形P1,P2,P3,三角形的底边(P1,P2)与正X轴之间有一个夹角B(见图12-14)。该程序还应提示用户输入起点P1,L1的长度及角A和角B。
练习4
编写一个程序,画出一个带中心线的键槽。该程序还应提示用户输入键槽的长度,宽度及中心线的图层名(见图12-15)。
14.15 itoa、rtos、strcase及prompt函数
1.itoa函数
itoa函数将一个整数转换成字符串,并将该字符串返回。
itoa函数的格式为:(itoa number)
其中number………待转换为字符串的整数
示例:
(itoa 89)返回“89\"
(itoa -356)返回“-356”
(setq intnum 7)
(itoa intnum)
(setq intnum 345)
(setq intstrg(itoa intnum))
2.rtos函数
rtos函数将一个实数转换成字符串,并将该字符串返回。
rtos函数的格式为:(rtos realnum)
其中 alnum………待转换为字符串的实数
示例:
(rtos 50.6)返回“50.6”
(rtos -30.0)返回“-30.0\"
(setq realstrg(rtos 5.25))返回“5.25”
(setq realnum 75.25)
(setq realstrg(rtos realnum))返回“75.25”
rtos函数还可以带有mode和precision参数。带有mode和precision参数的rtos函数格式为:
(rtos realnum[mode][precision])
其中 realnum…......…......实数
mode…………............单位模式,如decimal, scientific
precision…......……数字精度
3.strcase函数
strcase函数将字符串中的字符转换为大写形式或小写形式。
其格式为:(strcase string[true])
其中string………待转换大小写的字符串
true………...若其值不为nil,则所有字符转换为小写形式
true是可选项。若省略或其值为nil,字符串将转换为大写形式,若其值不为nil,字符串将转换为小写形式。
示例:
(strcase“welcome Home”) 返回“WELCOME HOME”
(setq t 0)
(strcase“Welcome Home” t) 返回“welcome home
(setq answer(strcase(getstring“Enter Yes or No:”)))
4.prompt函数
prompt函数用于在屏幕的命令提示区内显示消息,该消息的内容必须置于双引号中。Prompt
函数的格式为:(prompt message)
其中message………..要显示在屏幕上的消息
示例:
(prompt“Enter circle diameter:”)
(setq d(getdist(prompt“Enter circle diameter:”)))
注意 在双屏幕系统中,prompt函数在两个屏幕上均显示消息。
例5
编写一个程序,画出半径分别为rl和r2的两个圆,用来表示间距为d的两个皮带轮。连接两圆圆心的直线与X轴成一个夹角,如图12-16所示。
输入 输出
小圆的半径rl 半径为rl的小圆
大圆的半径r2 半径为r2的大圆
圆间距离d 两圆的公切线
中心线倾角a
小圆的圆心c1
处理过程
1.计算X1、X2的长度
2.计算角度ang
3.根据c1点确定c2点
4.确定点P1,P2,P3,P4
5.以c1为圆心,r1为半径画出小圆
6.以c2为圆心,r2为半径画出大圆
7.画出P1 到P2,P3到P4的直线
计算过程
X1=r2-r1
X2=sqrt[d^2-(r2-r1)^2]
tan ang=X1/X2
ang=atan(x1/x2)
ala=90+a+ang
alb=270+a ang
a2a=90+a+ang
a2b=270+a ang
下面的文件为例5的AutoLISP程序清单;
(defun dtr(a)
(* a (/ pi 180.0))
)
(defun c:belt(/r1 r2 d a c1 xl x2 c2 pl p2 p3 p4)
(setVar“cmdecho”0)
(graphscr)
(setq r1(getdist“\n Enter radius of small pulley:\"))
(setq r2(getdist“\n Enter radius of large pulley:\"))
(setq d(getdist“\n Enter distance between pulleys:”)
(setq a(getangle“\n Enter angle of pulleys:”)
(setq c1(getpoint“\n Enter center of small pulleys:”)
(setq x1(-r2 r1))
(setq x2(sqrt(-(* d d)(*(-r2 r1)(-r2 r1)))))
(setq ang(atan (/ xl x2)))
(setq c2(polar (c1 a d))
(setq pl(polar c1(+ ang a (dtr 90)) rl))
(setq p3(polar c1(-(+ a dtr(270)) ang)rl))
(setq p2(Polar c2(+ ang a dtr(90)) r2))
(Setq p4(polar C2(-(+ a (dtr 270) Ang)r2))
(command“circle” c1 p3)
(command“circle” c2 p2)
(command“line” pl p2“”)
(command“line” p3 p4“”)
(setvar“cmdecho ”1)
(Princ))
说明
第1行:(defun dtr(a)
本行中,defun函数定义了一个用于将角度转换为弧度的函数dtr(a)。
第2行: (* a (/ pi 180.0))
(/Pi 180)将Pi的值除以180,得到的结果再与角a相乘(180度等于Pi弧度)。
第4行:(defun c:belt(/r1 r2 d a c1 xl x2 c2 pl p2 p3 p4)
本行中,defun函数定义了一个函数。c:belt,该函数用于生成带公切线的两个圆。
第12行:(setq x1(-r2 r1))
本行中,setq函数将r2-r1的值赋予变量xl。
第13行:((setq x2(sqrt(-(* d d)(*(-r2 r1)(-r2 r1)))))
本行中,(- r2 rl)用r2减去r1,(*(- r2 r1)( r2 r1))计算(- r2 r1)的平方。
(sqrt(-(* d d)(*(-r2 r1)(-r2 r1))))则计算该差的平方根,Setq x2该表达式的结果赋予变量x2
第14行:(setq ang(atan(/ x1 x2)))
本行中,(atan(/xl x2)以算(/ x1 x2)结果的反正切。Setq ang将以弧度表示的角度值赋予变量ang.
第15行:(setq cZ(polar c1 a d))
本行中,(polar c1 a d)使用polar函数确定c2点的位置,该位置是由相对于c1点的距离d及与正X轴的夹角a来确定的。
第16行:(setq pl(polar c1(+ ang a(dtr 90))rl))
本行中,(polar c1(+ ang a(dtr 90))rl)确定pl点位置,该位置是由相对于c1点的距离r1及与正X轴的夹角(+ ang a(dtr 90))来确定的。
第20行:(command“circle” c1 p3)
本行中,command函数使用AutoCAD的CIRCLE命令,以c1为圆心,P3点定义的距离为半径画圆。
第22行:(command“line” pl P2“”)
本行中,command函数使用AutoCAD的LINE命令从P1到P2画一条直线。结尾的一对双引号(“”)表示返回,用于终止LINE#令。
练习5
编写一个AlltOLISP程序,画出两个圆及它们的内公切线,如图12-17所示。该程序还应提示用户输入圆的直径及两个圆的中心距。

