Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Algorytm śnieżynka Kocha, ale z kwadratami

Ostatnio zmodyfikowano 2013-05-28 01:48
Autor Wiadomość
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...

C/C++
#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();
    /* add other initializations here */
}

void deinit() {
    clear_keybuf();
    /* add other deinitializations here */
}

P-84127
DejaVu
» 2013-05-28 01:48:31
C/C++
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:
C/C++
void Krzywa( sf::RenderWindow & rw, double x1, double y1, double x2, double y2, int st )
{
    double dx = x2 - x1, dy = y2 - y1;
    if( !st ) { // stopien == 0 - narysowanie linii
        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 { // w pozostalych przypadkach narysowanie 4 krzywych
        // stopnia o 1 mniejszego
       
        // krzywa od (x1,y1) do 1/3 odcinka [(x1,y1),(x2,y2)]
        Krzywa( rw, x1, y1, x1 + dx / 3, y1 + dy / 3, st - 1 );
       
        // krzywa od 2/3 odcinka [(x1,y1),(x2,y2)] do (x2,y2)
        Krzywa( rw, x1 + dx * 2 / 3, y1 + dy * 2 / 3, x2, y2, st - 1 );
       
        // od 1/3 odcinka do wierzcholka trojkata rownobocznego
        // wyznaczonego przez 1/3 odcinka i 2/3 odcinka
        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 );
       
        // od od wierzcholka tr. rownobocz. wyznaczonego przez 1/3 odcinka i 2/3 odcinka
        // do 2/3 odcinka
        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.cpp
http://kaims.pl/~kuszner/2004/pp/L7/index.html

C/C++
Krzywa( 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.
P-84165
« 1 »
  Strona 1 z 1