明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2503|回复: 12

自己编写的一个LISP有问题!哪位帮忙解决一下

  [复制链接]
发表于 2004-1-1 21:20:00 | 显示全部楼层 |阅读模式
刚刚开始学习LISP,自己编写的一段小程序,但是在UCS旋转的时候会在找点的时候出错!哪位帮忙完善一下!
 楼主| 发表于 2004-1-1 21:21:00 | 显示全部楼层
文件在这里!
 楼主| 发表于 2004-1-1 21:24:00 | 显示全部楼层
文件怎么上传呀!传上海好像不可以下载吗?那就贴出来吧!(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)
)
 楼主| 发表于 2004-1-1 21:25:00 | 显示全部楼层
再试试!
发表于 2004-1-2 09:15:00 | 显示全部楼层
你最好说说你程序的作用(而且出错是怎样出错也最好说出来),那样看起来会好些。。。
没仔细看,大致看出这几个问题:
两个getpoint的提示后面的\n不需要加
第三个getpoint应该加上提示
这两个问题不影响程序的运行,你可以不作修改。

你的SQRT及ABS那句有问题,SQRT返回的肯定是一个非负数,再用ABS没有必要,而里面的两个减号返回的值如果是负数,SQRT就回出错,所以这里才应该用ABS
 楼主| 发表于 2004-1-2 23:07:00 | 显示全部楼层
问题出在坐标系上,在特定的坐标下没有问题,比如90°、180°、270°,当坐标系旋转后就会出现pt_b和pt_c的位置计算错误!

估计是自己的算法有问题!主要是因为以前数学没学好的缘故吧!
发表于 2004-1-3 11:39:00 | 显示全部楼层
主要问题没有回答:
你最好说说你程序的作用(而且出错是怎样出错也最好说出来),那样看起来会好些。。。
 楼主| 发表于 2004-1-3 22:51:00 | 显示全部楼层
程序的作用就是在两条平行的直线间画一个“人”字形,一共四个点,右上和右下两点由屏幕输入,另外两点通过计算得到!
现在只要当坐标系旋转的时候计算的两点就会算错!只能满足特定的角度!

不知道怎么贴图!不然就贴出来了!说不清楚呀!
发表于 2004-1-3 22:58:00 | 显示全部楼层
写的内容上面有个文件上传,浏览你的图片,点上传,然后发表就可以贴图了
 楼主| 发表于 2004-1-3 23:00:00 | 显示全部楼层

上传的文件!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-27 12:57 , Processed in 0.208046 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表