本帖最后由 作者 于 2006-12-23 12:30:16 编辑
我在看一本电子书的时间看到的小程序题,现在拿出来大家也练练!
答案请大家往下看,这些程序是我按书上的提示后自己又写的,如果有看过这本书的就能看出来我的程序跟书上的有些不一样! 其中第一个图对应LSP001,第二个图对应LSP002,依此往下推.现在我也刚练到第十个,再弄再发!
(defun c:lsp001(/ p1 ww hh ww3 hh2 p2 p3 p4 p5 p6 p7 p8) (setvar "osmode" 0);取消捕捉 (setvar "cmdecho" 0);取消提示 (setq p1(getpoint "\n左下角点:")) (setq ww(getdist p1 "\n宽度[100]:")) (if (null ww) (setq ww 100.0)) (setq hh(getdist p1 "\n高度[50]:")) (if (null hh) (setq hh 50.0)) (setq ww3(/ ww 3) hh2(/ hh 2) ) (setq p2(polar p1 0 ww) p3(polar p2 (/ pi 2) hh) p4(polar p3 pi ww3) p5(polar p4 (* pi 1.5) hh2) p6(polar p5 pi ww3) p7(polar p6 (/ pi 2) hh2) p8(polar p7 pi ww3) ) (command "pline" p1 p2 p3 p4 p5 p6 p7 p8 "c") (prin1) ) (defun c:lsp002(/ p1 p2 p3 p4 rr en1 en2 en3) (setvar "cmdecho" 0) (setvar "osmode" 0) (setq p1(getpoint "\n第一角点:") p3(getcorner p1 "\n另一角点:") p2(list (car p3) (cadr p1)) p4(list (car p1) (cadr p3)) rr(getdist p1 "\n圆半径<5>:") ) (if (null rr) (setq rr 5.0)) (command "circle" p1 rr) (setq en1(entlast)) (command "line" (polar p1 pi (+ rr 3)) (polar p1 0 (+ rr 3)) "") (setq en2(entlast)) (command "line" (polar p1 (* pi 1.5) (+ rr 3)) (polar p1 (/ pi 2) (+ rr 3)) "") (setq en3(entlast)) (command "copy" en1 en2 en3 "" "m" p1 p2 p3 p4 "") (princ) ) (defun c:lsp003(/ p1 p2 p3 p4 dd ang1 ang2) (setvar "cmdecho" 0) (setq p1(getpoint "\n第一角点:") p3(getcorner p1 "\n另一角点:") p2(list (car p3) (cadr p1)) p4(list (car p1) (cadr p3)) ) (command "pline" p1 p3 p2 p4 "c") (setq dd(/ (distance p1 p4) 2) ang1(angle p2 p3) ang2(angle p4 p1) ) (command "arc" p2 "e" ;|端点:|;(polar p2 ang1 dd) "a" 180;e:端点a度数p2作为起点 "arc" (polar p2 ang1 dd) "e" p3 "a" 180 "arc" p4 "e" (polar p4 ang2 dd) "a" 180 "arc" (polar p4 ang2 dd) "e" p1 "a" 180 ) (prin1) )
(defun c:lsp004(/ p1 p2 dd a1 mid h ce en1 en2 en3) (setvar "cmdecho" 0) (setvar "osmode" 0) (setq p1(getpoint "\n第一点:") p2(getpoint p1 "\n第二点:") dd(distance p1 p2) a1(angle p1 p2) mid(polar p1 a1 (/ dd 2));最早画那一边的中点 h(* (/ 1 (sqrt 3)) (/ dd 2));一边中点到图形中心的距离 ce(polar mid (+ a1 (/ pi 2)) h);整个图形的中心 ) (command "line" p1 p2 "") (setq en1(entlast)) (command "arc" p1 "e" p2 "a" 180) (setq en2(entlast)) (command "circle" "2p" "tan" mid (polar mid (+ a1 (* pi 1.5)) (/ dd 2)) ) (setq en3(entlast)) (command "array" en1 en2 en3 "" "p" ce 3 "" "") (prin1) ) (defun c:lsp005(/ p1 p2 p3 p4 p5 di12 di23 di34 di45 di51 max_dd min_dd max_pt min_pt max_pt1 min_pt1 max_pt2 min_pt2 cc) (setvar "cmdecho" 0) (setvar "osmode" 0) (setq p1(getpoint "\n起点:")) (command "pline" p1) (setq p2(getpoint p1 "\n第二点")) (command p2) (setq p3(getpoint p2 "\n第三点")) (command p3) (setq p4(getpoint p3 "\n第四点")) (command p4) (setq p5(getpoint p4 "\n第五点")) (command p5 "c") (setq di12(distance p1 p2) di23(distance p2 p3) di34(distance p3 p4) di45(distance p4 p5) di51(distance p5 p1) ) (setq cc '() cc(cons (list di12 p1 p2) cc) cc(cons (list di23 p2 p3) cc) cc(cons (list di34 p3 p4) cc) cc(cons (list di45 p4 p5) cc) cc(cons (list di51 p5 p1) cc) max_dd(max di12 di23 di34 di45 di51) min_dd(min di12 di23 di34 di45 di51) max_pt(assoc max_dd cc) max_pt1(cadr max_pt) max_pt2(caddr max_pt) max_ptm(polar max_pt1 (angle max_pt1 max_pt2) (/ max_dd 2)) min_pt(assoc min_dd cc) min_pt1(cadr min_pt) min_pt2(caddr min_pt) ) (command "arc" max_pt1 "e" max_ptm "a" 180 "arc" max_ptm "e" max_pt2 "a" 180 "arc" min_pt1 "e" min_pt2 "a" 180 ) (prin1) )
(defun c:lsp006(/ p1 p2 p3 p4 int ww hh cirl ang2 ang1) (setvar "cmdecho" 0) (setvar "osmode" 0) (setq p1(getpoint "\n第一角点:") p3(getcorner p1 "\n第二角点:") p2(list (car p3) (cadr p1)) p4(list (car p1) (cadr p3)) ) (command "rectang" p1 p3) (setq int(inters p1 p3 p2 p4)) (setq ww(distance p1 p2) hh(distance p2 p3) ang1(angle p1 p3) ang2(angle p2 p4) cirl(/ (min ww hh) 2) ) (command "circle" int cirl) (setq en1(entlast)) (command "line" p1 p3 "") (setq en2(entlast)) (command "line" p2 p4 "") (setq en3(entlast)) (command "trim" en1 "" (list en2 (polar p1 ang1 1)) (list en2 (polar p3 (+ ang1 pi) 1)) (list en3 (polar p2 ang2 1)) (list en3 (polar p4 (+ ang2 pi) 1)) "" ) (prin1) )
(defun c:lsp007(/ p1 p2 p3 p4 p5 p6 p7 p8 int ww hh cirl) (setvar "cmdecho" 0) (setvar "osmode" 0) (setq p1(getpoint "\n第一角点:") p3(getcorner p1 "\n另一角点") p2(list (car p3) (cadr p1)) p4(list (car p1) (cadr p3)) ) (command "rectang" p1 p3) (setq int(inters p1 p3 p2 p4) ww(distance p1 p2) hh(distance p2 p3) cirl(/ (min ww hh) 2) ) (if (>= ww hh);如果长大于宽则横着画 (setq p5(polar int (angle int p1) cirl) p6(polar int (angle int p2) cirl) p7(polar int (angle int p3) cirl) p8(polar int (angle int p4) cirl) ) ) (if (< ww hh);如果宽大于长则转90度 (setq p8(polar int (angle int p1) cirl) p5(polar int (angle int p2) cirl) p6(polar int (angle int p3) cirl) p7(polar int (angle int p4) cirl) ) ) (command "arc" p5 "e" p6 "r" cirl "arc" p7 "e" p6 "r" cirl "arc" p7 "e" p8 "r" cirl "arc" p5 "e" p8 "r" cirl "line" p6 p8 "" "line" p5 p7 "" ) (prin1) )
(defun c:lsp008(/ nn p1 p2 ww str_hh hh ang pbas) (setvar "cmdecho" 0) (setvar "osmode" 0) (setq nn(getint "\n阶数:")) (if (null nn) (setq nn 5)) (setq p1(getpoint "\n第一点:") p2(getpoint p1 "\n第二点:") ww(distance p1 p2) str_hh(strcat "\n高度:<" (rtos ww 2) ">:") hh(getdist p1 str_hh) ) (if (null hh) (setq hh ww)) (setq ang(angle p1 p2) pbas p2 ) (command "pline" p1 pbas) (repeat nn;循环nn次(阶数) (setq pbas(polar pbas (+ ang (/ pi 2)) (/ hh nn))) (command pbas) (setq pbas(polar pbas (+ ang pi) (/ ww nn))) (command pbas) ) (command "c") (prin1) ) (defun c:lsp009(/ p1 pr d n ang r p2 cc os cm) (setq os(getvar "osmode") cm(getvar "cmdecho") ) (setvar "cmdecho" 0) (setvar "osmode" 0);取消捕捉以免做出图不符合想像 (setq p1(getpoint "\n基准点:") pr(getpoint p1 "\n圆半径点:") d(getdist "\n圆间距:") n(getint "\n重复次数:") ) (setq ang(angle p1 pr) r(distance p1 pr) p2(polar p1 ang (* r 2)) cc 1 ) (repeat n (setvar "cecolor" (rtos cc 2 0));设置颜色 (command "circle" "2p" p1 p2) (setq p2(polar p2 ang d)) (setq cc(1+ cc));改变颜色 ) (command "circle" "2p" p1 p2) (setvar "osmode" os) (setvar "cmdecho" cm) (prin1) )
(defun c:lsp010(/ os cm ce rr n p1 ang p2) (setq os(getvar "osmode") cm(getvar "cmdecho") ) (setvar "cmdecho" 0) (setvar "osmode" 0) (setq ce(getpoint "\n中心:") rr(getdist ce "\n半径:") n(getint "\n等分数:") ) (if (null rr) (setq rr 50)) (if (null n) (setq n 10)) (setq ang(/ pi n 0.5) p1(polar ce 0 rr) p2(polar ce ang rr) ) (command "pline" ce p1 "a" "a" 180 p2 "") (command "array" (entlast) ce "" "p" ce n "" "") (setvar "osmode" os) (setvar "cmdecho" cm) (prin1) )
(defun c:lsp011(/ cm os ce r1 r2 n p0 p1 p2 ang) (setq cm(getvar "cmdecho") os(getvar "osmode") ) (setvar "osmode" 0) (setvar "cmdecho" 0) (setq ce(getpoint "\n中心点:") r1(getdist ce "\n小圆半径:") r2(getdist ce "\n大圆半径:") n(getint "\n等分数:") ) (if (null n) (setq n 10)) (if (>= r1 r2) (alert "错误:小圆半径大于大圆,请重输入!!")) (if (< r1 r2) (progn (setq ang(/ pi n 0.5) p0(polar ce 0 r1) p1(polar ce 0 r2) p2(polar ce ang r2) ;这是多余的程序,本不需要这句p3(polar ce ang r1) ) (command "circle" ce r1) (command "pline" p0 p1 "a" "a" 180 p2 "") (command "array" (entlast) ce "" "p" ce n "" "") ) ) ) (defun c:lsp012(/ cm os ce r1 en1 ce2 r2 nn ang angdd ang ang1 ang2) (setq cm(getvar "cmdecho") os(getvar "osmode") ) (setvar "osmode" 0) (setvar "cmdecho" 0) (setq ce(getpoint "\n中心点:") r1(getdist ce "\n大圆半径:") ) (command "circle" ce r1) (setq en1(entlast)) (command "circle" ce "d" r1) (setq ce2(polar ce 0 r1) r2(getdist ce2 "\n小圆半径:") nn(getint "\n重复次数:<8>") ) (if (null nn) (setq nn 8)) (setq ang 0 ss (ssadd)) (setq angdd(/ (* pi 2) nn)) (repeat nn (command "circle" ce2 r2) (setq ss(ssadd (entlast) ss)) (setq ang(+ ang angdd)) (setq ce2(polar ce ang r1)) ) (setq ang 0) (repeat nn (command "trim" ss "" (polar ce ang r1) "");剪切时选中小圆圆心 (setq ang(+ ang angdd)) ) (setq ang1(/ angdd -2.0) ang2 (+ ang1 angdd) ang 0 ) (repeat nn (command "trim" (polar ce ang1 r1) (polar ce ang2 r1) "" (polar ce ang (- r1 r2)) "" ) (setq ang1(+ ang1 angdd) ang2 (+ ang2 angdd) ang (+ ang angdd) ) ) (setvar "osmode" os) (setvar "cmdecho" cm) (prin1) )
|