概述
内角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;
};
}