已知多個線段,如何判斷這些線段構成的形狀是封閉的?

aiur 2001-11-14 09:27:51
我在編程中遇到這個問題,還好這些線段都是水平或垂直的.
如果是封閉的,如何把這些線段構成的多邊形分解成多個矩形呢?
還請各位高手賜教,謝謝
...全文
1043 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jrju 2001-11-15
  • 打赏
  • 举报
回复

谢谢aiur(我这个你不爱的人), 初来此地,这是我挣的第一笔分
aiur 2001-11-15
  • 打赏
  • 举报
回复
再次感謝jrju和frman的關注,您讓我受益匪淺.
結帖,給分
jrju 2001-11-15
  • 打赏
  • 举报
回复

其实如果把直线看成是宽度为0的矩形

注意:应向左右寻找边界,画水平线填充,而不是向上下寻找边界画垂直线。
在任何计算机的图形系统中画水平线都比画其它直线要快好多倍。
jrju 2001-11-15
  • 打赏
  • 举报
回复

注意:应向左右寻找边界,画水平线填充,而不是向上下寻找边界画垂直线。
在任何计算机的图形系统中画水平线都比画其它直线要快好多倍。
jrju 2001-11-15
  • 打赏
  • 举报
回复
aiur(我这个你不爱的人):

我上面所讲的都是关于矢量图形系统的(如AutoCAD),如果是填充屏幕上的一任意
封闭的区域,有种方法更简单、方便、快速,在大多数计算机图形学的书里都有介绍:

1)在区域内部任选一点,找到其找到其左、右最直接的边界,在左右两点间画直线
2)该线将区域分成两部分,用递归的方法分别对这上下两部分处理。
说明:第一个点可任选(如有个已知的边界内的点更好),其余的点可根据当前情况
简单选取

填充矩形也是由画一系列直线来完成的。所有的图形系统对画直线的函数都做了最优化
设计,因此以上方法只会比分割成矩形填充快,且无须烦琐地分割矩形。


aiur 2001-11-15
  • 打赏
  • 举报
回复
非常非常感謝 jrju和frman(自由無限)的解答,小弟感激不盡,一定給分.
我現在是做 一個類似于以前8位機上的經典遊戲QIX.
涉及到一些算法:
判斷多條線段構成的圖形是否是封閉區域,如是,則填充顏色(由於是在j2me環

境下編程,所以,必須把多邊形分割成多個矩形,然後填充各矩形顏色,j2me里只有

填充矩形的函數,而不能分割成三角形填充.計算多邊形面積)
某點是否在多邊形外(jrju已說明,以前的帖子讓我受益匪淺)
運動中的某點是否在多邊形一線段上(jrju已說明)
jrju 2001-11-15
  • 打赏
  • 举报
回复
判断两线段是否相交的新算法,可能更简单些:
设线段一的端点为(m1,n1),(m2,n2), 所在直线放程为:ax+by+c=0
线段二的端点为(m3,n3),(m4,n4), 所在直线放程为:dx+ey+f=0
判断方法如下:
if (d*m1+e*n1+f)*(d*m2+e*n2+f)>0 then
两线段不相交
else
if(a*m3+b*n3+c)*(a*m4+b*n4+c)>0 then
两直线不相交
else
两直线相交
endif
endif

如线段端点(m1,n1),(m2,n2)则在ax+by+c=0中:
if m1=m2 and n1=n1 then
两端点重合,直线为一点,非法
else
if m1=m2 then
a=0; b=1; c=-m1
elseif n1=n2 then
a=1; b=0; c=-n1
else
a=n1-n2; =m2-m1; c=n2*m1-n1*m2
endif
endif
jrju 2001-11-14
  • 打赏
  • 举报
回复
你应该把你的问题讲得更加清楚一点, 也许是个不错的问提。
aiur 2001-11-14
  • 打赏
  • 举报
回复
555,沒人回答嗎?
是因為我的問題太簡單了?
頂一下
jrju 2001-11-14
  • 打赏
  • 举报
回复

我上面所考虑的都是针对一般的情况的,对于由水平线和垂直线构成的封闭多边形
应该是可以有很多优化的地方的。

另外再补充一点:如果多边形的两相邻边在一条直线上应先合并这两条相邻边。

jrju 2001-11-14
  • 打赏
  • 举报
回复
关于计算多边形的面积:
用由顶点构成的不重叠的三角形来分割,有N个顶点(即N条边,N>2)的多边形
可以分割成N-2个不重叠的三角形,所有这些三角形面积之和即为多边形的面积。
每个三角形的面积(S)可由三角形的三条边的长度*设为a,b,c)根据海伦公式:
S=sqrt((xa)(xb)(xc))求得。
其中x=(a+b+c)/2

如何用递归的方法将多边形划分成三角形?
1)如果多边形为三角形即N=3,则无需划分。
2)选定多边形的一个顶点A,在其它N-3个不相邻的点中找到一个点B,AB连线应不
与多边形的任一条边相交,且AB在多边形内.
如无法找到满足要求的B点则取A点的下一个点继续该任务
3)将多边形以AB为边界分成两部分,对每一个多边形重复该递归过程。

判断两线段相交上面已述。
判断一由多边形两端点构成且与多边形各边不相交的线段是否在多边形内的方法:
1)取该线段上除端点外的任一点(可取其中点)
2)判断该点是否在多边形内,如在则线段也在,如不在则线段也不在。

如何判断某点是否在一多边形内(从上已知该点不是多边形的端点且不在多边形的边上):
有两种方法
方法一:
计算该点顺序扫掠多边形各端点(从任一端点开始并结束于该端点)所经过的角度,
角度的计算应注意正负号。若最终扫掠角为0则在多边形外边,为360度则在多边形内部。
方法二:
从该点引一任意射线(为计算方便起见可引一水平或竖直射线),计算它与多边形
各边的交点个数,如为奇数则在多边形内部,如为偶数则在多边形外部。注意:如叫点为
顶点应计算成2个交点
具体哪种方法好些有待试验。

以上只是我的一些基本思路,比较零散,也许还有很多地方应该优化或重新设计算法。
希望能对你有所帮助,如果时间允许我也想具体实现一下。
frman 2001-11-14
  • 打赏
  • 举报
回复
首先构造一个数组A[N][N],其中A[I][J]表示线段I,J相交,至于相交判断的方法—— 因为线段都比较特殊,所以判断时不需做叉积,只用通过快速排斥实验即可~ 代码如下:

line[i].x[0] 表示i线段的一个端点的x坐标
line[i].y[0] 表示i线段的一个端点的y坐标
line[i].x[1] 表示i线段的另一端点的x坐标
line[i].y[1] 表示i线段的另一端点的y坐标

if ( max(line[i].x[0],line[i].x[1]) > min(line[j].x[0], line[j].x[1]) &&
max(line[j].x[0],line[j].x[1]) > min(line[i].x[0], line[i].x[1]) &&
max(line[i].y[0],line[i].y[1]) > min(line[j].y[0], line[j].y[1]) &&
max(line[j].y[0],line[j].y[1]) > min(line[i].y[0], line[i].y[1]) )
线段i和线段j相交

得出数组A[N][N]后,做循环判断,代码如下:

for ( i = 1; i <= n ;i++)
for ( j = i+1; j <= n; j++)
for ( k = j+1; k <= n ; k++)
if ( a[i][j] == 1 && a[i][k] == 1)
for ( p = 1; p <= n; p++)
if ( p != i && a[p][j] == 1 && a[p][k] == 1)
得到一个封闭矩形,由线段i,j,k,p组成

这样就搞定了啊~~矩形嘛,面积自然好算~~



jrju 2001-11-14
  • 打赏
  • 举报
回复
1,封闭性问题
对于平面上的N条线段(不必为水平或垂直),如长度不为0且不存在线段全部重合或
部分重合,则可按如下方法判断其是否封闭:
1)N>2
2)提取各线段的顶点,合并相同的顶点,如封闭则要求不同的顶点数为N。
3)每个顶点所连接的线段数为2。
满足以上三点则这N条线段必为一首尾相连的环。如要求环不允许交叉,则还需对每一条线段判断它与其它线段有无是否交叉,时间复杂度O(0.5*n2),程序也不复杂。
4)判断两线段是否交叉,可先求出两线段相对应的直线的交点,如两直线无交点则线段不交叉,如有交点,则判断交点是否在其中至少一条线段之外,如是则不叫叉,否则交叉。判断直线上的一点是否在该直线的某一段线上的方法如下:
设线段两端点为(x1,y1)及(x2,y2),直线上的一点为(x,y)
若x1<>x2则(x-x1)*(x-x2)<0点在线段上,否则在线段外。

2,求封闭多边形的面积(不必为水平或垂直),可用由顶点构成的三角形来分割,只是
在构造三角形时要结合多边形相邻边的凹凸性。因时间有限,有空再联系。
aiur 2001-11-14
  • 打赏
  • 举报
回复
一個球在平面上游走,走過的路線就是一條條線段.當這個球走過的軌跡封閉的時候,圍成區域就需要變色,所以我需要考慮該怎樣判斷封閉,並且我還要計算該封閉區域的面積.所以,我想把這個區域分割成多個矩形來計算.這裡我認為比較簡單的地方就是,所有的線段都是水平或垂直的.

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧