找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: litss

[编程申请]:如何判别重叠的两个矩形

[复制链接]
 楼主| 发表于 2005-12-10 16:42:13 | 显示全部楼层
to xyp1964斑竹:
1、这个字体是我自己为结构方便,在romand基础上修改的,跟这个话题没什么关系的。:)
2、不区分节点数量我觉得应该是可行的,只是还需要再仔细考虑一下。
3、呵呵,我的程序确实是有问题的。而且我感觉主要问题在sub4上。但因为是自己编的,很难看出问题在哪里。所以贴出来求帮助。sub4的初衷是用来找到x (y)值最小或最大的两个点的。不知道为什么经常会找不准:(

to 狂刀:
这个问题确实没什么通用性。如果只是为了实现,完全可以象xyp1964斑竹提供的方法那样求解。只是觉得好玩嘛,而且既然自己提出问题了,就想把它搞好一点。多多帮忙啦
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

 楼主| 发表于 2005-12-11 00:41:20 | 显示全部楼层
:)斑竹说的对
我也发现这个问题了。下边这句应该改成(equal x x x),应该加个精度。
(if (= (nth axi (nth n ptn)) (nth axi (nth n0 ptn)))
(if (/= n n0)
(setq n1 n)
不过问题还是没有完全解决:(

);if
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-12-11 01:10:28 | 显示全部楼层
一个思路:

求Pline的Box,判断Box内有几个Pline的点,

1 当有一个点时为“L”形,求Box中一角点(非Pline上)的对角点
2 当有两个点时为“T”形,用其中一点向边(Box点且在Pline上)求 Inters;
3 4个点时为“十”字形,即为相交区域。

当绘图不精确时,要进行精度处理

下面的程序还缺少对Pline顶点的预处理,包括去除重复点、多余节点。楼主的应用有特殊性,所以下面的程序也仅适用楼主所示意的正放的“L”“T”“+”形状的多段线。

命令:Plun
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-12-11 18:33:05 | 显示全部楼层
那天没贴上来:

求最左边的两点和最右面的两点,取距离小,这两点在对边的垂直点.共四个点,作矩形.
求最下面 .....

两个矩形求交就可以.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-11 22:20:42 | 显示全部楼层
1) eachy斑竹的方法很新颖,是我没想到过的。程序测试过,可用。:)

2) aeo斑竹所说的方法就是我的程序的基本思路。我的那个子程序sub4就是用来找到最左边,最右边,最上边,最下边的两个点的(其中axi参数是用来控制x,y轴的。cp是用来控制找最小,还是最大值的)。而且对同一边(比如最左边)的点,如果找到的点数超过两个,取距离最远的一对就行(当然,这段程序在我贴出来的帖子上还没有补上)。用这种方法基本上就可以不考虑实际pline上到底有几个节点了。即使同一直线段上有超过两个节点也不影响结果。这也是我能想到的最简单的方法了。只是我的程序可能写得不够简洁、规范。

以下是根据eachy斑竹提示的精度问题修改后的程序。基本测试通过。此程序还缺少对多余点,重合点的处理,有待改进。但具体处理思路已作说明,应该不难实现。
[php]
(defun c:test (/ e i pt ptn )
  (SETVAR "OSMODE" 0)
  (setq e (vlax-ename->vla-object (car (entsel "\请选择多义线: ")))
        i -1
        ptn '()
  )
  (while (setq pt (vlax-curve-getPointAtParam e (setq i (1+ i))))
    (setq ptn (cons pt ptn))
  )
  (sub ptn)
)
(defun sub (ptn / n0 n1 n2 n3 pnum pt0 pt1 pt2 pt3 ptn)
  (setq pnum (sub4 ptn 0 -1))
  (setq n0 (nth 0 pnum))
  (setq n1 (nth 1 pnum))
  (setq pnum (sub4 ptn 0 1))
  (setq n2 (nth 0 pnum))
  (setq n3 (nth 1 pnum))
  (if (< (cadr (nth n0 ptn)) (cadr (nth n3 ptn)))
    (setq pt0 (list (car (nth n0 ptn)) (cadr (nth n3 ptn))))
    (setq pt0 (nth n0 ptn))
  );if
  (if (> (cadr (nth n2 ptn)) (cadr (nth n1 ptn)))
    (setq pt2 (list (car (nth n2 ptn)) (cadr (nth n1 ptn))))
    (setq pt2 (nth n2 ptn))
  );if
  (command "-color" "1")
  (command "rectang" pt0 pt2);com
  (setq pnum (sub4 ptn 1 -1))
  (setq n0 (nth 0 pnum))
  (setq n1 (nth 1 pnum))
  (setq pnum (sub4 ptn 1 1))
  (setq n2 (nth 0 pnum))
  (setq n3 (nth 1 pnum))
  (setq pt1 (list (max
                    (car (nth n0 ptn))
                    (car (nth n3 ptn))
                  ) (min
                      (cadr (nth n0 ptn))
                      (cadr pt0)
                    )
            )
  )
  (setq pt3 (list (min
                    (car (nth n1 ptn))
                    (car (nth n2 ptn))
                  ) (max
                      (cadr (nth n2 ptn))
                      (cadr pt2)
                    )
            )
  )
  (command "-color" "2")
  (command "rectang" pt1 pt3);com

)
(defun sub4 (ptn axi cp / n n0 n1 nt pnum);;&frac12;&Uacute;&micro;&atilde;&Aring;&Aring;&ETH;ò
  (setq n (vl-list-length ptn))
  (setq n0 0)
  (setq n1 0)
  (while (> (setq n (1- n))
            0
         )
    (if (> (* cp (nth axi (nth n ptn))) (* cp (nth axi (nth n0 ptn))))
      (setq n0 n)
    )
  )
  (setq n (vl-list-length ptn))
  (while (> (setq n (1- n))
            -1
         )
    (if (equal (nth axi (nth n ptn)) (nth axi (nth n0 ptn)) 5)
      (if (/= n n0)
        (setq n1 n)
      );if
    );if
  );while
  (setq axi (abs (- axi 1)))
  (if (> (* cp (nth axi (nth n1 ptn))) (* cp (nth axi (nth n0 ptn))))
    (progn
      (setq nt n1)
      (setq n1 n0)
      (setq n0 nt)
    );progn
  );if
  (setq pnum (list n0 n1))
  pnum
)[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-11 23:31:55 | 显示全部楼层
“异形柱标注程序”修改版,适合任意倾斜的情况:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-12-12 09:39:43 | 显示全部楼层
呵呵,xyp1964斑竹的程序更狠:)

是不是通过改ucs实现的?我昨晚也想这么试验的。取pline线上(nth 0 ptn)和(nth 1 ptn)两点连线做为参考,改当前ucs,然后重新获得pline线的新坐标(因为自己换算坐标太麻烦了),接着进行处理。可惜程序运行不成功:(

不知道是不是这个方法不对。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-12-12 16:54:27 | 显示全部楼层
to 狂刀:现在讨论的确实只有T,十,L三种。对于一字形的。我通过附加一段代码,判断两个矩形是否重叠实现了。

to 它山之石:确实还有z字形的柱子。不过z字形的可能性太多,见附图(也许实际不会有这么多种形状,但我喜欢尽可能的考虑得完整些)。我实在想不出好的办法来处理,只好不考虑了。不知道大家有没有好的建议?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-12-12 22:27:43 | 显示全部楼层
呵呵,我也没有存心要折腾大家的意思。只是觉得这个问题可能有点意思。平时都是想如何去组合,现在考虑一下拆分嘛。因为我没正儿八经学过编程,这一年多来基本上都是在模仿论坛上高手们的程序,自己瞎写一气,所以也想趁这个机会学学大家的编程思路和写程序的风格,看看自己有没有走弯路。

不知道狂刀兄有没有更好的想法呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-12 23:30:32 | 显示全部楼层
这段工作太忙,脑子不灵光了,有空我也想想吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 22:07 , Processed in 0.213520 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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