#ifndef hash_H #define hash_H #include "tabela.h" #include #include typedef struct MatrizCovariancia matcov; typedef struct BucketGrid bucketGrid; struct ListaPosicao{ int posicao[2]; double dist; struct ListaPosicao* proximo; }; typedef struct ListaPosicao listapos; struct Bucket{ double* centro; // assinatura média do bucket double raio; // maior distancia, tab chamada de "Rô"[i,j] struct ListaPonteiro* itens; }; struct ListaPonteiro{ int ponteiro; struct ListaPonteiro* proximo; }; typedef struct ListaPonteiro listapont; typedef struct Bucket bucket; struct BucketGrid { int tam_grid; int num_luzes; double* u; /* Direção principal da nuvem de pontos {[0..num_luzes-1]}. */ double* v; /* Direção principal da nuvem de pontos {[0..num_luzes-1]}. */ bucket** buckets; /* Matriz de buckets {[0..tam_grid-1][0..tam_grid-1]}. */ double bu, bv; /* Posição do baricentro projetado em {u,v} */ int64_t** m_statistic_find; /* Numero de querys que são hasheadas para o bucket {[iu][iv]} */ int64_t** m_statistic_eval; /* Numero de distancias euclideanas calculadas no bucket [x][y] */ int64_t** m_statistic_eval_h; /* Numero de distancias euclideanas calculadas no bucket [x][y] por bucket mapeado*/ int64_t** m_statistic_scan; /* Numero de vezes que o bucket é examinado nas buscas */ int64_t** m_statistic_scan_h; /* Numero de buckets scaneados por mapeamento*/ int64_t** m_statistic_hashed; /* Número de normais mapeadas para um buckets*/ int64_t max_count_st; /* Máximo de {m_statistic[iu][iv]} sobre todos os buckets. */ int tamanho_lista_preordenada; /* Índices dos buckets, em ordem de distância crescente. */ listapos* lista_preordenada; /* Índices dos buckets, em ordem de distância crescente. */ double R; /* Raio da grade de buckets no plano {u,v}. */ double* baricentro; /* Centro da grade de buckets. */ int64_t** circle_map; /**/ }; bucketGrid* CriaBucketGrid(Tabela* tab,int gridzise); void criaListaPreordenada(bucketGrid* bg); void showBucketsPPM(char* prefix,bucketGrid* bg, int num_linhas); void showBucketsEPS(char* prefix,bucketGrid* bg, int num_linhas); void showBucketsPLT(char* prefix,bucketGrid* bg, int num_linhas); void showBucketsRAW(char* prefix,bucketGrid* bg, int num_linhas); void showBucketsData(char* prefix,bucketGrid* bg,int num_linhas); void showBucketGridStatistic(char* prefix,bucketGrid* bg); int localiza_normal_hash(bucketGrid* bg, Tabela* tab, double SO[], double* dist, double *albedo,int* n_euclid_evalsP, int* n_scansP); /* Localiza a entrada na tabela {tab} cujo vetor de observações é mais similar ao vetor de observações dado {SO[0..n-1]} (a menos de um fator de escala); onde {n} é o número de luzes. Devolve o índice dessa entrada como resultado, e coloca em {*dist} a distância enrte as assinatura de {SO} e a dessa entrada. Usa hash bucket grid para acelerar a busca. Se {n_scansP} e/ou {n_euclid_evalsP} forem não NULL, devolve número de buckets escaneados em {n_scansP} e número de distâncias euclidianas calculadas em {n_euclid_evalsP} */ void flushBucketGrid(FILE* arq, bucketGrid* bg); int get_tam_grid(bucketGrid* bg); void plota_bucket_sizes(char* filename, bucketGrid* bg,int isEPS); void plota_bucket_desvios(char* filename, bucketGrid* bg,int isEPS); /* Plota a distancia entre o centroide do bucket e o plano da grade. */ void plota_bucket_map(char* filename, bucketGrid* bg,int isEPS); void plota_bucket_raios(char* filename, bucketGrid* bg,int isEPS); int64_t** acessaMatriz_Statistic_Euclid(bucketGrid* bg); int64_t** acessaMatriz_Statistic_Scan(bucketGrid* bg); void LiberaBucketGrid(bucketGrid* bg); void calcula_sistema_de_coordenadas(Tabela *tab, double u[], double v[], double bar[], double *bu, double *bv); #endif