20
2017
04

多边形分组

问题描述:有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个是一组。结果正确。



« 上一篇下一篇 »

相关文章:

计算地铁票价-最短路径问题  (2017-3-21 18:31:55)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。