明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1888|回复: 4

[求助]求多条直线交点的个数的 相关问题

[复制链接]
发表于 2009-4-9 19:36:00 | 显示全部楼层 |阅读模式

本人 不会编程 再网上找了 一个程序  是 求 直线交点个数的 程序,可是这个程序有个小的弊端,就是当多条直线交于同一点时,会分别重复计数,我的目的是重叠的交点只要记一个点的数,也就是把下面的程序里加入 过滤重叠点的 命令。希望哪位大侠帮忙改一下 ,如果另外重新写更方便的话,重写也可以。 万分感激。

下面是 程序代码:

(defun GetInterPoint (ent1 ent2 / ax_ent_1 ax_ent_2 intpoints points i)
(setq ax_ent_1 (vlax-ename->vla-object ent1)
ax_ent_2 (vlax-ename->vla-object ent2)
)
(setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
(setq intpoints (vlax-variant-value intpoints))
(setq i 0)
(if (> (vlax-safearray-get-u-bound intpoints 1) 0)
(repeat (/ (+ 1
(- (vlax-safearray-get-u-bound intpoints 1)
(vlax-safearray-get-l-bound intpoints 1)
)
)
3
)
(setq points (append points (list (list
   (vlax-safearray-get-element intpoints i)
   (vlax-safearray-get-element intpoints (+ i 1))
   (vlax-safearray-get-element intpoints (+ i 2))
   )))
)
(setq i (+ 3 i))
)
)
points
)

(defun c:main( / ss n i j ent1 ent2 points)
(setq ss (ssget))
(if ss
(setq n (sslength ss))
)
(setq i 0 j 0)
(while (< i n)
(setq j (1+ i))
(setq ent1 (ssname ss i))
(while (< j n)
(setq ent2 (ssname ss j))
(setq points (append points (getinterpoint ent1 ent2)))
(setq j (1+ j))
)
(setq i (1+ i))
)
(Princ points)
(princ (strcat "\n共有交点" (itoa (length points)) "个"))
(princ)
)

发表于 2009-4-9 20:04:00 | 显示全部楼层
试下这个吧,不过只支持二维点.
  1. (defun gp:sort-2(Lists m_max)
  2.   ;筛选,保证数据无重复,m_max是一调整间隙的变量。在此应为0。
  3.   (setq i (length lists))
  4.   (setq LNew nil)
  5.   (setq j 1)
  6.   
  7.   (while (<= j i);while start
  8.     (setq a (car lists))
  9.     (if (= a nil) (setq lists (cdr lists)))
  10.     (if (/= a nil)
  11.       (setq flag 0
  12.      ltmp (cdr lists)
  13.      m (length ltmp)
  14.      n 1 ))
  15.    
  16.     (if (/= a nil)
  17.       
  18.       (while (<= n m);while start
  19. (setq b (car ltmp))
  20. (if (and (<= (abs (- (car a) (car b))) m_max) (<= (abs (- (cadr a) (cadr b))) m_max)) ;then
  21.    (setq flag 1));end if   按间距过滤多余的直线(如果点A的X座标及Y座标与点B的X座标及Y座标之差的绝对值在间距变量之内侧过滤掉
  22. ;上一行代码为第二版修改代码
  23. (setq ltmp (cdr ltmp))
  24. (setq n (1+ n))));end while
  25.    
  26.     (if (and (/= a nil)(= flag 0)) (setq LNew (append LNew (List a))));可用元素添加到新列表
  27.     (setq j (1+ j))
  28.     (setq lists (cdr lists))
  29.   );end while
  30.   LNew;返回处理好的列表。
  31. );end function
 楼主| 发表于 2009-4-9 20:22:00 | 显示全部楼层
谢谢 我先试试看
 楼主| 发表于 2009-4-9 20:30:00 | 显示全部楼层

2楼大哥啊  小弟是文盲  不好意思  我怎么不知道 这个程序的运行命令是什么啊

麻烦你给个提示啊  谢谢

发表于 2011-11-23 10:21:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-23 12:18 , Processed in 0.152643 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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