Advertisement
Guest User

Untitled

a guest
Oct 20th, 2014
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.40 KB | None | 0 0
  1. /* *********************************
  2. Universidade Federal da Paraíba
  3. Trabalho de Computação Gráfica
  4. Ler arq .obj e salvar os pontos em memória
  5. Professora: Liliane Machado
  6. Aluno: Rodolfo de Medeiros Strunkis
  7. Matricula: 11121697
  8. * ******************************** */
  9.  
  10. #include <GL/gl.h>
  11. #include <GL/glut.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <ctype.h>
  16.  
  17. /*Estrutura do ponto*/
  18. typedef struct ponto{
  19. float x, y, z;
  20. }t_Ponto;
  21.  
  22. /*Estrutura no do ponto*/
  23. typedef struct noP{
  24. t_Ponto p;
  25. struct noP *prox;
  26. }t_noP;
  27.  
  28. /*Estrutura da face*/
  29. typedef struct face{
  30. int a, b, c;
  31. }t_Face;
  32.  
  33. /*Estrutura no da face*/
  34. typedef struct noF{
  35. t_Face f;
  36. struct noF *prox;
  37. }t_noF;
  38.  
  39. /*Auxiliares*/
  40. typedef t_noP *t_listaP;
  41. typedef t_noF *t_listaF;
  42. t_listaP pt, auxpt;
  43. t_listaF fc, auxfc;
  44.  
  45. /*Assinaturas*/
  46. void leArquivo();
  47. t_noP * criaListanoP();
  48. t_noP * getnoP(t_listaP lista, int pos);
  49. int putPonto(t_listaP lista, int pos, t_Ponto p);
  50. t_noF * criaListanoF();
  51. t_noF * getnoF(t_listaF lista, int pos);
  52. int putFace(t_listaF lista, int pos, t_Face f);
  53.  
  54. /*Funções*/
  55.  
  56. /*Está função lê o arquivo, salva os pontos e as faces em listas encadeadas.
  57. **Usando a função fgets(), eu trato o arquivo como um vetor, salvo os pontos
  58. **Após as ocorrencias de V e os numeros das faces apos as ocorrecias de F.
  59. **Foi necessário declarar uma variável com o "tamanho da linha", pois é um
  60. **Parametro necessário na função fgets().*/
  61. void leArquivo()
  62. {
  63. FILE *file;
  64. t_Ponto p;
  65. t_Face f;
  66.  
  67. pt = criaListanoP();
  68. fc = criaListanoF();
  69.  
  70. int posPT = 1;
  71. int posFC = 0;
  72.  
  73. t_noP *pts;
  74. t_noF *fcs;
  75.  
  76. /*Este é o ponteiro para uma matriz de caracteres, onde a leitura string é armazenada.*/
  77. char linha[60];
  78.  
  79. /*Abre o arquivo que está neste caminho. O "r" significa que é para leitura do arquivo*/
  80. file = fopen("\\home\\rodolfo\\Dropbox\\UFPB\\7Período\\C.G\\Atividade4\\cubo3.obj", "r");
  81. if(!file){
  82. printf("arquivo inexistente\n");
  83. exit(1);
  84. }
  85. /*Estrutura de repetição é verdadeira enqnto não chegar no fim do arquivo*/
  86. while(!feof(file)){
  87. /*os parametros do fgets são:
  88. **o ponteiro para a matriz
  89. **o tamanho maximo de numeros de caracteres a serem lidos ("Tamanho da linha")
  90. **o ponteiro para o arquivo*/
  91. fgets(linha, 60, file);
  92.  
  93. /*Testa se a primeira ocorrencia da linha é um 'v'
  94. **se verdadeiro ele salva os 3 pontos nos seguintes endereços*/
  95. if (linha[0] == 'v')
  96. {
  97. sscanf(linha, "v %f %f %f", &p.x, &p.y, &p.z);
  98. /*Teste para sabe se está salvando o ponto corretamente na lista*/
  99. printf("x = %f y = %f z = %f posPT = \n", p.x, p.y, p.z, posPT);
  100. putPonto(pt, posPT++, p);
  101. }
  102.  
  103. /*Testa se a primeira ocorrencia da linha é um 'f'
  104. **se verdadeiro ele salva as 3 faces nos seguintes endereços*/
  105. if (linha[0] == 'f')
  106. {
  107. sscanf(linha, "f %d %d %d", &f.a, &f.b, &f.c);
  108. /*Teste para sabe se está salvando a face corretamente na lista*/
  109. printf("a = %d b = %d c = %d posFC = \n", f.a, f.b, f.c, posFC);
  110. putFace(fc, posFC++, f);
  111. }
  112. }
  113.  
  114. /*Testa os nós dos pontos e das faces*/
  115. pts = getnoP(pt, 1);
  116. if (pts == NULL)
  117. {
  118. printf("no do ponto é nulo");
  119. }
  120.  
  121. fcs = getnoF(fc, 0);
  122. if (fcs == NULL)
  123. {
  124. printf("no da face é nulo");
  125. }
  126. /*Fecha o arquivo*/
  127. fclose(file);
  128. }
  129.  
  130. /*Cria lista de nos dos pontos*/
  131. t_noP * criaListanoP(){
  132. t_noP * no = (t_noP*) malloc(sizeof(t_noP));
  133. if (no)
  134. {
  135. no -> prox = NULL;
  136. }
  137. return no;
  138. }
  139.  
  140. /*Pega a posição do nó*/
  141. t_noP * getnoP(t_listaP lista, int pos){
  142. int n = 0;
  143. if (pos < 0)
  144. {
  145. return 0;
  146. }
  147. while(lista != NULL){
  148. if (n == pos)
  149. {
  150. return lista;
  151. }
  152. lista = lista -> prox;
  153. n++
  154. }
  155. return 0;
  156. }
  157.  
  158. /*Insere o ponto na lista*/
  159. int putPonto(t_listaP lista, int pos, t_Ponto p){
  160. t_noP* novo, *pr;
  161. if (pos == 0)
  162. {
  163. lista -> p = ponto;
  164. return 1;
  165. }
  166. pr = getnoP(lista, pos - 1);
  167. novo = criaListanoP();
  168. if (novo == NULL)
  169. {
  170. return 0;
  171. }
  172. novo -> p = ponto;
  173. pr -> prox = pr -> prox;
  174. pr -> prox = novo;
  175. return 1;
  176. }
  177.  
  178. /*Cria lista de nos das faces*/
  179. t_noF * criaListanoF(){
  180. t_noF * no = (t_noF*) malloc(sizeof(t_noF));
  181. if (no)
  182. {
  183. no -> prox = NULL;
  184. }
  185. return no;
  186. }
  187.  
  188. /*Pega a posição do nó*/
  189. t_noF * getnoF(t_listaF lista, int pos){
  190. int n = 0;
  191. if (pos < 0)
  192. {
  193. return 0;
  194. }
  195. while(lista != NULL){
  196. if (n == pos)
  197. {
  198. return lista;
  199. }
  200. lista = lista -> prox;
  201. n++
  202. }
  203. return 0;
  204. }
  205.  
  206. /*Insere a face na lista*/
  207. int putFace(t_listaF lista, int pos, t_Face f){
  208. t_noF* novo, *fr;
  209. if (pos == 0)
  210. {
  211. lista -> f = face;
  212. return 1;
  213. }
  214. fr = getnoF(lista, pos - 1);
  215. novo = criaListanoF();
  216. if (novo == NULL || fr == NULL)
  217. {
  218. return 0;
  219. }
  220. novo -> f = face;
  221. novo -> prox = fr -> prox;
  222. fr -> prox = novo;
  223. return 1;
  224. }
  225.  
  226. int main(int argc, char **argv)
  227. {
  228.  
  229. leArquivo();
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement