【C++】内角90度任意图形相交解决方案

概述

内角90度的任意图形是什么? 例如
内角90度任意图形
他们可以非常不规则,但是可以用矩阵的方法来解

思路

设置一个很大的矩阵,将一个这种图形画上去,再画另一个图形的过程中看坐标是否重合。

实现

//f1和f2是两个图形点的集合,每个点排列顺序表示相连顺序,c1和c2分别表示两个图形的边(端点)数量
int getRelationOfMultirects(int f1[][2],int c1,int f2[][2],int c2){
	int mat[2048][2048];
	int r=0;
	for(int i=0;i<c1;i++){
	//确保封闭图形首尾相连
		int mode=i+1;
		if(i==c1-1) mode=0;
		//画上第一个图形
		if(f1[i][0]!=f1[mode][0]){//若相连两个点横坐标不一样,就横着画
			int x1=f1[i][0]>f1[mode][0]?f1[i][0]:f1[mode][0];
			int x2=f1[i][0]<f1[mode][0]?f1[i][0]:f1[mode][0];
			for(int x=x2;x<x1-x2+1;x++)
				mat[x][f1[i][1]]=1;
		}
		else if(f1[i][1]!=f1[mode][1]){//若相连两个点纵坐标不一样,就竖着画
			int y1=f1[i][1]>f1[mode][1]?f1[i][1]:f1[mode][1];
			int y2=f1[i][1]<f1[mode][1]?f1[i][1]:f1[mode][1];
			for(int y=y2;y<y1-y2+1;y++)
				mat[f1[i][0]][y]=1;
		};
	};
	for(int i=0;i<c2;i++){
		int mode=i+1;
		if(i==c2-1) mode=0;
		
		if(f2[i][0]!=f2[mode][0]){
			int x1=f2[i][0]>f2[mode][0]?f2[i][0]:f2[mode][0];
			int x2=f2[i][0]<f2[mode][0]?f2[i][0]:f2[mode][0];
			for(int x=x2;x<x1-x2+1;x++)
				if(mat[x][f1[i][1]]==1){//侦测画画位置是否已经画过,表示边有相交
					r++;
					break;
				}
		}
		else if(f2[i][1]!=f2[mode][1]){
			int y1=f2[i][1]>f2[mode][1]?f2[i][1]:f2[mode][1];
			int y2=f2[i][1]<f2[mode][1]?f2[i][1]:f2[mode][1];
			for(int y=y2;y<y1-y2+1;y++)
				if(mat[f2[i][0]][y]==1){
					r++;
					break;
				}
		};
		return r;
	};
}

猜你喜欢

转载自blog.csdn.net/qq_35504602/article/details/107534572