/*************************************************************************** * Copyright (C) 2008 by Douglas Castro,,, * * douglas@douglas-laptop * * * ***************************************************************************/ #include "imprime.h" #include "affirm.h" #include void mostra(FILE *arq, Reg *r,int ind) { if (r == NULL) { return; } int qx=0, qy=0, p=0; // calculo da profundidade // p = log2(r->ind); p = log(ind)/log(2); // calculo da qtdade de bits coords x e y qx = p/2; qy = p/2; if(p%2==1) { qx += 1; qy += 0; } // qtdade de celulas na prof p nas direcoes x e y qx = pow(2,qx); qy = pow(2,qy); // calculo das posicoes x e y int d0, d1; encontra_posicao(ind, &d0, &d1); // calculo das coordenadas (reais) do canto inf esq de uma cel em [0,1]x[0,1] double coordX = d0*(1./(double) qx); double coordY = d1*(1./(double) qy); fprintf(arq, "%10.6f %10.6f %10.6f\n", coordX, coordY, 0.0); mostra(arq, r->esq,2*ind); mostra(arq, r->dir,2*ind+1); } /** * Escreve num arquivo as coordenadas x e y do vertice inferior esquerdo de todas celulas * com suas respectivas medias celulares * @param arq [out] arquivo onde os dados serao escritos * @param r [in] arvore * @param ind [in] indicce da celula * @param prof [in] profundodade na arvore * @param xmin [in] abscissa inferior da celula * @param xmax [in] abscissa superior da celula * @param ymin [in] ordenada inferior da celula * @param ymax [in] ordenada superior da celula */ void mostra_aux(FILE *arq, Reg *r,int ind, int prof, double xmin, double xmax, double ymin, double ymax) { if (r == NULL ) { return; } fprintf(arq, "%d %10.6f %10.6f %10.6f\n", ind, xmin, ymin, r->fval); if(prof%2==0) { // printf("par\n"); mostra_aux(arq, r->esq,2*ind,prof + 1, xmin, (xmax+xmin)/2.0, ymin, ymax); mostra_aux(arq, r->dir,2*ind+1,prof + 1, (xmax+xmin)/2.0, xmax, ymin, ymax); } else { // printf("impar\n"); mostra_aux(arq, r->esq,2*ind,prof + 1, xmin, xmax, ymin, (ymax+ymin)/2.0); mostra_aux(arq, r->dir,2*ind+1,prof + 1, xmin, xmax, (ymin+ymax)/2.0, ymax); } } void mostra_folhas(FILE *arq, Reg *r, int ind, int prof, double xmin, double xmax, double ymin, double ymax) { /* Exigencia da fun��o: */ demand(r != NULL, "a arvore n�o pode ser nula!"); /* Paranoia: */ assert((r->esq == NULL) == (r->dir == NULL)); if(r->esq==NULL) { fprintf(arq,"%d %10.6f %10.6f %10.6f\n", ind, xmin, ymin, r->fval); return; } if(prof%2==0) { mostra_folhas(arq, r->esq, 2*ind + 0, prof + 1, xmin, (xmax+xmin)/2.0, ymin, ymax); mostra_folhas(arq, r->dir, 2*ind + 1, prof + 1, (xmax+xmin)/2.0, xmax, ymin, ymax); } else { mostra_folhas(arq, r->esq, 2*ind + 0, prof + 1, xmin, xmax, ymin, (ymax+ymin)/2.0); mostra_folhas(arq, r->dir, 2*ind + 1, prof + 1, xmin, xmax, (ymin+ymax)/2.0, ymax); } } /** * Dado indice da celula calcula-se sua posicao na malha * @param ind [in] indice da celula * @param delta0 [out] coordenada x da celula * @param delta1 [out] coordenada y da celula */ void encontra_posicao(int ind, int *delta0, int *delta1) { int bits[64], d0[32],d1[32],i=0,j,l; // zerando, para nao ter problemas com lixo for(l=0;l<32;l++) { d0[l] = 0; d1[l] = 0; bits[2*l] = 0; bits[2*l+1] = 0; } //coverte ind para binario while (ind != 0) { bits[i++] = ind % 2; ind = ind /2; } // IPORTANTE: no vetor bits, os algoritmos 0 1 provenientes da representacao // binaria estao na ordem inversa. Ou seja, se ind = 11 (base 10) entao sua representacao // binaria deveria e ind_2 = 1011 mas em no vetor bits esta armazenado o numero 1101. if(i%2==0) { // separa os bits q vao formar o vetor posicao int cd0 = i/2; for(j=0;jesq); fv_fil = ((pl == NULL || pl->esq == NULL) ? 2.0*fb - fint : pl->esq->fval); } else { p_fil = (pl == NULL ? NULL : pl->dir); fv_fil = ((pl == NULL || pl->dir == NULL) ? fint : pl->dir->fval); } fil[i*k+j].p = p_fil; fil[i*k+j].fv = fv_fil; } } else { /* filho direito: */ for(j=0; jdir); fv_fil = ((pl == NULL || pl->dir == NULL) ? fint : pl->dir->fval); } else { p_fil = (pl == NULL ? NULL : pl->esq); fv_fil = ((pl == NULL || pl->esq == NULL) ? 2.0*fb - fint : pl->esq->fval); } fil[i*k+j].p = p_fil; fil[i*k+j].fv = fv_fil; } } } } else { // montando gabarito int i,j; for(i=0;idir); fv_fil = ((pl == NULL || pl->dir == NULL) ? fint : pl->dir->fval); } else { p_fil = (pl == NULL ? NULL : pl->esq); fv_fil = ((pl == NULL || pl->esq == NULL) ? 2.0*fb - fint : pl->esq->fval); } fil[i*k+j].p = p_fil; fil[i*k+j].fv = fv_fil; } } else {//filho esquerdo for(j=0;jesq); fv_fil = ((pl == NULL || pl->esq == NULL) ? 2.0*fb - fint : pl->esq->fval); } else { p_fil = (pl == NULL ? NULL : pl->dir); fv_fil = ((pl == NULL || pl->dir == NULL) ? fint : pl->dir->fval); } fil[i*k+j].p = p_fil; fil[i*k+j].fv = fv_fil; } } } } }