void sierpinski(turtle* t, int len, int iters){ int part; part = len/3; if(iters <=1 ){ turnLeft(t, 60); makeLine(t, part); turnRight(t, 60); makeLine(t, part); turnRight(t, 60); makeLine(t, part); turnLeft(t, 60); return; } turnLeft(t, 60); mirrorTurtle(t); sierpinski(t, part, iters-1); mirrorTurtle(t); turnRight(t, 60); sierpinski(t, part, iters-1); turnRight(t, 60); mirrorTurtle(t); sierpinski(t, part, iters-1); mirrorTurtle(t); turnLeft(t, 60); }
/*Funçao recursiva que desenha o Triangulo de Sierpinski Parametros: x - Posição X da ponta esquerda y - Posição Y da ponta esquerda size - Tamanho do lado amount - Ponteiro para a somatoria da quantidade de triangulos Retorno: Nenhum */ void sierpinski(unsigned int x, unsigned int y, unsigned int size, unsigned int* amount){ double h; if(size > 5){ /*Se o novo triangulo não for muito pequeno*/ h = (size * sqrt(3)) / 2; sierpinski(x + 3 * (size / 4), y + (h / 2), size / 2, amount);/*Desenha o triangulo da direita*/ sierpinski(x - (size / 4), y + (h / 2), size / 2, amount);/*Desenha o triangulo da Esquerda*/ sierpinski(x + (size / 4), y - (((size / 2) * sqrt(3)) / 2), size / 2, amount);/*Desenha o triangulo de cima*/ triangle(x, y, size, h); /*Desenha o triangulo*/ *amount += 1; /*Incrementa a quantidade de triangulos*/ } }
//Called from interface.c void generate_fractal(Draw *fractal, SDL_Win *window, int i) { if(strcmp(fractal->type[i], "sierpinski") == 0){ sierpinski(fractal, window, i); } else if(strcmp(fractal->type[i], "tree") == 0){ tree(fractal, window, i); } else if(strcmp(fractal->type[i], "star") == 0){ star(fractal, window, i); } }
void sierpinski(double lungime, int nivel, CPunct &p, CVector v, bool invers) { if (nivel == 0) { v.deseneaza(p, lungime); p = v.getDest(p, lungime); } else { if(invers) { v.rotatie(60); sierpinski(lungime / 2, nivel - 1, p, v, false); v.rotatie(-60); sierpinski(lungime / 2, nivel - 1, p, v, true); v.rotatie(-60); sierpinski(lungime / 2, nivel - 1, p, v, false); v.rotatie(60); } else { v.rotatie(-60); sierpinski(lungime / 2, nivel - 1, p, v, true); v.rotatie(60); sierpinski(lungime / 2, nivel - 1, p, v, false); v.rotatie(60); sierpinski(lungime / 2, nivel - 1, p, v, true); v.rotatie(-60); } } }
void aplicar_sierpinski(configuracion_t *config) { unsigned long a,b; a = 0; b = 0; MEDIR_TIEMPO_START(a); sierpinski_fn_t *sierpinski = SWITCH_C_ASM ( config, sierpinski_c, sierpinski_asm ) ; buffer_info_t info = config->src; MEDIR_TIEMPO_START(a); sierpinski(info.bytes, config->dst.bytes, info.width, info.height, info.width_with_padding, config->dst.width_with_padding); MEDIR_TIEMPO_STOP(b); fprintf(config->archivo_mediciones, "%lu\n", b-a); }
void main(){ turtle pica; int gd=DETECT, gm; initgraph(&gd, &gm, NULL); pica.angle = 0; pica.side = 1; setcolor(BLUE); setbkcolor(WHITE); moveto(getmaxx()/2 - 150, 360); setlinestyle(SOLID_LINE, 0, 2); //experiment here //change second argument to change length //need powers of three to avoid mishaps when making //multiple fractals //change last paramter to define recursion depth sierpinski(&pica, 3800, 6); delay(1000*10); closegraph(); }
void afisare(double lungime, int nivel) { CVector v(0, 1); CPunct p(-0.9, -0.9); sierpinski(lungime, nivel, p, v, false); }
int main(int argc, char* argv[]){ unsigned int size;/*Tamanho do triangulo*/ unsigned int default_size;/*Tamanho padrão do triangulo*/ unsigned int amount; /*Quantidade de triangulos*/ int quit; /*Verifica se o programa deve ser encerrado*/ char* msg; /*Auxiliar para colocar as informaçoes na tela*/ SDL_Event event; /*guarda um evento ocorrido*/ msg = (char*) malloc(sizeof(char) * 30); /*Aloca memoria para a string auxiliar*/ if(!msg){/*Verifica se foi alocado*/ printf("Erro ao alocar memoria.\n"); exit (0); } amount = 0;/*Inicializa o contador de triangulos*/ default_size = 100;/*Define o tamanho padrão do triangulo para caso o usuario não tenha definido*/ if(argc != 1){/*Verifica se foi passado algum argumento na chamada do programa*/ if(atoi(argv[1]) != 0){/*Se o argumento for um numero ele sera o tamanho padrão do triangulo*/ default_size = atoi(argv[1]); } } size = default_size;/*Define o tamanho com o tamanho padrão*/ gfx_init("Sierpinski");/*Seta o nome da janela*/ sierpinski((gfx_get_width() / 2) - (size / 2), gfx_get_height() - (int)((size * 1.732050808) / 2), size, &amount);/*Desenha o triangulo com o tamanho incial*/ sprintf(msg, "Lado: %d Quantidade: %u", size, amount); gfx_text(10, 10, msg);/*Imprime as informacões do triangulo*/ gfx_text(10, 30, "Atalhos: Zoom(i)n - Zoom(o)ut - (C)lear - (esc)ape");/*Imprime o menu*/ gfx_paint(); while(!quit){/*Loop principal*/ while(SDL_PollEvent(&event)){/*Verifica se ocorreu algum evento*/ switch(event.type){/*Seleciona o tipo de evento*/ case SDL_QUIT:/*Clique no botão de fechar*/ quit = 1;/*sair do loop principal*/ break; case SDL_KEYDOWN:/*Tecla pressionada*/ while(event.key.state == SDL_PRESSED && quit == 0){/*Tecla continua pressionada e não é o ESC*/ switch (event.key.keysym.sym){/*Seleciona a tecla*/ case SDLK_i:/*Caso seja 'i' os triangulos aumentam*/ size += 5;/*Incrementa o tamanho do triangulo*/ gfx_clear();/*Limpa a tela*/ amount = 0;/*Zera o contador de triangulos*/ sierpinski((gfx_get_width() / 2) - (size / 2), gfx_get_height() - (int)((size * 1.732050808) / 2), size, &amount);/*Desenha o triangulo de Sierpinski*/ sprintf(msg, "Lado: %d Quantidade: %u", size, amount); gfx_text(10, 10, msg);/*Imprime as informacões do triangulo*/ gfx_text(10, 30, "Atalhos: Zoom(i)n - Zoom(o)ut - (C)lear - (esc)ape");/*Imprime o menu*/ break; case SDLK_o:/*Caso seja 'o' os triangulos diminuem*/ size -= 5; gfx_clear(); amount = 0; sierpinski((gfx_get_width() / 2) - (size / 2), gfx_get_height() - (int)((size * 1.732050808) / 2), size, &amount); sprintf(msg, "Lado: %d Quantidade: %u", size, amount); gfx_text(10, 10, msg);/*Imprime as informacões do triangulo*/ gfx_text(10, 30, "Atalhos: Zoom(i)n - Zoom(o)ut - (C)lear - (esc)ape");/*Imprime o menu*/ break; case SDLK_c: /*Caso seja 'c' o triangulo é resetado*/ size = default_size;/*Define o tamanho com o tamanho padrão*/ gfx_clear();/*Limpa tela*/ amount = 0;/*Zera o contador de triangulos*/ sierpinski((gfx_get_width() / 2) - (size / 2), gfx_get_height() - (int)((size * 1.732050808) / 2), size, &amount);/*Desenha o triangulo com o tamanho padrão*/ sprintf(msg, "Lado: %d Quantidade: %u", size, amount); gfx_text(10, 10, msg);/*Imprime as informacões do triangulo*/ gfx_text(10, 30, "Atalhos: Zoom(i)n - Zoom(o)ut - (C)lear - (esc)ape");/*Imprime o menu*/ break; case SDLK_ESCAPE: /*Caso seja 'ESC' encerra o programa*/ quit = 1; break; default:/*Outra tecla nada é feito*/ break; } gfx_refresh();/*Atualiza a tela*/ usleep(120000);/*Delay para ler um novo evento*/ SDL_PollEvent(&event);/*Le um novo evento*/ } break; } } } gfx_quit();/*Fecha a janela*/ free(msg);/*Libera a memoria alocada*/ return 0; }