明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2238|回复: 4

[求助]highflybir kan

[复制链接]
发表于 2006-12-10 21:25:00 | 显示全部楼层 |阅读模式
你上次写的  区域查找及foreach的妙用 这篇文章引用狂刀的那段判断点是否在面内的程序 能否贴上来给我看看 上次我下载他的只有fas文件,我想你是否能把他的整个代码贴上来给我看看 谢谢
发表于 2006-12-10 23:04:00 | 显示全部楼层

不知道你要的是不是这个

;_精确测试点与多边形的位置关系__纯lisp版__BY WKAI __晓东CAD论坛
 ;_晓东CAD论坛
 ;_200312102049(LM)
 ;_200312101730
 ;_200312101551
(defun c:tt (/  plendpt    x_lst   e   op
      n  fst_pt    int_num    online  pc
      pn  min_num    edge_int_num   pt_online_num
     )
  (setq min_num 0.0001)
  (princ "\n选择多义线:")
  (while (not e) (setq e (car (entsel))))
  (if (= "LWPOLYLINE" (cdr (assoc 0 (entget e))))
    (progn
      (redraw e 3)
      (while (not op) (setq op (getpoint "\n测试点:")))
      (foreach n (entget e)
 (if (= 10 (car n))
   (if plendpt
     (setq plendpt (append plendpt (list (cdr n))))
     (setq plendpt (list (cdr n)))
   )
 )
      )
      (setq X_lst (mapcar '(lambda (x) (car x)) plendpt))
      (setq delta_X (abs (- (apply 'max x_lst) (car op))))
      (setq plendpt   (append plendpt (list (nth 0 plendpt)))
     edge_int_num  0
     pt_online_num 0
      )
      (while (> (length plendpt) 1)
 (setq pc (nth 0 plendpt)
       pn (nth 1 plendpt)
 )
 (if (inters op
      (polar op 0 (* delta_x 2))
      pc
      pn
     )

   (setq edge_int_num (+ 1 edge_int_num))
 )
 (if (equal (angle op pc) 0 min_num)
   (setq pt_online_num (+ 1 pt_online_num))
 )
 (if (and (equal (angle op pc) 0 min_num)
   (equal (angle op pn) 0 min_num)
     )
   (setq pt_online_num (- pt_online_num 1))
 )
 (if (equal (+ (distance op pc) (distance op pn))
     (distance pc pn)
     min_num
     )
   (setq online "t")
 )
 (setq plendpt (cdr plendpt))
      )
      (redraw e 4)
      (if online
 (princ "\n在多边形的边界上.")
 (if (= (rem (+ pt_online_num edge_int_num) 2) 1)
   (princ "\n内部")
   (princ "\n外部")
 )
      )
    )
  )
  (princ)
)

发表于 2006-12-11 18:25:00 | 显示全部楼层
本帖最后由 作者 于 2006-12-11 18:52:02 编辑

tchen,很抱歉,我也没有看到拟合和样条性质的多边形的测试的源代码,看到的只是能测试直线段性质的多义线。

而且,楼上的程序同样也不能准确判断出点在曲线内或外,我搜索了各网站,没有找到完美的点在曲线内的判断程序。

我倒真的希望有人能告知是否有这样的程序能共享。在此谢谢了。

这里有一段伪代码:

1.   找出经过给出点的水平的一条线,如两边都与曲线有交点,则继续向下做,否则就是在曲线外边   
    
2.   去掉两个端点(与曲线相交的两个点),从一端开始做垂直线,如果此垂直线与曲线上下都有交点,则继续此步骤,否则就是不在曲线内部。如果直到最后也都有交点,则点在曲线内。

我想把它lisp化,(因为用奇偶数的判断得考虑一些退化情况,而且对于自相交的曲线也不能完全准确判断)。

发表于 2006-12-11 21:42:00 | 显示全部楼层

我提个思路,看成不成:

1.求点到曲线的最短距离的曲线上的点(用vlax-curve-getClosestPointTo 函数)

2.以点为中心,以两点距离为半径画圆

3.曲线,以及圆均转换成面域

4.两个面域求并集

如果并集后面积与原曲线面域面积相等,则点在曲线内,如果大于,则点在曲线外。

发表于 2006-12-11 22:11:00 | 显示全部楼层
mccad发表于2006-12-11 21:42:00我提个思路,看成不成:1.求点到曲线的最短距离的曲线上的点(用vlax-curve-getClosestPointTo 函数)2.以点为中心,以两点距离为半径画圆3.曲线,以及圆均转换成面域4.两个面域求并集如果并集后

面域都用到甘地步,吓人!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-23 12:53 , Processed in 0.179748 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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