-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfractalii.c
137 lines (116 loc) · 4.74 KB
/
fractalii.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//Preenchimento de espaço de Hilbert
//Axioma: X (teta = 90º)
//Regras: X -> -YF+XFX+FY-
//Y -> +XF-YFY-FX+
//gcc -o fractalii fractalii.c -lSDL2 -lm | ./fractalii
#include <stdio.h>
#include <string.h>
#include "SDL2/SDL.h"
#include <math.h>
int main() {
char entrada[10000]; // X
char regraX[10000]; // -YF+XFX+FY-
char regraY[10000]; // +XF-YFY-FX+
char saida[10000];
int numFractal;
int angulacao; // 90
int estagio = 4;
FILE *arquivo; // abrir o arquivo "saidaFractalii.txt" para escrita
arquivo = fopen("saidaFractalii.txt", "w");
if (arquivo == NULL) {
printf("Erro ao abrir o arquivo.\n");
return 1;
}
printf("Número do fractal: "); // leitura dos dados do fractal
scanf("%d", &numFractal);
printf("Axioma: ");
scanf("%s", entrada);
printf("Angulo em graus: ");
scanf("%d", &angulacao);
printf("Regra de X: ");
scanf("%s", regraX);
printf("Regra de Y: ");
scanf("%s", regraY);
memset(saida, 0, sizeof(saida)); // memset(str, c, n) - copia o caracter c para os n primeiros caracteres do char apontada por str
int lenEntrada = strlen(entrada); // srtlen - retorna o tamanho do char
int lenSaida;
int j = 0;
for (int h = 0; h < estagio; h++){
memset(saida, 0, sizeof(saida));
for (int i = 0; i < lenEntrada; i++) { // iterar pelas posições da entrada, para substituí-la pelo estágio atual
if (entrada[i] == 'X') {
strcat(saida, regraX); // strcat - juntar dois char
} else if (entrada[i] == 'Y') {
strcat(saida, regraY);
} else {
strncat(saida, &entrada[i], 1); // strncat - igual strcat, mas digo a quantidade que quero juntar
}
}
memset(entrada, 0, sizeof(entrada)); // limpa a entrada
strcat(entrada, saida); // adiciona os char de saida na entrada
lenEntrada = strlen(entrada); // lenEntrada e lenSaida são atualizados
lenSaida = strlen(saida);
fprintf(arquivo, "Estágio %d: ", h+1);
for (int s = 0; s < lenSaida; s++) { // imprimir o estágio atual do fractal no arquivo
if(h != 3){
fprintf(arquivo, "%c", saida[s]);
} else{
if(saida[s] == 'F' || saida[s] == '-' || saida[s] == '+'){
fprintf(arquivo, "%c", saida[s]); // para que imprima apenas o 'F', '-' e '+' no estágio 4
}
}
}
fprintf(arquivo, "\n");
}
fclose(arquivo);
/* IMAGEM FRACTAL - CÓDIGO COM SDL2*/
SDL_Window *window = NULL; // criação de janela e renderizador
SDL_Renderer* renderer = NULL;
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
fprintf(stderr, "SDL falhou ao inicializar: %s\n", SDL_GetError());
return 1;
}
window = SDL_CreateWindow(
"Preenchimento de espaço de Hilbert",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
800, 600, 0
);
if (window == NULL) {
fprintf(stderr, "Falha ao inicializar a janela SDL: %s\n", SDL_GetError());
return 1;
}
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); // define a cor (branco)
// ATENÇÂO: os nomes das variáveis estão relacionados às coordenadas (x,y), não aos X e Y das regras
lenSaida = strlen(saida); // lenSaida é atualizado
double inicioX = 200;
double finalX = inicioX;
double inicioY = 500;
double finalY = inicioY;
double tamanhoLinha = 400 / (pow(2, estagio) - 1); // para que a imagem continue do mesmo tamanho na tela
double altura;
double angulo = M_PI/2;
double direcao = 0;
for (int s = 0; s < lenSaida; s++) {
if (saida[s] == 'F'){
double deltaX = tamanhoLinha * cos(direcao);
double deltaY = tamanhoLinha * sin(direcao);
double finalX = inicioX + deltaX;
double finalY = inicioY - deltaY;
SDL_RenderDrawLine(renderer, inicioX, inicioY, finalX, finalY); // desenha a linha com essas coordenadas de início e fim
inicioX = finalX;
inicioY = finalY;
} else if (saida[s] == '-') { // mudança de direção em 90º no sentido anti-horário
direcao += angulo;
} else if (saida[s] == '+') { // mudança de direção em 90º no sentido horário
direcao -= angulo;
}
}
SDL_RenderPresent(renderer); // exibe o fractal na tela
SDL_Delay(5000); // tempo da imagem na tela (em milissegundos)
SDL_DestroyRenderer(renderer); // exclusão de janela e renderizador
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}