一、原理
四叉樹編碼的基本思想是:首先將把一副圖像或柵格地圖( ,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