Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

poklapanje pixela

[es] :: C/C++ programiranje :: C/C++ za početnike :: poklapanje pixela

[ Pregleda: 2794 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Parpil
Aleksa Ristic
Ucenik
Druga Ekonomska Skola
Beograd, Srbija

Član broj: 327493
Poruke: 4
95.180.26.*



Profil

icon poklapanje pixela27.01.2015. u 02:58 - pre 111 meseci
Prvo da objasnim sta mislim pod poklapanjem:

Kad kazem poklapanje mislim na odredjenu figuru napravljenu od pixela koju zelim da iskontrolisem i proverim da li se i jedan pixel te figure poklapa sa nekim pixelom druge figure. Eh sad ja sam to radio samo sa pixelima ali mi problem sad stvara kad sam ja ubacio linije radi lakseg crtanja. Pokusavao sam da primenim istu metodu kao i jos dosta kombinacija koje sam mislio da bi mogle da upale ali nisam uspeo jer ne kapiram bas to kod linija kako ide pa evo vam koda:

Kod za crtanje linija:
Code:

void D3DGraphics::DrawLine( int x1, int y1, int x2, int y2, int r, int g, int bl )
{
    int dx = x2 - x1;
    int dy = y2 - y1;
    if( abs(dy) > abs(dx))
    {
        if( y1 > y2)
        {
            int temp = y2;
            y2 = y1;
            y1 = temp;
            temp = x2;
            x2 = x1;
            x1 = temp;
        }
        float m = (float)dx / (float)dy;
        float b = x1 - m*y1;
        for( int y = y1; y <= y2; y++ )
        {
            int x = m*y + b + 0.5f;
            PutPixel( x,y,r,g,bl );
        }
    }
    else
    {
        if( x1 > x2)
        {
            int temp = y2;
            y2 = y1;
            y1 = temp;
            temp = x2;
            x2 = x1;
            x1 = temp;
        }
        float m = (float)dy / (float)dx;
        float b = y1 - m*x1;
        for( int x = x1; x <= x2; x++ )
        {
            int y = m*x + b + 0.5f;
            PutPixel( x,y,r,g,bl );
        }
    }
}


Kod za crtanje prvog i drugog objetka
Code:

void Game::DrawTank(int xT1, int xY1, int xT2, int xY2)
{
    gfx.DrawLine(910 + xT1, 880 + xY1, 910 + xT2, 800 + xY2, 255, 255, 255);
    gfx.DrawLine(911 + xT1, 880 + xY1, 911 + xT2, 800 + xY2, 255, 255, 255);
    gfx.DrawLine(912 + xT1, 880 + xY1, 912 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(913 + xT1, 880 + xY1, 913 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(914 + xT1, 880 + xY1, 914 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(915 + xT1, 880 + xY1, 915 + xT2, 815 + xY2, 255, 255, 255);
    gfx.DrawLine(916 + xT1, 880 + xY1, 916 + xT2, 815 + xY2, 255, 255, 255);
    gfx.DrawLine(917 + xT1, 880 + xY1, 917 + xT2, 820 + xY2, 255, 255, 255);
    gfx.DrawLine(918 + xT1, 880 + xY1, 918 + xT2, 820 + xY2, 255, 255, 255);
    gfx.DrawLine(919 + xT1, 880 + xY1, 919 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(920 + xT1, 880 + xY1, 920 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(921 + xT1, 880 + xY1, 921 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(922 + xT1, 880 + xY1, 922 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(923 + xT1, 880 + xY1, 923 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(924 + xT1, 880 + xY1, 924 + xT2, 830 + xY2, 255, 255, 255);

    gfx.DrawLine(909 + xT1, 880 + xY1, 909 + xT2, 800 + xY2, 255, 255, 255);
    gfx.DrawLine(908 + xT1, 880 + xY1, 908 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(907 + xT1, 880 + xY1, 907 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(906 + xT1, 880 + xY1, 906 + xT2, 810 + xY2, 255, 255, 255);
    gfx.DrawLine(905 + xT1, 880 + xY1, 905 + xT2, 815 + xY2, 255, 255, 255);
    gfx.DrawLine(904 + xT1, 880 + xY1, 904 + xT2, 815 + xY2, 255, 255, 255);
    gfx.DrawLine(903 + xT1, 880 + xY1, 903 + xT2, 820 + xY2, 255, 255, 255);
    gfx.DrawLine(902 + xT1, 880 + xY1, 902 + xT2, 820 + xY2, 255, 255, 255);
    gfx.DrawLine(901 + xT1, 880 + xY1, 901 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(900 + xT1, 880 + xY1, 900 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(899 + xT1, 880 + xY1, 899 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(898 + xT1, 880 + xY1, 898 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(897 + xT1, 880 + xY1, 897 + xT2, 830 + xY2, 255, 255, 255);
    gfx.DrawLine(896 + xT1, 880 + xY1, 896 + xT2, 830 + xY2, 255, 255, 255);
}

void Game::DrawSpeedUp(int xSU, int ySU)
{
    gfx.PutPixel(1 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 1 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 1 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 2 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 2 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 3 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 3 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 4 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 4 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 5 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 5 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 6 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 6 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 7 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 7 + ySU, 255, 255, 255);

    gfx.PutPixel(1 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(2 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(3 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(4 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(5 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(6 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(7 + xSU, 8 + ySU, 255, 255, 255);
    gfx.PutPixel(8 + xSU, 8 + ySU, 255, 255, 255);
}


Mesto gde treba da ide provera:
Code:

    if(!PickedSU == true)
    {
        if( ovde treba provera za poklapanje)
        {
            PickedSU = false;
        }
        DrawSpeedUp(150, 500);
    }


Ukoliko neko zna to da mi objasni ali mu trebaju jos neke informacije neka mi napise ovde da mu posaljem cele fajlove sa varijablama za ovo ovde (da vidi gde sam ih definisao)
 
Odgovor na temu

Parpil
Aleksa Ristic
Ucenik
Druga Ekonomska Skola
Beograd, Srbija

Član broj: 327493
Poruke: 4
95.180.26.*



Profil

icon Re: poklapanje pixela28.01.2015. u 20:56 - pre 111 meseci
Bump
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: poklapanje pixela29.01.2015. u 09:45 - pre 111 meseci
Prvo: Meni nemoj da šalješ nikakave fajlove i projekte. Nemam vremena.

Drugo: U liniji "if (ovde treba provera za poklapanje)" šta imamo na raspolaganju? Pretpostavljam da je output jedan bool koji kaže da li ima poklapanja, ali koji podaci su input?

Treće: Šta misliš o tome da svaki sprajt (objekat na ekranu) za potrebe detekcije kolizije svedeš na jedan ili par pravougaonika? Možda nije baš neophodno da se detekcija sudara gleda za svaki piksel, nego je dovoljno da se sprajtovi "opasno približe" da bi se to proglasilo za sudar. Vrlo je lako detektovati da li dva pravougaonika imaju zajednički deo, što bi predstavljalo sudar.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: poklapanje pixela29.01.2015. u 13:00 - pre 111 meseci
Sviđa mi se tvoj entuzijazam, ali nisi svestan u šta si se upustio.

Recimo, tvoj algoritam za crtanje linije je najprostiji i najgori mogući.
Nema potrebe izmišljati toplu vodu - koristiš Brezenhajmov algoritam: http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
Pogledaj i druge, recimo za crtanje kružnice...

Kako da vidiš da li su se dva geometrijska oblika sudarila/preklopila? Počni od: http://en.wikipedia.org/wiki/Collision_detection
ili http://en.wikipedia.org/wiki/Computational_geometry pa gde te brauzer odvede.

Malo svetla na probleme u kompjuterskoj grafici: https://www.youtube.com/playli...6n4zXuckrPkEUK5iMQrQyvj9Z6WCrm

Ako znaš algebru (naročito rad sa matricama), trigonometriju i geometriju eto lepe zabave!

[Ovu poruku je menjao djoka_l dana 29.01.2015. u 14:10 GMT+1]
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: poklapanje pixela

[ Pregleda: 2794 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.