[#1] Wypelnianie trojatow - znikanie grup trojkatow
Mam dziwny problem z pewna funkcja, ktora wypelnia mi trojkat:
Od razu uprzedzam ze kod bedzie na poziomie przedszkola, ale w pewnych kwestiach abym cos zrozumial musze miec to jasno przedstawione dlatego programuje tak jak rozumuje.

Na poczatek napisalem sobie cos takiego:

void WypelnijTrojkat(int Ax, int Ay, int Bx, int By, int Cx, int Cy, kolor)
{
int px, py, sx1, sx2, a1, a2, a3;
// ------------- sortowanie wierzcholkow ------------

if(Ay > Cy)
{
px = Cx; py = Cy;
Cx = Ax; Cy = Ay;
Ax = px; Ay = py;
}

if(Cy > By)
{
px = Bx; py = By;
Bx = Cx; By = Cy;
Cx = px; Cy = py;

if(Ay > Cy)
{
px = Cx; py = Cy;
Cx = Ax; Cy = Ay;
Ax = px; Ay = py;
}
}

// ------------- wyznaczanie wspolczynnikow ---------

if((Cy - Ay) != 0)
{
a1 = (Cx - Ax) / (Cy - Ay);
}

if((By - Ay) != 0)
{
a2 = (Bx - Ax) / (By - Ay);
}

if((Cy - By) != 0)
{
a3 = (Cx - Bx) / (Cy - By);
}

// ------------- wypelnianie trojkata -----------------

for(y=0; y<Cy-Ay; y++)
{
if((y + Ay) > 255) return;

sx1 = (y * a1) + Ax;
sx2 = (y * a2) + Ax;

RysujLiniePozioma(sx1, sx2, y + Ay, kolor);
}

for(y=0; y<By-Cy; y++)
{
if((y + Cy) > 255) return;

sx1 = (y * a3) + Cx;
sx2 = ((y + (Cy-Ay)) * a2) + Ax;

RysujLiniePozioma(sx1, sx2, y + Cy, kolor);
}
}

I wszystko dziala, jest OK. Niewazne jak zlozony objekt bym wypelnial trojkatami w jakimkolwiek miejscu ekranu,jest w jak nalpeszym pozadku.

Postanowilem jednak ostatnia czesc kodu zamienic na cos prostrzego:

if(Ay == Cy) sx1 = Cx;
else sx1 = Ax;

sx2 = Ax;

for(; Ay<Cy; Ay++)
{
if(Ay > 255) return;

sx1 += a1;
sx2 += a2;

RysujLiniePozioma(sx1, sx2, Ay, kolor);
}

for(; Ay<By; Ay++)
{
if(Ay > 255) return;

sx1 += a3;
sx2 += a2;

RysujLiniePozioma(sx1, sx2, Ay, kolor);
}

I teraz zaczely sie cuda. Wszystko jest wpozadku dopuki objekt jest w obrebie ekranu. Jesli zaczne chowac objekt pod dolna krawedz
ekranu to w pewnym momencie zaczynaja mi znikac grupami cale trojkaty np w jednej chwili 10 naraz. Pewnie nie bylo by problemu gdyby to byl jeden ktorego wiezcholek chowa sie pod ekran ale kilka naraz? Nawet takie ktore sa w calosci widoczne na ekranie?

Zaczalem podejrzewac ze jest jakis blad w algorytmie i jest jakis wyciek ale nic na to nie wskazuje.
Mysle nad tym kilka dni i nic mi nie przychodzi do glowy. Moze ktos bardziej obeznany w kreceniu szescianem mi podpowie.

Funkcja rysowania linni jest taka:

void RysujLiniePozioma(int x1, int x2, int y, int kolor)
{
unsigned char *ptr;

if(y < 0) return;

ptr = Tab_Mapa + y * 320;

x1 >>= 10;
x2 >>= 10;

if(x1 < x2)
{
if(x1 < 0) x1 = 0;
if(x2 > 319) x2 = 319;

ptr += x1;

for(; x1<x2; x1++)
{
*ptr++ = kolor;
}
}
else
{
if(x2 < 0) x2 = 0;
if(x1 > 319) x1 = 319;

ptr += x2;

for(; x2<x1; x2++)
{
*ptr++ = kolor;
}
}
}
[#2] Re: Wypelnianie trojatow - znikanie grup trojkatow

@Phibrizzo, post #1

Chyba powinieneś ustawić sx1 i sx2 przed drugim forem.
[#3] Re: Wypelnianie trojatow - znikanie grup trojkatow

@asman, post #2

Doszedlem co jest nie tak. To prawda ze problem zawsze lezy miedzy stolkiem a monitorem.
W powyzszym kodzie nie przedstawilem calej procedury tylko fragment dlatego trudno byloby komukolwiek znalezc faktyczny blad.

A blad polegal na tym ze w warunki w forach nie moga sie konczyc returnem tylko breakiem.
Poprostu procedura rysujaca caly obiekt jak wykryla ze dany trojkat jest poza obszarem, wykonywala zakonczenie calej procedury i to dlatego znikalo kilka trojkatow na raz. W pierwszym wariancie faktycznie wczesniej uzywalem breakow, ktore nie wiedziec czemu podczas edycji pierwszego posata zamienilem na returny.


Ostatnia aktualizacja: 01.04.2014 23:27:57 przez Phibrizzo
[#4] Re: Wypelnianie trojatow - znikanie grup trojkatow

@Phibrizzo, post #3

Najważniejsze, że problem rozwiązany. Przez chwilę myślałem o tych returnach ale skoro były one wyżej to widocznie tak miało być :D
[#5] Re: Wypelnianie trojatow - znikanie grup trojkatow

@Phibrizzo, post #3

Fajnie, cieszę się. Jednak mam pytanko z trochę innej beczki - szykujesz coś na Revision? :)
[#6] Re: Wypelnianie trojatow - znikanie grup trojkatow

@gorzyga, post #5

Niestety nie. Na Revision nie zdaze. Za malo pomyslow, za malo czasu juz.
Mysle ze bardziej na Riverwash.
[#7] Re: Wypelnianie trojatow - znikanie grup trojkatow

@Phibrizzo, post #6

Super, też dobrze OK
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem