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

[C++][Allegro5] Problem z obliczeniem pola bitmapa(z alpha)

Ostatnio zmodyfikowano 2016-02-15 11:35
Autor Wiadomość
00Andre
Temat założony przez niniejszego użytkownika
[C++][Allegro5] Problem z obliczeniem pola bitmapa(z alpha)
» 2016-02-05 20:42:48
Siemka

Mam mały problem, otóż bitmap jest obracany względem punktu w/2, h/2

Potrzebuje obliczyć pole bitmapa z alpha

Tutaj obrazek:
problem
problem

Obliczenie początkowego pola jest łatwe:
C/C++
float fx = x -( w / 2 );
float fy = y -( h / 2 );

fx + w...
fy + h...

Problem jest przy obróceniu o dany kąt.
Próbowałem pozycje fx pomnożyć przez
speed * cos(( angle * M_PI ) / 180 ) )
 i fy
speed * sin(( angle * M_PI ) / 180 ) )
Ale nie wychodziło poprawnie pole.

Ma ktoś jakiś pomysł jak to zrobić ?
P-144532
marianekA
» 2016-02-06 02:50:28
Nie wiem do czego Ci to potrzebne ale spróbuj od razu zrobić pole w którym zmieści się obiekt w każdej pozycji.
P-144539
00Andre
Temat założony przez niniejszego użytkownika
» 2016-02-06 10:34:10
Potrzebuje to przy funkcji np. klikniecie na bitmap. Myszka musi być na polu bitmapa(z alpha). Ten twój sposób jest nawet fajny, dzisiaj to spróbuje zrobić to
P-144541
marianekA
» 2016-02-08 00:29:22
Ja to robię tak:
bitmap z obrazkiem na czarnym tle (0,0,0),
tło deklaruję jako przezroczyste.
Przy użyciu funkcji
al_get_pixel( bitmap, mx, my )
i składowych RGB mam kolor pixela pod wskaźnikiem myszki.
C/C++
//...
ALLEGRO_COLOR kolor = al_get_pixel( bitmap, mx, my );
unsigned char r, g, b;
al_unmap_rgb( kolor, & r, & g, & b );
rgb = r + g + b;
if( rgb > 0 i klik myszki ) tu Twoje zdarzenie...
//...
W ten sposób można robić np. przyciski o przeróżnych kształtach.
P-144593
00Andre
Temat założony przez niniejszego użytkownika
» 2016-02-11 11:45:50
Może źle to wytłumaczyłem.

@marianekA U mnie funkcja działa dobrze, wiem jak to zrobić z klikaniem ;)

Jak jest bitmap (nie obracany) to jest sprawdzane położenie myszki, czy jest na bitmapie(jego polu z alpha) i to działa.
wtedy szerokość i wysokość bitamp'a pasują.

Ale jak już obrócę bitmap'a o dany kąt, to szerokość i wysokość początkowa nie pasuje, bo trzeba ustawić do obróconego bitmapa. Bo jak ustawie pole podstawowe bitmapa do obróconego to jedynie fragment jego lub jakoś cześć nie będzie dostępna.
   
problem
problem

Nie wiem jak obliczyć szerokość i wysokość po obróceniu, aby pole bitmapa pasowało do do bitmapa obróconego o dany kąt

// Obrazek robiłem w Paincie, może być nie dokładny xd
P-144730
marianekA
» 2016-02-12 14:17:20
Przecież bitmap z obiektem na ekranie jest jak warstwa,
możesz mieć ją nawet na cały ekran,
tło tej bitmapy ustawiasz jako przezroczyste i widoczny jest tylko obiekt.
  Robisz z nim co chcesz nawet kolizje tyle że z pominięciem koloru tła - tego przezroczystego.

Jeśli już koniecznie musi być jak to sobie zaplanowałeś to mogłoby być tak:
Tworzysz dodatkowy bitmap o na którym zmieści się swobodnie Twój obiekt w każdej pozycji.
Tło przezroczyste, na nim wstawiasz Twój obiekt obrócony o zaplanowany kąt.
Ja w przykładzie użyłem tła czarnego (0,0,0)

Teraz przydatna funkcja
al_get_pixel()
 o której wcześniej pisałem.

         szerokość obiektu:
 
C/C++
unsigned char r, g, b; //składowe koloru
int szerokosc = 0, wysokosc = 0;
int v = 0; // początkowa wartość
for( int x = 0; x < al_get_bitmap_width( dodatkowy_bitmap ); ++x )
for( int y = 0; y < al_get_bitmap_height( dodatkowy_bitmap ); ++y )
{
    al_unmap_rgb( al_get_pixel( dodatkowy_bitmap, x, y ), & r, & g, & b );
    kolor = r + g + b;
    //gdy pierwszy raz trafi na kolor inny niż tło
    if( kolor > 0 && v == 0 ) v = x;
    //ustala szerokość obiektu
    if( kolor > 0 && v > 0 ) szerokosc = x - v + 1;
   
}
cout << "szerokosc= " << szerokosc << endl;
Wysokość obiektu ustalasz analogicznie i już masz dane do wielkości pola.

Dodam tylko że pewnie z tego nie skorzystasz bo sprawdzenie pola 100x100
funkcją al_get_pixel() trwa 2 sekundy, pola 200x200 to już ponad 30 sekund
P-144780
00Andre
Temat założony przez niniejszego użytkownika
Hurra
» 2016-02-15 11:35:05
Rozwiązałem problem samodzielnie, ale dzięki, że podawałeś pomysły.

Obliczyłem długość odcinka {x, x+(w/2)} {y, y+(h/2)} i działa.

Szerokość i wysokość podzielone przez dwa, ponieważ pozycja {x, y} jest środkiem bitmapa

oto kod rozwiązanie
C/C++
// dystans
double dst = sqrt( pow(( x +( w / 2 ) ) - x, 2 ) + pow(( y +( h / 2 ) ) - y, 2 ) );

// aby narysować
al_draw_rectangle( x - dst, y - dst, x + dst, y + dst, al_map_rgb( 0, 0, 0 ), 1 );
P-144890
« 1 »
  Strona 1 z 1