Witam,
Piszę sobie pewną aplikację graficzną w której chciałbym mieć możliwość obracania bitmapy.
Tutaj jest frgment kodu odpowiadającego za obrót:
void DrawSprite(Texture2D* inTexture2D, const Vector2 inPosition, float inRadianAngle)
{
float sina = (sin(inRadianAngle));
float cosa = (cos(inRadianAngle));
int32 px;
int32 py;
float xp ;
float yp ;
int32 x = 0;
int32 y = 0;
uint32 cw = (inTexture2D->Width/2 + inPosition.X);
uint32 ch = (inTexture2D->Height/2 + inPosition.Y);
const Color* ptr = inTexture2D->GetData();
for( x = 0; x <(inTexture2D->Width); ++x)
{
xp = ((inPosition.X + x) - cw );
for( y = 0; y < (inTexture2D->Height); ++y)
{
yp = ((inPosition.Y + y) - ch );
px = round((xp * cosa) - (yp * sina) + cw);
py = round((yp * cosa) + (xp * sina) + ch);
PutPixel(px, py, (ptr[y*inTexture2D->Width+x]));
}
}
}
Reszta ważnych funkcji:
int round(float inFloat)
{
return (int) (inFloat + 0.5f);
}
void PutPixel(uint32 inX, uint32 inY, const Color &inColor)
{
GetBackBuffer()->SetData( inColor, ( inY * m_Width) + inX );
}
Powyższy kod działa prawie poprawnie tzn. obraca bitmapę, ale w czasie obrotu pojawiają się artefakty (przebicia z tła) co można zobaczyć na poniższym obrazku:
Czy ktoś ma jakiś pomysł jak można się tych artefaktów pozbyć?
By uprzedzić wasze propozycje zmieniałem już typy zmiennych na float oraz double co dawało taki sam rezultat jak na powyższym obrazku.