void peanogosper ( ponto pt1, ponto pt2, double ang, int tipobase, int interacao) { ponto prox, atual; int base, n, p, interac; double dist; base = tipobase; atual = pt1; dist = distancia ( pt1 , pt2 )/sqrt(7); for ( n = 0; n < 7; n++) { interac = interacao; switch ( ( n%7 ) ) { case 0: p = 0; break; case 1: p = 1; break; case 2: p = 3; break; case 3: p = 2; break; case 4: case 5: p = 0; break; case 6: p = -1; break; } if ( interac > 0 ) { prox.x = atual.x + dist*cos( ang + angbase + (p * (pi)/3) ); prox.y = atual.y + dist*sin( ang + angbase + (p * (pi)/3) ); peanogosper( atual , prox, angulo ( atual , prox ), base, --interac ); } else if ( interacao == 0 ) { if ( multicor == 1 ) escolhecor ( fabs( cos( atual.x ) ) , fabs ( cos ( prox.x) ), fabs ( cos ( atual.y ) ) ); draw_segmento(atual , prox); } atual = prox; } }
void poligono ( ponto pt , double lado, int nlado ) { ponto atual, prox; int k = 0; double angext = (2*pi)/nlado; atual = pt; pts[0] = pt; for ( k = 0; k < nlado ; k ++) { prox.x = atual.x + lado*cos( k*angext ); prox.y = atual.y + lado*sin( k*angext ); pts[k+1] = prox; angpts[k] = angulo ( pts[k] , pts[k+1] ); /* draw_segmento(atual , prox); */ atual = prox; } }
void ilhadekochQI( ponto pt1, ponto pt2, double ang, int tipobase, int interacao) { ponto prox, atual; int base, n, p, interac; double dist; base = tipobase; atual = pt1; dist = distancia ( pt1 , pt2 )/4; for ( n = 0; n < 8; n++) { interac = interacao; switch ( ( n%8 ) ) { case 0: case 7: case 2: case 5: p = 0; break; case 1: case 6: p = 1; break; case 3: case 4: p = -1; break; } prox.x = atual.x + dist*cos( ang + (p * (pi)/2) ); prox.y = atual.y + dist*sin( ang + (p * (pi)/2) ); if ( interac > 0 ) { ilhadekochQI( atual , prox, angulo ( atual , prox ), base, --interac ); } else if ( interacao == 0 ) { if ( multicor == 1 ) escolhecor ( fabs( cos( atual.x ) ) , fabs ( cos ( prox.x) ), fabs ( cos ( atual.y ) ) ); draw_segmento(atual , prox); } atual = prox; } }
int direcao(int x, int y) { /*Baseando-se nas componentes da velocidade, define a direção.*/ double ang; ang = angulo(x, y); while(ang > 360.0) { ang-=360.0; } if(ang >= 337.5 || ang < 22.5) return L; else if(ang >= 22.5 && ang < 67.5 ) return NE; else if(ang >= 67.5 && ang < 112.5) return N; else if(ang >= 112.5 && ang < 157.5) return NO; else if(ang >= 157.5 && ang < 202.5) return O; else if(ang >= 202.5 && ang < 247.5) return SO; else if(ang >= 247.5 && ang < 292.5) return S; else if(ang >= 292.5 && ang < 337.5) return SE; return -1; }
void ilhadekochQII( ponto pt1, ponto pt2, double ang, int tipobase, int interacao) { ponto prox, atual; int base, n, p, interac; double dist; base = tipobase; atual = pt1; dist = distancia ( pt1 , pt2 )/8; for ( n = 0; n < 32; n++) { interac = interacao; switch ( ( n%32 ) ) { case 1: case 5: case 6: case 8: case 13: case 14: case 17: case 18: case 23: case 25: case 26: case 30: p = 0; break; case 3: case 11: case 20: case 28: p = 2; break; case 0: case 2: case 4: case 7: case 24: case 27: case 29: case 31: p = 1; break; case 9: case 10: case 12: case 15: case 16: case 19: case 21: case 22: p = -1; break; } prox.x = atual.x + dist*cos( ang + (p * (pi)/2) ); prox.y = atual.y + dist*sin( ang + (p * (pi)/2) ); if ( interac > 0 ) { ilhadekochQII( atual , prox, angulo ( atual , prox ), base, --interac ); } else if ( interacao == 0 ) { if ( multicor == 1 ) escolhecor ( fabs( cos( atual.x ) ) , fabs ( cos ( prox.x) ), fabs ( cos ( atual.y ) ) ); draw_segmento(atual , prox); } atual = prox; } }