[allegro 2D] - maly problem z obrotem bitmapy

0

Czesc
Mam za zadanie napisac program, ktory bedzie dokonywal obrotu bitmapy (ma to byc wlasna implementacja). Zadanie chce zrealizowac przy pomocy biblioteki allegro i wyglada to tak ze to dziala tylko jest maly problem. Opisze troche jak to zrobilem.

  1. Laduje bitmape (jakis plik .bmp)
  2. Pobieram w petlach (wys x szer) kolor poszczegolych pixeli
  3. Dokonuje wyznaczenia wspolrzednych piksela po pransformacji i wypelniam go pobranym kolorem.
    (wyswietlanie jest realizowane przy uzyciu dodatkowego bufora, aby zapobiec efektowi "rysowania" jaki wystepuje przy rysowaniu pikseli "na żywo")
	for (int i=0; i < (img->w); ++i)
            for(int j=0; j < (img->h); ++j)
            {
				// Pobieranie koloru kolejnych pixeli z bitmapy
                pixel_color = getpixel(img,i,j);
				// Obliczenie nowej współrzędnej x dla danego pixela
                pixel_x = i * cos(alfa) - j * sin(alfa);
				// Obliczenie nowej współrzędnej y dla danego pixela
                pixel_y = i * sin(alfa) + j * cos(alfa);

				// Wyświetlenie przesuniętego pixela
                putpixel( buffer,
						  pixel_x + x1,
						  pixel_y + y1,
						  pixel_color
				);
            }

Problem polega na tym ze podczas obrotu o kolejny kąt obrazek jest poprawnie obrocony tylko wystepuja tak jakby "dziury" w bitmapie - "przezroczyste piksele" prawdopodobnie spowodowane bledami zaokraglenia, jesli ktos wie jak sobie z tmy poradzic to prosze o sugestie :)). Dzieki

0

Musisz to robić odwrotnie - to znaczy dla każdego punktu wynikowego obrazka obliczać skąd należy dla niego wziąć wartość - w ten sposób jeden pixel po obrocie może zamienić się w kilka i nie powstaną dziury.

0

zrobilem tak ze dokladam jeszcze jednego piksela obok otrzymanego i w tym samym kolorze i dziala.

PS. Ucho nie zabardzo moge to rozkminic co napisales, znaczy wydaje mi sie ze jest najstepujaca akcja tzn. kilka pikseli po transformacji staje sie jednym wynika to z błędów zaokraglenia [???]

0

Lepiej użyj biblioteki easyBMP

0
several napisał(a)

Lepiej użyj biblioteki easyBMP

Czytaj uważniej treść posta: ma być "ręcznie".
Do autora wątka: prawidłowym rozwiązaniem jest nie liczenie sąsiednich pikseli, a właśnie dokonywanie transformacji odwrotnej (dla każdego piksela wyjściowego liczenie piksela źródłowego).

Robisz to mniej więcej tak:

        for (int i=0; i < (img->w); ++i)
            for(int j=0; j < (img->h); ++j)
            {
                                // Obliczenie STAREJ współrzędnej x dla danego nowego pixela
                pixel_x = i * cos(-alfa) - j * sin(-alfa);
                                // Obliczenie STAREJ współrzędnej y dla danego nowego pixela
                pixel_y = i * sin(-alfa) + j * cos(-alfa);
                                // Pobieranie koloru wyliczonego pixela z bitmapy
                pixel_color = getpixel(img,pixel_x,pixel_y);
                                // Wyświetlenie przesuniętego pixela
                putpixel( buffer,
                                                  i + x1,
                                                  j + y1,
                                                  pixel_color
                                );
            }

Poprawki robione w ciemno, nie sprawdzałem.

0

szukalem tego ^^ jak ktos by mogl mi wytlumaczyc,co to sa x1, y1 oraz jaki to tyb, byl bym wdzieczny ^^

1 użytkowników online, w tym zalogowanych: 0, gości: 1