找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1579|回复: 3

[LISP函数]:计算到指定点指定距离的点的点位

[复制链接]

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-8-22 15:47:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×

  1. ;;;=================================================================
  2. ;;;计算到指定点指定距离的点的点位                                   
  3. ;;;参数:lst --- 格式为 ((pt1 d1) (pt2 d2) ...)                     
  4. ;;;      pt  --- 参考值,若结果有多个,                             
  5. ;;;                      则只返回距 pt 最近的那个点                 
  6. ;;;返回值:若成功则返回点位;若不成功则返回 nil                     
  7. ;|;;备忘:                                                         
  8.         1、若lst中只有一个,且有pt则返回:                          
  9.                         (polar pt1 (angle pt1 pt) d1)               
  10.         2、若有两个,则计算出两个结果点位后,                       
  11.                        若有pt 则过滤;若无 pt 则返回两个点。        
  12.         3、若有三个及以上,则先计算三个,找出一个点位,            
  13.            进而复核后面的,当有任何一个不满足时,返回 nil           
  14.            若全部满足,则返回 结果点位。                           
  15. ;;|;
  16. (defun JS-PT-DIST (LST PT / PT1 PT2 D1 D2 D ANG ANG1 PT_LST)
  17.     (cond
  18.         ;;
  19.         ((= LST NIL)
  20.          NIL
  21.         )
  22.         ;;
  23.         ((= (length LST) 1)
  24.          (if PT
  25.              (progn
  26.                  (setq LST (car LST)
  27.                        PT1 (car LST)
  28.                        D1  (cadr LST)
  29.                  )
  30.                  (polar PT1 (angle PT1 PT) D1)
  31.              )
  32.              NIL
  33.          )
  34.         )
  35.         ;;
  36.         ((= (length LST) 2)
  37.          (setq PT1 (car (car LST))
  38.                D1  (cadr (car LST))
  39.                PT2 (car (cadr LST))
  40.                D2  (cadr (cadr LST))
  41.          )
  42.          (setq D   (distance PT1 PT2)
  43.                ANG (angle PT1 PT2)
  44.          )
  45.          ;;判断是否能够构成几何图形
  46.          (if (or (< (+ D1 D2) D)
  47.                  (< (+ D1 D) D2)
  48.                  (< (+ D2 D) D1)
  49.              )
  50.              NIL
  51.              (progn
  52.                  (setq ANG1 (ACOS (/ (- (* D2 D2) (* D1 D1) (* D D))
  53.                                      (* -2.0 D1 D)
  54.                                   )
  55.                             )
  56.                  )
  57.                  ;;清空lst表,装进结果点位
  58.                  (setq LST '()
  59.                        LST (cons (polar PT1 (+ ANG ANG1) D1) LST)
  60.                        LST (cons (polar PT1 (- ANG ANG1) D1) LST)
  61.                  )
  62.                  (if PT
  63.                      ;;比较位置,看哪一个点离 pt 更近
  64.                      (if (< (distance (car LST) PT)
  65.                             (distance (cadr LST) PT)
  66.                          )
  67.                          (car LST)
  68.                          (cadr LST)
  69.                      )
  70.                      LST
  71.                  )
  72.              )
  73.          )
  74.         )
  75.         ;;
  76.         ((>= (length LST) 3)
  77.          ;;先计算前两个点的返回值
  78.          (if (setq PT_LST (JS-PT-DIST (list (car LST) (cadr LST)) NIL))
  79.              (progn
  80.                  ;;若有结果,则检查是否也满足后面的要求
  81.                  (foreach N (cddr LST)
  82.                      (if (and PT_LST
  83.                               (equal (cadr N)
  84.                                      (distance (car N) (car PT_LST))
  85.                                      1e-10
  86.                               )
  87.                          )
  88.                          ()
  89.                          (setq PT_LST (cdr PT_LST))
  90.                      )
  91.                  )
  92.                  (if (and (= (length PT_LST) 2)
  93.                           PT
  94.                      )
  95.                      ;;比较位置,看哪一个点离 pt 更近
  96.                      (if (< (distance (car PT_LST) PT)
  97.                             (distance (cadr PT_LST) PT)
  98.                          )
  99.                          (car PT_LST)
  100.                          (cadr PT_LST)
  101.                      )
  102.                      (car PT_LST)
  103.                  )
  104.              )
  105.              NIL
  106.          )
  107.         )
  108.     ) ;_结束cond
  109. ) ;_结束defun
  110. ;;;=================
  111. ;;;测试
  112. ;;;(JS-PT-DIST '(((0 0)80) ((100 0)60)) '(80 80))
  113. (defun C:TT (/ D1 D2 PT PT1 PT2)
  114.     (if        (and (setq PT1 (getpoint "\n第一点: "))
  115.              (setq D1 (getdist PT1 " >>>距离: "))
  116.              (setq PT2 (getpoint "\n第二点: "))
  117.              (setq D2 (getdist PT2 " >>>距离: "))
  118.              (setq PT (getpoint "\n参考点: "))
  119.         )
  120.         (princ (JS-PT-DIST (list (list PT1 D1) (list PT2 D2)) PT))
  121.     )
  122.     (princ)
  123. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-9-3 10:39:52 | 显示全部楼层
噢。。下载来看看先呵呵
谢谢了。。呵呵。。。。。。。。。。。。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-9-12 09:56:09 | 显示全部楼层
不知所言,到指定点指定距离的点不是一个圆吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2007-9-12 11:34:32 | 显示全部楼层
回复楼上:距离不一定相等。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-13 13:51 , Processed in 0.178820 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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