回望南山
记忆痕迹可以鲜明, 回望往事如数家珍——
posts - 177,  comments - 54,  trackbacks - 0

;;mode1
;;point in rection
;;点 P 是否在多边形 PM 内
;;If 'p' is in 'pm', return T.
;;'mx' is a very long distance.
(defun isInorOut (p pm / i p1 p2 tf tf1 tf2 px jp ret)
  (setq px (list (+ 1e+100 (car p)) (cadr p))
 p1 (last pm)
 i -1
  )


  (while (and (not ret)
       (setq p2 (nth (setq i (1+ i)) pm))
  )
    (if (setq jp (inters px p p1 p2))
      (if (equal (car jp) (car p) 0.0001)
 (setq ret t)
        (setq tf2 (if (> (cadr p1) (cadr p2)) 1 0)
       tf (if (= tf1 tf2) tf (not tf))
       tf1 tf2
        )
      )
      (setq tf1 nil)
    )
    (setq p1 p2)
  )

  (cond
    (ret 0)               ;线上
    (tf 1)                ;内
    (t -1)                ;外
  )
)


;;mode2方法2
;;点是否在多边形内 
(defun ptinpm (pt lst / i p1 p2 an anl ret)
  (setq i -1 p1 (last lst))
  (while (and (not ret)
       (setq p2 (nth (setq i (1+ i)) lst))
  )
    (cond
      ((equal p2 pt 1e-4) (setq ret t))
      (t
        (setq an (- (angle pt p1) (angle pt p2)))
        (if (equal pi (abs an) 1e-4)
   (setq ret t)
   (setq anl (cons (rem an PI) anl))
 )
      )
    )
    (setq p1 p2)
  )
  (cond
    (ret 0)               ;线上;
    (t
      (if (equal PI (abs (apply '+ anl)) 1e-4)
        1                 ;内;
        -1                ;外;
      )
    )
  )
)
 

 

 

 

 ;;test program

(DEFUN C:tt (/ Curve Pt lst a b c)
  (IF (SETQ Curve (CAR (ENTSEL "\n选择一条曲线:")))(progn
      (setq lst (MAPCAR (FUNCTION CDR)
                    (VL-REMOVE-IF (FUNCTION (LAMBDA (x) (/= 10 (CAR x)))) (entget Curve))
                )
      )
    (WHILE (SETQ Pt (GETPOINT "\n点取测试点:"))
      (setq pt (list (car pt) (cadr pt))
     c 1
      )

      (setq a (ptinpm Pt lst))
      (princ "\nxd-point_inm:")   (princ (cond ((= 0 a) "线上")
           ((= 1 a) "内")
           (t "外")))
     
      (setq a (xd-point_inm Pt lst))
      (princ "\nptinpm:") (princ (cond ((= 0 a) "线上")
           ((= 1 a) "内")
           (t "外")))
     
    )
  ))
  (PRINC)
)

posted on 2008-03-12 21:31 深藏记忆 阅读(399) 评论(2)  编辑  收藏 所属分类: Vlisp之韵

FeedBack:
# re: point in rection (点P 是否在多边形)
2008-03-13 08:50 | 老韩
真服了你了,这里写技术很好玩?我没有看你代码,我就想问一句:你是否考虑了凹多边形? 如果说你不知道我问的什么,当我没有问好了。
  回复  更多评论
  
# re: point in rection (点P 是否在多边形)
2008-03-13 10:32 | 深藏记忆

@老韩
凹凸多边形都可以的,不信你可以试试是否对凹多边形也适用呢。
  回复  更多评论
  

飘过是缘,相识最真

订阅到抓虾
google reader
gougou


点击这里给我发消息


<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(5)

随笔分类

随笔档案

文章分类

文章档案

相册

收藏夹

八面来息

天天充电

同行者

积分与排名

  • 积分 - 58700
  • 排名 - 61

最新评论

阅读排行榜

评论排行榜