90 likes | 191 Views
CES-11 LAB 03. Bitmap Quadtree ALGORITMO. Carlos Henrique Q. Forster – Instituto Tecnológico de Aeronáutica 2010. Nova codificação:. 00. 01. 1. Se nível=max. 0. 1. 100000011100. Codificação: 100000011100. 00. 00. 00. 11100. Agora 12 bits, mas tive que guardar o tamanho 4x4. 1.
E N D
CES-11 LAB 03 Bitmap Quadtree ALGORITMO Carlos Henrique Q. Forster – Instituto Tecnológico de Aeronáutica 2010
Nova codificação: 00 01 1... Se nível=max 0 1 100000011100 Codificação: 100000011100 00 00 00 11100 Agora 12 bits, mas tive que guardar o tamanho 4x4 1 1 0 0
Novamente para a grande: Codificação: 1 100000011100 110010100100111110 100100110000 101110111100011000 61 bits agora!! Ainda guardo o tamanho 16x16
Variáveis globais • W: largura da imagem • H: altura da imagem • Wp: menor potência de dois que é maior ou igual a W • Hp: idem para H • Dim: log2 max{Wp,Hp} = máximo nível • Branco: apontador para nó da quadtree com valor branco e sem filhos • Preto: idem com valor preto
Constroi Quadtree da matriz quadtree constroi_quadtree(x,y,largura) Se largura==1 //nível é máximo Se pixel[x,y]==0 retorna Branco Senão retorna Preto Senão q1=constroi_quadtree(x,y,largura/2) q2=constroi_quadtree(x+largura/2,y,largura/2) q3=constroi_quadtree(x,y+largura/2,largura/2) q4=constroi_quadtree(x+larg./2,y+larg./2,larg./2) Se q1..q4 forem Branco, retorna Branco Senão se forem Preto, retorna Preto Senão, cria nó intermediário com filhos q1 a q4 e retorna esse nó
Escrita da quadtree void escreve_quadtree(quadtree Q, int nivel) Se nivel==Dim //ultimo nível Se Q é Branco escreve 0 Senão escreve 1 Senão Se Q é Branco escreve 0 e 0 Senão, se Preto, escreve 0 e 1 Senão: Escreve 1 escreve(Q.filho1,nivel+1) escreve(Q.filho2,nivel+1) escreve(Q.filho3,nivel+1) escreve(Q.filho4,nivel+1)
Leitura Quadtree quadtree leitura_quadtree(int nivel) Lê próximo bit b Se nivel==Dim Se b==0 retorna Branco Senão retorna Preto Senão se b==0 Lê próximo bit b2 Se b2==0 retorna Branco Senão retorna Preto Senão se b==1 Cria nó intermediário Q Para i=1..4 faz Q.filho[i]=leitura(nivel+1) Retorna Q
Gera matriz da Quadtree void gera_matriz(quadtree Q, int x,y,largura) Se Q é branco Preenche retângulo(x,y,largura,0) Senão, se Q é preto Preenche retângulo(x,y,largura,1) Senão gera_matriz(Q.filho[1],x,y,largura/2) gera_matriz(Q.filho[2],x+largura/2,y,largura/2) gera_matriz(Q.filho[3],x,y+largura/2,largura/2) gera_matriz(Q.filho[4],x+larg/2,y+larg/2,largura/2)
Formato PBM • Para trabalhar com o formato PBM: • Baixe o Irfanview ou outro programa que visualize e salve arquivos PBM • Ao gravar PBM, escolha a opção ASCII ao invés de binário • Ao gerar imagens, não esqueça de colocar os cabeçalhos corretamente: • fprintf(fp,“P1\n#\n%d %d\n”,largura,altura) • Se optar pelo PBM, gere a quadtree em formato texto também, para podermos comparar os tamanhos dos arquivos