Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Bresenhamin viiva-algoritmi

Burton [15.04.2010 22:01:25]

#

Heippa!

Tutkiskelin Bresenham'n viiva-algoritmia ja toteutin siitä oman version (kopioimalla pseudokoodin C:ksi ja hoitamalla grafiikan SDL:n avulla). Versioni on kuitenkin puutteellinen - tai en ymmärrä jotain.

void drawLine(int x0, int y0, int x1, int y1) {
        Uint32 *ptr;
        int dy = y1 - y0, dx = x1 - x0;
        int stepx, stepy;

        if (dy < 0) {
                dy = -dy;
                stepy = -1;
        }
        if (dx < 0) {
                dx = -dx;
                stepx = -1;
        }
        dy <<= 1; dx <<= 1;

        SDL_FillRect(screen, NULL, 0);

        if (SDL_MUSTLOCK(screen))
                SDL_LockSurface(screen);

        ptr = (Uint32 *)screen->pixels;
        ptr[x0 * (screen->pitch >> 2) + y0] = RGB(255, 0, 0);

        if (dx > dy) {
                int fraction = dy - (dx >> 1);
                while (x0 != x1) {
                        if (fraction >= 0) {
                                y0 += stepy;
                                fraction -= dx;
                        }
                        x0 += stepx;
                        fraction += dy;
                        ptr[x0 * (screen->pitch >> 2) + y0] = RGB(255, 0, 0);
                }
        } else {
                int fraction = dx - (dy >> 1);
                while (y0 != y1) {
                        if (fraction >= 0) {
                                x0 += stepx;
                                fraction -= dy;
                        }
                        y0 += stepy;
                        fraction += dx;
                        ptr[x0 * (screen->pitch >> 2) + y0] = RGB(255, 0, 0);
                }
        }

        if (SDL_MUSTLOCK(screen))
                SDL_UnlockSurface(screen);

        SDL_Flip(screen);
}

Funktiokutsu drawLine(0, 0, 639, 479) kaataa ohjelman selittämättömästi, kuten myös kaikki yritykset piirtää pitkä viiva. Lyhkäinen drawLine(200, 200, 100, 100) tekee, mitä pitääkin.

Mistä ongelma voisi johtua? En ole tehnyt kopioinnissa yhtäkään (minun silmääni) näkyvää virhettä. Koodi on identtinen opassivun tekstin kanssa.

Metabolix [15.04.2010 22:16:59]

#

Lisää ennen kunkin pikselin piirtoa koordinaattien tulostus tiedostoon, niin näet, meneekö jokin pieleen. Ainakin muuttujien stepx ja stepy alustus puuttuu, jos dx ja dy ovat positiiviset.

Burton [16.04.2010 00:11:39]

#

Näköjään onkin. stepx ja stepy saavat arvon 1, jos ehdot eivät toteudu.

Ongelmani oli kuitenkin nolompi! Olin sijoittanut x:n ja y:n arvot väärinpäin eksoottiseen piirtotapaani. :(

ptr[x0 * (screen->pitch >> 2) + y0] --> ptr[y0 * (screen->pitch >> 2) + x0]

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta