[#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;
}
}
}