Advertisement
EsdrasIsrael

Projeto ITP 12/11

Nov 12th, 2019
596
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.48 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. typedef struct pixel_t{
  7.     int r;
  8.     int g;
  9.     int b;
  10. }pixel;
  11.  
  12. enum comandos {image = 1, color, clear, rect, circle, polygon, fill, save, open};
  13.  
  14. typedef struct csv_struct{
  15.     int colunas_dados;
  16.     int linhas_dados;
  17.     char dados[40][20][15];
  18.  
  19. }csv;
  20.  
  21. typedef struct respostas_t{
  22.     int k;
  23.     struct r_imagem_t{
  24.         int C, L;
  25.     }r_imagem;
  26.     struct r_color_t{
  27.         int r, g, b;
  28.         int col[50];
  29.     }r_color;
  30.     struct r_clear_t{
  31.         int r, g, b;
  32.     }r_clear;
  33.     struct r_rect_t{
  34.         int x, y, base, altura;
  35.     }r_rect;
  36.     struct r_circle_t{
  37.         int x, y, raio;
  38.     }r_circle;
  39.     struct r_line_t{
  40.         int x1, y1, x2, y2;
  41.         int lns[100];
  42.     }r_line;
  43.     struct r_polygon_t{
  44.         int n_pontos;
  45.         int pos[100];
  46.     }r_polygon;
  47.     struct r_fill_t{
  48.         int x;
  49.         int y;
  50.     }r_fill;
  51.     struct r_save_t{
  52.         char nome_arquivo[20];
  53.     }r_save;
  54.     struct r_open_t{
  55.         char nome_arquivo_a_ser_lido[20];
  56.         char nome_arquivo_a_ser_escrito[20];
  57.         char nome_arquivo_anterior[20];
  58.     }r_open;
  59.  
  60. }respostas;
  61.  
  62. void Transforma_Matriz_string(FILE *arquivoOrigem, csv *Dados2){
  63.     char StringFormatoCSV[1000] = "";
  64.     char linha[100];
  65.     while(fgets(linha, 100, arquivoOrigem) != NULL){//Transforma todo arquivo escrito em uma única string
  66.         strcat(StringFormatoCSV, linha);
  67.     }
  68.  
  69.     int cont = 0, i = 0, contador_aux = 0;
  70.     Dados2->colunas_dados = 0;
  71.     Dados2->linhas_dados = 0;
  72.     char auxiliar[100];
  73.     printf("%s\n", StringFormatoCSV);
  74.     while(StringFormatoCSV[i] != '\0'){
  75.         if(StringFormatoCSV[i] != ' ' && StringFormatoCSV[i] != '\n'){
  76.             auxiliar[contador_aux] = StringFormatoCSV[i];
  77.             auxiliar[contador_aux + 1] = '\0';
  78.             contador_aux++;
  79.         }else{
  80.             strcpy(Dados2->dados[Dados2->linhas_dados][Dados2->colunas_dados], auxiliar);
  81.             Dados2->colunas_dados++;
  82.             if(StringFormatoCSV[i] == '\n'){
  83.                 Dados2->colunas_dados = 0;
  84.                 Dados2->linhas_dados++;
  85.             }
  86.             strcpy(auxiliar, "");
  87.             contador_aux = 0;
  88.         }
  89.         i++;
  90.     }
  91.     strcpy(Dados2->dados[Dados2->linhas_dados][Dados2->colunas_dados], auxiliar);
  92.  
  93. }
  94.  
  95. void Captar_comandos_e_variaveis (csv *Dados3, respostas *input){
  96.     int i,linhas = 0, cor = 0;
  97.     for(i = 0; i < Dados3->linhas_dados + 1; i++){
  98.  
  99.         if(strcmp(Dados3->dados[i][0], "image") == 0 ){
  100.             input->r_imagem.C = atoi(Dados3->dados[i][1]);
  101.             input->r_imagem.L = atoi(Dados3->dados[i][2]);
  102.         }
  103.         if(strcmp(Dados3->dados[i][0], "color") == 0 ){
  104.             input->r_color.r = atoi(Dados3->dados[i][1]);
  105.             input->r_color.g = atoi(Dados3->dados[i][2]);
  106.             input->r_color.b = atoi(Dados3->dados[i][3]);
  107.  
  108.             input->r_color.col[cor] = input->r_color.r;//Armazena tudo em um vetor
  109.             input->r_color.col[cor+1] = input->r_color.g;
  110.             input->r_color.col[cor+2] = input->r_color.b;
  111.  
  112.             cor = cor + 3;
  113.         }
  114.         if(strcmp(Dados3->dados[i][0], "clear") == 0 ){
  115.             input->r_clear.r = atoi(Dados3->dados[i][1]);
  116.             input->r_clear.g = atoi(Dados3->dados[i][2]);
  117.             input->r_clear.b = atoi(Dados3->dados[i][3]);
  118.         }
  119.         if(strcmp(Dados3->dados[i][0], "rect") == 0 ){
  120.             input->r_rect.x = atoi(Dados3->dados[i][1]);
  121.             input->r_rect.y = atoi(Dados3->dados[i][2]);
  122.             input->r_rect.base = atoi(Dados3->dados[i][3]);
  123.             input->r_rect.altura = atoi(Dados3->dados[i][4]);
  124.         }
  125.         if(strcmp(Dados3->dados[i][0], "circle") == 0 ){
  126.             input->r_circle.x = atoi(Dados3->dados[i][1]);
  127.             input->r_circle.y = atoi(Dados3->dados[i][2]);
  128.             input->r_circle.raio = atoi(Dados3->dados[i][3]);
  129.  
  130.         }
  131.         if(strcmp(Dados3->dados[i][0], "line") == 0 ){
  132.             input->r_line.x1 = atoi(Dados3->dados[i][1]);
  133.             input->r_line.y1 = atoi(Dados3->dados[i][2]);
  134.             input->r_line.x2 = atoi(Dados3->dados[i][3]);
  135.             input->r_line.y2 = atoi(Dados3->dados[i][4]);
  136.  
  137.             input->r_line.lns[linhas] = input->r_line.x1;//Armazena tudo em um vetor
  138.             input->r_line.lns[linhas+1] = input->r_line.y1;
  139.             input->r_line.lns[linhas+2] = input->r_line.x2;
  140.             input->r_line.lns[linhas+3] = input->r_line.y2;
  141.  
  142.             linhas =linhas + 4;
  143.         }
  144.         if(strcmp(Dados3->dados[i][0], "polygon") == 0 ){
  145.  
  146.             input->r_polygon.n_pontos = atoi(Dados3->dados[i][1]);
  147.             for (int j = 0; j < 100; ++j){
  148.                 input->r_polygon.pos[j] = atoi(Dados3->dados[i][j+2]);
  149.             }
  150.         }
  151.         if(strcmp(Dados3->dados[i][0], "fill") == 0 ){
  152.             input->r_fill.x = atoi(Dados3->dados[i][1]);
  153.             input->r_fill.y = atoi(Dados3->dados[i][2]);
  154.         }
  155.         if(strcmp(Dados3->dados[i][0], "save") == 0 ){
  156.             strcpy(input->r_save.nome_arquivo, Dados3->dados[i][1]);
  157.         }
  158.         if(strcmp(Dados3->dados[i][0], "open") == 0 ){
  159.             strcpy(input->r_open.nome_arquivo_a_ser_lido, Dados3->dados[i][1]);
  160.             strcpy(input->r_open.nome_arquivo_a_ser_escrito, Dados3->dados[i][2]);
  161.             strcpy(input->r_open.nome_arquivo_a_ser_escrito, Dados3->dados[i][3]);
  162.         }
  163.     }
  164. }
  165.  
  166. void line(int x1, int y1, int x2, int y2, int C, int L, pixel matriz[C][L], int rgb_f[3]){
  167.  
  168.     int dx = x2 - x1;
  169.     int dy = y2 - y1;
  170.     int step;
  171.     float x, y;
  172.  
  173.     if(fabs(dx) > fabs(dy)){
  174.         step = fabs(dx);
  175.     }else{
  176.         step = fabs(dy);
  177.     }
  178.     x = x1;
  179.     y = y1;
  180.  
  181.     float xinc = (float)dx/step;
  182.     float yinc = (float)dy/step;
  183.  
  184.     for (int i = 0; i <= step; ++i){
  185.         matriz[(int)round(y)][(int)round(x)].r = rgb_f[0];
  186.         matriz[(int)round(y)][(int)round(x)].g = rgb_f[1];
  187.         matriz[(int)round(y)][(int)round(x)].b = rgb_f[2];
  188.  
  189.         x = x + xinc;
  190.         y = y + yinc;
  191.  
  192.     }
  193. }
  194. /*
  195. void FuncaoOpen(){//Função está incompleta ainda, mas funciona sozinha em outro código. Precisa adaptar
  196.     FILE *arq1;
  197.     FILE *arq2;
  198.     char Linha1[3];
  199.     int C, L, cor_max;
  200.  
  201.     //printf("Digite o nome do arquivo a ser lido: ");
  202.     //scanf("%s", nome_arquivo_a_ser_alterado);
  203.  
  204.     arq1 = fopen("output4.ppm", "r+");
  205.     if(arq1 == NULL){
  206.         printf("Esse arquivo não existe!");
  207.     }
  208.  
  209.     fscanf(arq1, "%s",Linha1);
  210.     fscanf(arq1, "%d %d", &C, &L);
  211.     fscanf(arq1, "%d", &cor_max);
  212.  
  213.     pixel matriz[C][L];
  214.  
  215.     for(int i = 0; i < C; i++){
  216.         for(int j = 0; j < L; j++){
  217.             fscanf(arq1, "%d %d %d ", &matriz[i][j].r, &matriz[i][j].g, &matriz[i][j].b);
  218.         }
  219.     }
  220.  
  221.     arq2 = fopen("outputOpen2.ppm", "wb");//Faz a escrita no arquivo destino
  222.  
  223.     fprintf(arq2, "P3\n%d %d\n255\n", L, C);
  224.  
  225.     for(int i = 0; i < C; i++){//Insere a matriz na imagem
  226.         for(int j = 0; j < L; j++){
  227.             fprintf(arq2, "%d %d %d ", matriz[i][j].r,matriz[i][j].g,matriz[i][j].b);
  228.         }
  229.     }
  230.  
  231.     fclose(arq1);
  232.     fclose(arq2);
  233. }
  234.  */
  235. void Execucao(csv *Dados3, respostas *input, int c, int l, pixel matriz[c][l], int rgb_f[3]){
  236.     int lin = 0, cr = 0,j = 0;
  237.  
  238.     for(int i = 0; i < Dados3->linhas_dados + 1; i++){
  239.         if(strcmp(Dados3->dados[i][0], "polygon") == 0 ){
  240.             int aux =0;
  241.             for (int i = 0; i < input->r_polygon.n_pontos-1; i++){
  242.                 line(input->r_polygon.pos[aux],input->r_polygon.pos[aux+1],input->r_polygon.pos[aux+2],input->r_polygon.pos[aux+3],input->r_imagem.C,input->r_imagem.L, matriz, rgb_f);
  243.                 aux = aux + 2;
  244.             }
  245.         }
  246.         if(strcmp(Dados3->dados[i][0], "line") == 0 ){
  247.             line(input->r_line.lns[lin],input->r_line.lns[lin+1],input->r_line.lns[lin+2],input->r_line.lns[lin+3], input->r_imagem.C, input->r_imagem.L, matriz, rgb_f);
  248.            
  249.              lin = lin + 4;
  250.         }
  251.         if(strcmp(Dados3->dados[i][0], "color") == 0 ){
  252.             rgb_f[0] = input->r_color.col[cr];
  253.             rgb_f[1] = input->r_color.col[cr+1];
  254.             rgb_f[2] = input->r_color.col[cr+2];
  255.            
  256.             cr = cr + 3;
  257.         }
  258.  
  259.         if(strcmp(Dados3->dados[i][0], "save") == 0 ){
  260.  
  261.             FILE *arquivoDestino = fopen(input->r_save.nome_arquivo, "wb");//Faz a escrita no arquivo destino
  262.  
  263.             fprintf(arquivoDestino, "P3\n%d %d\n255\n", input->r_imagem.L, input->r_imagem.C);
  264.  
  265.             for(int i = 0; i < input->r_imagem.C; i++){//Insere a matriz na imagem
  266.                 for(int j = 0; j < input->r_imagem.L; j++){
  267.                     fprintf(arquivoDestino, "%d %d %d ", matriz[i][j].r,matriz[i][j].g,matriz[i][j].b);
  268.  
  269.                 }
  270.             }
  271.  
  272.             fclose(arquivoDestino);
  273.         }
  274.  
  275.         if(strcmp(Dados3->dados[i][0], "open") == 0 ){
  276.             FILE *arquivoDestino2 = fopen(input->r_open.nome_arquivo_anterior, "wb");//Faz a escrita no arquivo destino
  277.  
  278.             fprintf(arquivoDestino2, "P3\n%d %d\n255\n", input->r_imagem.L, input->r_imagem.C);
  279.  
  280.             for(int i = 0; i < input->r_imagem.C; i++){//Insere a matriz na imagem
  281.                 for(int j = 0; j < input->r_imagem.L; j++){
  282.                     fprintf(arquivoDestino2, "%d %d %d ", matriz[i][j].r,matriz[i][j].g,matriz[i][j].b);
  283.  
  284.                 }
  285.             }
  286.  
  287.             fclose(arquivoDestino2);
  288.             //até aqui salva o arquivo anterior com outro nome até chegar no open.
  289.  
  290.             //FuncaoOpen();
  291.         }
  292.  
  293.     }
  294. }
  295.  
  296. int main(){
  297.     respostas resp;
  298.     csv Dados;
  299.     int rgb[3] = {255, 255, 255};//Cor padrão branca
  300.  
  301.     FILE *arquivoOrigem = fopen("input.txt", "r");
  302.     if(arquivoOrigem == NULL){
  303.         printf("Arquivo não existe!");
  304.         return 0;
  305.     }
  306.  
  307.     Transforma_Matriz_string(arquivoOrigem, &Dados);//Fatia a string para que se torne uma matriz de strings
  308.  
  309.     Captar_comandos_e_variaveis(&Dados, &resp);//Faz a leitura dos comandos e capta as variáveis do respectivo comando para utilizar posteriormente
  310.  
  311.     pixel color[resp.r_imagem.C][resp.r_imagem.L];//Cria a MATRIZ
  312.  
  313.     for(int i = 0; i < resp.r_imagem.C; i++){
  314.         for(int j = 0; j < resp.r_imagem.L; j++){//Deixa todos os píxels brancos
  315.             color[i][j].r = rgb[0];
  316.             color[i][j].g = rgb[1];
  317.             color[i][j].b = rgb[2];
  318.         }
  319.     }
  320.  
  321.     Execucao(&Dados,&resp,resp.r_imagem.C,resp.r_imagem.L, color, rgb);
  322.  
  323.     fclose(arquivoOrigem);
  324.  
  325.     return 0;
  326. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement