问题描述:有n个多边形,已知每个多边形的顶点(可以为任意多个),如果两个多边形至少有一个坐标相同的顶点,我们认为两个多边形是连接的,;现在要把这些多边形分组,相互连通的多边形分为一组,如何实现。
有空得学习一下图论,书到用时方恨少。
自己想了想,先实现了一个,有空再找理论。
结合之前学过的Floyd算法。
直接上代码,思路比较简单,有空再加注释。
<script> function Point(x,y){ this.x=x; this.y=y; } function distance(p1,p2){ var dx=p1.x-p2.x; var dy=p1.y-p2.y; return Math.sqrt(dx*dx,dy*dy); } var p1=new Point(1,1); var p2=new Point(10,1); var p3=new Point(10,10); var p4=new Point(10,20); var p5=new Point(1,10); var p6=new Point(1,20); var p7=new Point(1,0); var shape01=[p1,p2]; var shape02=[p1,p3]; var shape03=[p3]; var shape06=[p5,p6]; var shape05=[p5]; var shape04=[p7,p4]; var shape07=[p4]; var shapeArr=[shape01,shape02,shape03,shape04,shape05,shape06,shape07]; var len=shapeArr.length; var arr=[]; for(var i=0;i<len;i++){ arr[i]=[]; for(var j=0;j<len;j++){ arr[i][j]=isConnect(shapeArr[i],shapeArr[j]); } } shuchu(arr); var arr2=[]; for(i=0;i<len;i++) { arr2[i]=[]; for(j=0;j<len;j++){ arr2[i][j]=false; } } //k在最外层,别写反了。 for(k=0;k<len;k++) { for(i=0;i<len;i++) { for(j=0;j<len;j++){ if(arr[i][k]&&arr[k][j]){ arr2[i][j]=true; } } } } shuchu(arr2); var id=0; var j=0; var arr3=[]; for(i=0;i<len;i++){ if(arr3[i]>=1){ continue; } id++; for(j=i;j<len;j++){ if(arr2[i][j]){ arr3[j]=id; } } } console.log(arr3.join("\t")); function shuchu(arr){ var out=[]; for(var i=0;i<arr.length;i++){ out.push(arr[i].join("\t")); } console.log(out.join("\n")); } function isConnect(shape01,shape02){ var len01=shape01.length; var len02=shape02.length; for(var i=0;i<len01;i++){ var p1=shape01[i]; for(var j=0;j<len02;j++){ var p2=shape02[j]; if(p1.x==p2.x&&p1.y==p2.y){ return true; } } } return false; } </script>
输出结果:
前3个是一组,第4个和第7个是一组,第5个和第6个是一组。结果正确。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。