自己编写的一个LISP有问题!哪位帮忙解决一下
刚刚开始学习LISP,自己编写的一段小程序,但是在UCS旋转的时候会在找点的时候出错!哪位帮忙完善一下! 文件在这里! 文件怎么上传呀!传上海好像不可以下载吗?那就贴出来吧!(defun c:zz (/ pt_a pt_b pt_c pt_d 1_osmode a a1 f)(setq 1_osmode (getvar "osmode"))
(setvar "osmode" 1)
(setq pt_a (getpoint "\nPlease input first point:\n"))
(setq pt_b (getpoint "\nPlease input second point:\n"))
(SETVAR "CMDECHO" 0)
;(PROMPT "\nEnter a Value:")
;(SETQ a (GETREAL))
;(setq s1 (distance pt_a pt_b))
;(setq s2 (/ s1 4))
;(setq s3 (/ s1 2))
;(setq s4 (/ s1 8))
(setq a1
(abs
(sqrt
(+
(* (- (car pt_b)(car pt_a))(- (car pt_b)(car pt_a)))
(* (- (cadr pt_b)(cadr pt_a))(- (cadr pt_b)(cadr pt_a)))
)
)
)
)
(setq a (/ a1 4))
(setq f (getpoint))
(if(=(car pt_a)(car pt_b))
(cond
((>(car f)(car pt_a))(setq a(* 1 a)))
((<(car f)(car pt_a))(setq a(* -1 a))))
(cond
((>(cadr f)(cadr pt_a))(setq a(* 1 a)))
((<(cadr f)(cadr pt_a))(setq a(* -1 a))))
)
(if (=(car pt_a)(car pt_b))(setq pt_d(list(+(car pt_b) a)(cadr pt_b) 0))
(setq pt_d(list(car pt_b)(+(cadr pt_b) a)0)))
(setq pt_c(list(/(+(car pt_a)(car pt_d))2)(/(+(cadr pt_a)(cadr pt_d))2)))
;(if (=(car pt_A)(car pt_b))(setq pt_c(list(/(+(car pt_b)(car pt_d))2))(/(+(cadr pt_a)(cadr pt_b))2)0)
;(setq pt_c(list(/(+(car pt_a)(car pt_b))2))(/(+(cadr pt_b)(cadr pt_d))2)0))
;(setq pt_cx (/(+(car pt_a)(car pt_d))2))
;(setq pt_cy (/(+(cadr pt_a)(cadr pt_b))2))
;(setq pt_c (list pt_cx pt_cy 0))
(setvar "osmode" 0)
(COMMAND "LINE" pt_a pt_d "")
(COMMAND "LINE" pt_b pt_c "")
(setvar "osmode" 1_osmode)
(setq pt_a nil)
(setq pt_d nil)
(setq pt_b nil)
(setq pt_c nil)
) 再试试! 你最好说说你程序的作用(而且出错是怎样出错也最好说出来),那样看起来会好些。。。
没仔细看,大致看出这几个问题:
两个getpoint的提示后面的\n不需要加
第三个getpoint应该加上提示
这两个问题不影响程序的运行,你可以不作修改。
你的SQRT及ABS那句有问题,SQRT返回的肯定是一个非负数,再用ABS没有必要,而里面的两个减号返回的值如果是负数,SQRT就回出错,所以这里才应该用ABS 问题出在坐标系上,在特定的坐标下没有问题,比如90°、180°、270°,当坐标系旋转后就会出现pt_b和pt_c的位置计算错误!
估计是自己的算法有问题!主要是因为以前数学没学好的缘故吧! 主要问题没有回答:
你最好说说你程序的作用(而且出错是怎样出错也最好说出来),那样看起来会好些。。。 程序的作用就是在两条平行的直线间画一个“人”字形,一共四个点,右上和右下两点由屏幕输入,另外两点通过计算得到!
现在只要当坐标系旋转的时候计算的两点就会算错!只能满足特定的角度!
不知道怎么贴图!不然就贴出来了!说不清楚呀! 写的内容上面有个文件上传,浏览你的图片,点上传,然后发表就可以贴图了
上传的文件!
页:
[1]
2