明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4735|回复: 27

关于多段线的有趣有挑战性的问题

  [复制链接]
发表于 2004-3-8 22:49:00 | 显示全部楼层 |阅读模式
如下图所示,右边的多段线图形是从左边那个图形复制出去的,求左边的图形要往右复制多长距离,复制后得到的右边的图形与左边的图形只有一个交点。(且右边的图形再往右移动的话就再也不会与左边的图形有交点。)

本帖子中包含更多资源

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

x
发表于 2011-11-1 23:27:36 | 显示全部楼层
从左图顶点为起点,沿复制移动的方向画一直线pla,pla与左图有两个交点,求出两交点坐标,两坐标距离即是所求。
回复 支持 1 反对 0

使用道具 举报

发表于 2022-6-4 16:56:34 | 显示全部楼层
自动排关注中>>>>>>>>>
发表于 2004-3-8 23:28:00 | 显示全部楼层
由于多段线形状的不确定性,我觉得问题如果用搜索法来解较直观。首先,根据多段线的尺寸选择搜索步长,然后把多段线复制后一步步往右移动,直到它们俩只有一个交点或不相交为止。
发表于 2004-3-9 07:48:00 | 显示全部楼层
先求BOX,将PL向右复制,步长为BOX底边。然后求出原PL的X最大点和复制PL的X最小点,用这两个点分别向右和左作射线,剩下的就是比较和验证几个交点了。
发表于 2004-3-9 08:29:00 | 显示全部楼层
观察了一下,我认为可以搜索一个图形其同一水平线的X最小值和最大值之差,差的最大值就是该图形该复制的距离。。。这个想法未使用数学方法证实,不知是否正确
发表于 2004-3-9 12:11:00 | 显示全部楼层
楼上的,按楼主的意思右边的图应该继续往右移,而按我的“理论”,你所示的并非X之差最大处,所以这个图并没有特殊之处


用肉眼观察,这个图形的“一个交点”应该在右边那个钩的顶点。。。
发表于 2004-3-9 18:02:00 | 显示全部楼层
对于某些特殊的情况如简单的box,这个问题就没有解。
发表于 2004-3-10 00:02:00 | 显示全部楼层
不谈图元重叠的情况,我觉得“这个值”应该是一些向外凸的点决定的,比较这些点在图形内x方向上的距离,大者即是。
发表于 2004-3-10 00:06:00 | 显示全部楼层
又想了一下,meflying的分析是对的.但是用cad编程实现起来还没想到什么好办法.
 楼主| 发表于 2004-3-10 15:14:00 | 显示全部楼层
我非常同意四楼的观点,因为我也是这么考虑的。我要写一个程序验证一下。
发表于 2004-3-11 06:43:00 | 显示全部楼层
;This routine works for plines contain no arcs only. I have modified ;mccad’s routine GETINTERPOINT here. Thanks. (defun C:GETD (/ obj vertice i ax-vertice max-width width intpts XlineObj objcopy)
(vl-load-com)
(setq AcadObject (vlax-get-acad-object)
AcadDocument (vla-get-ActiveDocument AcadObject)
mSpace (vla-get-ModelSpace AcadDocument))
(setq obj (vlax-ename->vla-object (car (entsel "\nSelect a pline: "))))
(if (= (vlax-curve-isClosed obj) nil)
(vla-put-closed obj :vlax-true))
(setq vertice (vlax-safearray->list
(vlax-variant-value (vla-get-coordinates obj))))
(setq ax-vertice '() i 0)
(repeat (/ (length vertice) 2)
(setq ax-vertice (append ax-vertice
(list (vlax-3d-point (nth i vertice) (nth (1+ i) vertice)))))
(setq i (+ i 2))
);repeat
(setq max-width 0)
(foreach vertex ax-vertice
(setq xlineobj (vla-addXline mSpace vertex
(vla-PolarPoint (vla-get-utility AcadDocument) vertex 0 1)))
(setq intpts (GetInterPoint obj xlineobj))
(vla-erase xlineobj)
(if (> (length intpts) 1)
(setq width (abs (- (car (vl-sort (mapcar 'car intpts) '<))
(car (vl-sort (mapcar 'car intpts) '>)))))
);end_if
(if (> width max-width)
(setq max-width width))
);foreach
(setq objcopy (vla-copy obj))
(vla-move objcopy (vlax-3d-point '(0 0 0)) (vlax-3d-point (list max-width 0 0)))
(princ (strcat "\nDistance to move: " (rtos max-width)))
(princ)
)
;;;;
(defun GetInterPoint (ax_ent_1 ax_ent_2 / intpoints i)
(setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
(setq intpoints (vlax-variant-value intpoints))
(if (> (vlax-safearray-get-u-bound intpoints 1) 0)
(progn
(setq intpoints (vlax-safearray->list intpoints))
(setq i 0)
(setq ptlist '())
(repeat (/ (length intpoints) 3)
(setq ptlist (append ptlist (list (list (nth i intpoints)
(nth (1+ i) intpoints)
(nth (+ i 2) intpoints)))))
(setq i (+ i 3))
);repeat
ptlist
);progn
nil
);end_if
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 05:43 , Processed in 0.199442 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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