一、原理
四叉树编码的基本思想是:首先将把一副图像或栅格地图( ,k>1,不足则补网)等分成四个一级字块,顺序为左上,右上,左下,右下;然后逐块检查其中所有格网属性值(或灰度值),若相同,则该字块不再分;若不同,则将该子块进一步分成四个二级子块;如此递归地分割,直到每个子块的属性或灰度均相等为止。
二、算法实现
1 //实现四叉树编码 2 3 #include"stdio.h" 4 void Qutree(int arysize,int level,float curary[] )//arysize 表示矩阵长度,level表示等级,curary[]表示当前矩阵 5 { 6 7 float fi=curary[0]; 8 int i; 9 //遍历当前数组,是否同构 10 for(i=0;i<=arysize*arysize-1;i++) 11 { 12 if(fi!=curary[i]) 13 { 14 break; 15 } 16 17 } 18 if(i==arysize*arysize) 19 { 20 printf("%d,%f",level,fi); 21 printf("\n"); 22 return; 23 } 24 25 else 26 { 27 arysize/=2; 28 float *ary1=new float[arysize*arysize]; 29 float *ary2=new float[arysize*arysize]; 30 float *ary3=new float[arysize*arysize]; 31 float *ary4=new float[arysize*arysize]; 32 for(i=0;i<arysize;i++) 33 { 34 for(int j=0;j<arysize;j++) 35 { 36 //左上 37 ary1[i*arysize+j]=curary[i*(arysize*2)+j]; 38 //右上 39 ary2[i*arysize+j]=curary[i*(arysize*2)+(arysize+j)]; 40 //左下 41 ary3[i*arysize+j]=curary[(arysize+i)*(arysize*2)+j]; 42 //右下 43 ary4[i*arysize+j]=curary[(arysize+i)*(arysize*2)+(arysize+j)]; 44 } 45 } 46 47 level++; 48 Qutree(arysize,level,ary1); 49 Qutree(arysize,level,ary2); 50 Qutree(arysize,level,ary3); 51 Qutree(arysize,level,ary4); 52 53 } 54 55 } 56 int main() 57 { 58 //float aa[16]={1,1,2,2,1,1,3,3,4,2,1,2,3,4,3,4}; 59 //Qutree(4,0,aa); 60 float aa[64]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; 61 Qutree(8,0,aa); 62 return 0; 63 64 }
参考资料:地理信息系统原理与算法(吴立新 、史文中编著)P176
时间: 2024-10-26 21:13:36