kubu444 Temat założony przez niniejszego użytkownika |
[C++] Algorytm śnieżynka Kocha, ale z kwadratami » 2013-05-27 20:28:30 Witam, mam problem z programem który mialby tworzyc Sniezynke Kocha, w ktorej zamiast trojkatow wystepuja kwadraty. Program dziala nie do konca jak powinien oraz na drugim poziomie nie powstaja poboczne mniejsze kwadraciki, bylbym wdzieczy jezeli ktos moglby wytknac moje bledy albo poprawic kod... #include <allegro.h> #include <cmath>
void init(); void deinit(); void koch( int xp, int yp, int xk, int yk, int poziom ) { int xa, ya, xb, yb, xc, yc, xd, yd; if( poziom > 0 ) { xa =( 2 * xp + xk ) / 3; xb = xa -( ya - yp ); xc = xd -( yk - yd ); xd =( xp + 2 * xk ) / 3; ya =( 2 * yp + yk ) / 3; yb = ya -( xp - xa ); yc = yd -( xd - xk ); yd =( yp + 2 * yk ) / 3; koch( xp, yp, xa, ya, poziom - 1 ); koch( xa, ya, xb, yb, poziom - 1 ); koch( xb, yb, xc, yc, poziom - 1 ); koch( xc, yc, xd, yd, poziom - 1 ); koch( xd, yd, xk, yk, poziom - 1 ); } else line( screen, xp, yp, xk, yk, makecol( 255, 255, 255 ) ); };
int main() { init(); while( !key[ KEY_ESC ] ) { koch( 0, 300, 600, 300, 1 ); } deinit(); return 0; } END_OF_MAIN()
void init() { int depth, res; allegro_init(); depth = desktop_color_depth(); if( depth == 0 ) depth = 32; set_color_depth( depth ); res = set_gfx_mode( GFX_AUTODETECT_WINDOWED, 600, 600, 0, 0 ); if( res != 0 ) { allegro_message( allegro_error ); exit( - 1 ); } install_timer(); install_keyboard(); install_mouse(); }
void deinit() { clear_keybuf(); } |
DejaVu |
» 2013-05-28 01:48:31 int main() { init(); int i = 0; while( !key[ KEY_ESC ] ) { koch( 0, 300, 600, 300, ++i ); } deinit(); return 0; }
/edit: W sumie Twój algorytm ma znacznie więcej błędów. Krzywa Kocha dla trójkątów: void Krzywa( sf::RenderWindow & rw, double x1, double y1, double x2, double y2, int st ) { double dx = x2 - x1, dy = y2 - y1; if( !st ) { sf::VertexArray va( sf::Lines ); va.append( sf::Vertex( sf::Vector2f( x1, y1 ) ) ); va.append( sf::Vertex( sf::Vector2f( x2, y2 ) ) ); rw.draw( va ); } else { Krzywa( rw, x1, y1, x1 + dx / 3, y1 + dy / 3, st - 1 ); Krzywa( rw, x1 + dx * 2 / 3, y1 + dy * 2 / 3, x2, y2, st - 1 ); Krzywa( rw, x1 + dx / 3, y1 + dy / 3, ( x1 + x2 ) / 2 + std::sqrt( 3.) / 6 * dy,( y1 + y2 ) / 2 - std::sqrt( 3.) / 6 * dx, st - 1 ); Krzywa( rw,( x1 + x2 ) / 2 + std::sqrt( 3.) / 6 * dy,( y1 + y2 ) / 2 - std::sqrt( 3.) / 6 * dx, x1 + dx * 2 / 3, y1 + dy * 2 / 3, st - 1 ); } }
http://kaims.pl/~kuszner/2004/pp/L7/koch.cpphttp://kaims.pl/~kuszner/2004/pp/L7/index.htmlKrzywa( window, 50, 300, 750, 300, ++iKoch ); if( iKoch > 5 ) iKoch = 5;
window.display();
Twój kod nie rysuje nawet poprawnie poziomu pierwszego, więc musisz wziąć kartkę i długopis do ręki i obliczyć prawidłowo współrzędne. |