明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2025|回复: 15

[求助]请狂刀 (无痕?)兄帮我解释下你这个函数怎么理解!!!

  [复制链接]
发表于 2008-5-17 12:16 | 显示全部楼层 |阅读模式

;判断点是否在多边形内

(defun C:te2 (/ olderr en errmsg oldmode oce sl ss ss1 ename t0 ptlist pp)
  ;;定义错误函数和预处理--------------------
 (vl-load-com)
  (setvar "errno" 0)
  (setq olderr *error*)
  (defun *error* (msg)
    (setq en (getvar "errno"))
    (setq errmsg (strcat "errno=" (itoa en) "\nError:" msg))
    (alert errmsg)
    (setq *error* olderr)
  )
  (graphscr)
  (setq oldmode (getvar "osmode"))
  (setq oce (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (command ".ucs" "W")
  ;;也可以用其他方式取得点集----------------
  (setq sl '((0 . "POINT")))
  (setq ss (ssget sl))
  (setq t0 (getvar "TDUSRTIMER"))
  (setq ptlist (getpt ss))
  (princ "\n构造点集用时")
  (princ (* (- (getvar "TDUSRTIMER") t0) 86400))
  (princ "秒")
  (command "_.change" ss "" "P" "C" "BYL" "")
  (princ "\n请选择多边形:")
  (setq ss1 (ssget ":S" '((-4 . "<OR")(0 . "POLYLINE")(0 . "LWPOLYLINE")(-4 . "OR>"))))
  (setq ename (if (= ss1 nil) nil (ssname ss1 0)))
  (if (= ename nil)
    (progn
      (alert "你没有选择多边形!")
      (command ".ucs" "P")
      (setvar "osmode" oldmode)
      (setvar "cmdecho" oce)
      (princ)
    )
    (progn
      (setq pl (xdl-pl-vertexs ename))
      ;;查找区域中的点并对用时进行估算------
      (setq t0 (getvar "TDUSRTIMER"))
      (setq pp (search ptlist pl))
      (princ "\n查找点用时")
      (princ (* (- (getvar "TDUSRTIMER") t0) 86400))
      (princ "秒")
      (if (= nil pp)
 (progn
   (alert "在这个区域没有点集中的点!")
   (command ".ucs" "p")
   (setvar "osmode" oldmode)
   (setvar "cmdecho" oce)
   (princ)
 )
 (progn
   ;;改变查找出来的点的颜色为红色----
   (setvar "osmode" 0)
   (setq t0 (getvar "TDUSRTIMER"))
   (change-color ss pp 1)
   (princ "\n点变色用时")
   (princ (* (- (getvar "TDUSRTIMER") t0) 86400))
   (princ "秒")
   (command ".ucs" "P")
   (setvar "osmode" oldmode)
   (setvar "cmdecho" oce)
   (princ)
 )
      )
    )
  )
)
;;;*****************************************
;;;定义查找函数2,并获得每个点的坐标和原编号
(defun search (ptlist pl / pp ex)
  (setq pp nil)
  (foreach n ptlist
    (if (ptinpm n pl)
      (setq pp (cons n pp))
    )
  )
  pp
)
;;;*****************************************
;;依据晓东网站的代码改写而成的取点函数------
(defun getpt (ss / i listpp a b c)
  (setq i 0 listpp nil)
  (if ss
    (repeat (sslength ss)
      (setq a (ssname ss i)
     b (entget a)
     c (cdr (assoc 10 b))
     c (list (car c) (cadr c) i)
      )
      ;;i用来定义在选择集中的编号,不是Z坐标
      (setq listpp (cons c listpp))
      (setq i (1+ i))
    )
  )
  (reverse listpp)
)
;;定义改变查找到的点的颜色的函数------------
(defun change-color (ss pp color / i)
  (setq i 0)
  (foreach n pp
    (setq a (ssname ss (caddr n)))
    (setq b (entget a))
    (setq b (cons (cons 62 color) b))
    (entmod b)
  )
)
;;取得多边形顶点------------------感谢eachy!
(defun xdl-pl-vertexs (e / n lst)
  (if (= e nil)
    nil
    (progn
      (setq lst
 (repeat (setq n (fix (1+ (vlax-curve-getendparam      (vlax-ename->vla-object  e)))))
   (setq lst (cons (vlax-curve-getpointatparam (vlax-ename->vla-object  e) (setq n (1- n))) lst))
 )
      )
      (if (= 0 (cdr (assoc 70 (entget e))))
 lst
 (cdr lst)
      )
    )
  )
)
;;判断点是否在多边形内-------------感谢狂刀!
(defun ptinpm (pt lst) 
   (equal
     PI
     (abs
       (apply
  '+
  (mapcar '(lambda (x y)  (rem (- (angle pt x) (angle pt y)) PI))

    (reverse (cdr (reverse (cons (last lst) lst)))) 
   lst
  )
       )
     )
     1e-6
   )
)

程序如上:

但是本人对狂刀兄的这个函数百思不得其解,按照我对函数实现的理解是把所有相邻顶点和要测试的点形成的夹角取和,

问题是取和之后怎么会是等于PI呢?表面上看取和等于2PI(也就是360度)实际上很多情况也不会等于2PI。我硬是没想通!

发表于 2008-5-17 19:13 | 显示全部楼层
我也没想通,"感谢狂刀!"不是狂刀写的吧? 要是的话,怎么会自己感谢自己呢
 楼主| 发表于 2008-5-17 19:47 | 显示全部楼层
本帖最后由 作者 于 2008-5-17 21:27:31 编辑

这个是别人引用的代码啊

发表于 2008-5-17 20:11 | 显示全部楼层
楼上:讲话不要太过激。看清楚点,2楼不是版主。
 楼主| 发表于 2008-5-17 21:28 | 显示全部楼层
本帖最后由 作者 于 2008-5-18 20:04:33 编辑

怎么这么多狂刀无痕 还有盗版?

发表于 2008-5-18 09:46 | 显示全部楼层

并不是等于PI,而是取PI的余数

 楼主| 发表于 2008-5-18 12:16 | 显示全部楼层

看来暂时还没人能解答。。。。。。。。。。

这么多版主帮看看啊,无语了。。。。。。。。。。

发表于 2008-5-18 13:22 | 显示全部楼层
本帖最后由 作者 于 2008-5-19 0:12:26 编辑

角度差求余之和的绝对值 = PI

你可能是想当然 了,如上图 p1p3减去p1p2的角度,不是63°,而是

(- 28 (- 360 35)) = -297 rem 180(即PI)后 为 -117
其余角度和 为 (- 360 63) = 297
297-117 = 180 (即PI)

本帖子中包含更多资源

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

x
 楼主| 发表于 2008-5-18 19:49 | 显示全部楼层
本帖最后由 作者 于 2008-5-18 20:03:39 编辑

  字面我也能看懂 问题是为什么会等于PI呢? 对于有些多边形(存在包角情况)夹角之和并不等于2PI,我现在就是看不懂这个!

看来解铃还须系铃人! 只有等无痕版主了!!

我附上截图大家看看!

我附的这个图是我把中间那个点和所有边界的顶点连接起来的,大家仔细看相邻顶点所成的夹角存在包角的情况,所以狂刀写的这个函数的实现原理我就搞不懂了!

本帖子中包含更多资源

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

x
 楼主| 发表于 2008-5-19 17:40 | 显示全部楼层
本帖最后由 作者 于 2008-5-19 20:45:41 编辑

狂刀无痕  你看看我贴的CAD图 对于这种带包角的 这段函数为什么还能成立呢?

我想问的问题是他的这个函数是根据什么算法思想!

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

本版积分规则

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

GMT+8, 2024-5-2 07:35 , Processed in 0.365587 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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