Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* *********************************
- Universidade Federal da Paraíba
- Trabalho de Computação Gráfica
- Ler arq .obj e salvar os pontos em memória
- Professora: Liliane Machado
- Aluno: Rodolfo de Medeiros Strunkis
- Matricula: 11121697
- * ******************************** */
- #include <GL/gl.h>
- #include <GL/glut.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- /*Estrutura do ponto*/
- typedef struct ponto{
- float x, y, z;
- }t_Ponto;
- /*Estrutura no do ponto*/
- typedef struct noP{
- t_Ponto p;
- struct noP *prox;
- }t_noP;
- /*Estrutura da face*/
- typedef struct face{
- int a, b, c;
- }t_Face;
- /*Estrutura no da face*/
- typedef struct noF{
- t_Face f;
- struct noF *prox;
- }t_noF;
- /*Auxiliares*/
- typedef t_noP *t_listaP;
- typedef t_noF *t_listaF;
- t_listaP pt, auxpt;
- t_listaF fc, auxfc;
- /*Assinaturas*/
- void leArquivo();
- t_noP * criaListanoP();
- t_noP * getnoP(t_listaP lista, int pos);
- int putPonto(t_listaP lista, int pos, t_Ponto p);
- t_noF * criaListanoF();
- t_noF * getnoF(t_listaF lista, int pos);
- int putFace(t_listaF lista, int pos, t_Face f);
- /*Funções*/
- /*Está função lê o arquivo, salva os pontos e as faces em listas encadeadas.
- **Usando a função fgets(), eu trato o arquivo como um vetor, salvo os pontos
- **Após as ocorrencias de V e os numeros das faces apos as ocorrecias de F.
- **Foi necessário declarar uma variável com o "tamanho da linha", pois é um
- **Parametro necessário na função fgets().*/
- void leArquivo()
- {
- FILE *file;
- t_Ponto p;
- t_Face f;
- pt = criaListanoP();
- fc = criaListanoF();
- int posPT = 1;
- int posFC = 0;
- t_noP *pts;
- t_noF *fcs;
- /*Este é o ponteiro para uma matriz de caracteres, onde a leitura string é armazenada.*/
- char linha[60];
- /*Abre o arquivo que está neste caminho. O "r" significa que é para leitura do arquivo*/
- file = fopen("\\home\\rodolfo\\Dropbox\\UFPB\\7Período\\C.G\\Atividade4\\cubo3.obj", "r");
- if(!file){
- printf("arquivo inexistente\n");
- exit(1);
- }
- /*Estrutura de repetição é verdadeira enqnto não chegar no fim do arquivo*/
- while(!feof(file)){
- /*os parametros do fgets são:
- **o ponteiro para a matriz
- **o tamanho maximo de numeros de caracteres a serem lidos ("Tamanho da linha")
- **o ponteiro para o arquivo*/
- fgets(linha, 60, file);
- /*Testa se a primeira ocorrencia da linha é um 'v'
- **se verdadeiro ele salva os 3 pontos nos seguintes endereços*/
- if (linha[0] == 'v')
- {
- sscanf(linha, "v %f %f %f", &p.x, &p.y, &p.z);
- /*Teste para sabe se está salvando o ponto corretamente na lista*/
- printf("x = %f y = %f z = %f posPT = \n", p.x, p.y, p.z, posPT);
- putPonto(pt, posPT++, p);
- }
- /*Testa se a primeira ocorrencia da linha é um 'f'
- **se verdadeiro ele salva as 3 faces nos seguintes endereços*/
- if (linha[0] == 'f')
- {
- sscanf(linha, "f %d %d %d", &f.a, &f.b, &f.c);
- /*Teste para sabe se está salvando a face corretamente na lista*/
- printf("a = %d b = %d c = %d posFC = \n", f.a, f.b, f.c, posFC);
- putFace(fc, posFC++, f);
- }
- }
- /*Testa os nós dos pontos e das faces*/
- pts = getnoP(pt, 1);
- if (pts == NULL)
- {
- printf("no do ponto é nulo");
- }
- fcs = getnoF(fc, 0);
- if (fcs == NULL)
- {
- printf("no da face é nulo");
- }
- /*Fecha o arquivo*/
- fclose(file);
- }
- /*Cria lista de nos dos pontos*/
- t_noP * criaListanoP(){
- t_noP * no = (t_noP*) malloc(sizeof(t_noP));
- if (no)
- {
- no -> prox = NULL;
- }
- return no;
- }
- /*Pega a posição do nó*/
- t_noP * getnoP(t_listaP lista, int pos){
- int n = 0;
- if (pos < 0)
- {
- return 0;
- }
- while(lista != NULL){
- if (n == pos)
- {
- return lista;
- }
- lista = lista -> prox;
- n++
- }
- return 0;
- }
- /*Insere o ponto na lista*/
- int putPonto(t_listaP lista, int pos, t_Ponto p){
- t_noP* novo, *pr;
- if (pos == 0)
- {
- lista -> p = ponto;
- return 1;
- }
- pr = getnoP(lista, pos - 1);
- novo = criaListanoP();
- if (novo == NULL)
- {
- return 0;
- }
- novo -> p = ponto;
- pr -> prox = pr -> prox;
- pr -> prox = novo;
- return 1;
- }
- /*Cria lista de nos das faces*/
- t_noF * criaListanoF(){
- t_noF * no = (t_noF*) malloc(sizeof(t_noF));
- if (no)
- {
- no -> prox = NULL;
- }
- return no;
- }
- /*Pega a posição do nó*/
- t_noF * getnoF(t_listaF lista, int pos){
- int n = 0;
- if (pos < 0)
- {
- return 0;
- }
- while(lista != NULL){
- if (n == pos)
- {
- return lista;
- }
- lista = lista -> prox;
- n++
- }
- return 0;
- }
- /*Insere a face na lista*/
- int putFace(t_listaF lista, int pos, t_Face f){
- t_noF* novo, *fr;
- if (pos == 0)
- {
- lista -> f = face;
- return 1;
- }
- fr = getnoF(lista, pos - 1);
- novo = criaListanoF();
- if (novo == NULL || fr == NULL)
- {
- return 0;
- }
- novo -> f = face;
- novo -> prox = fr -> prox;
- fr -> prox = novo;
- return 1;
- }
- int main(int argc, char **argv)
- {
- leArquivo();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement