News:

Download Pelles C here: http://www.smorgasbordet.com/pellesc/

Main Menu

Rotation 2D

Started by Grincheux, April 04, 2016, 10:26:24 AM

Previous topic - Next topic

Grincheux

LPIMAGEINFOS Effect_Rotate2(LPIMAGEINFOS __lpImageInfos)
{
LPIMAGEINFOS _lpNewImage ;
LPDWORD _lpOldBits, _lpNewBits ;
register int _iLigne ;
register int _iColonne ;
int _iWNew, _iHNew, _iXYNew, _iXYOld ;
double _dCosinus, _dSinus ;
double _dX, _dY, _dXY, _dLigne, _dColonne, _dCentreX, _dCentreY ;

if(!__lpImageInfos) return (NULL) ;

_lpNewImage = ImageCreateEmpty(__lpImageInfos->BitmapInfo.bmiHeader.biWidth * 4,__lpImageInfos->BitmapInfo.bmiHeader.biHeight * 4,0) ;
if(!_lpNewImage) return (__lpImageInfos) ;

_lpOldBits = (LPDWORD) __lpImageInfos->lpImageBits ;
_lpNewBits = (LPDWORD) _lpNewImage->lpImageBits ;

_lpNewBits += (_lpNewImage->BitmapInfo.bmiHeader.biWidth * _lpNewImage->BitmapInfo.bmiHeader.biHeight) ;

_dCosinus = cos(30.0 / 180.0) * 3.1415926535897932384626433832795 ;
_dSinus = sin(30.0 / 180.0) * 3.1415926535897932384626433832795 ;

_dCentreX = __lpImageInfos->BitmapInfo.bmiHeader.biWidth / 2 ;
_dCentreY = __lpImageInfos->BitmapInfo.bmiHeader.biHeight / 2 ;

for(_iLigne = 0 ; _iLigne < __lpImageInfos->BitmapInfo.bmiHeader.biHeight ; _iLigne++)
{
_dLigne = (double) _iLigne ;

for(_iColonne = 0 ; _iColonne < __lpImageInfos->BitmapInfo.bmiHeader.biWidth ; _iColonne++)
{
_dColonne = (double) _iColonne ;

_iXYOld = (__lpImageInfos->BitmapInfo.bmiHeader.biWidth * _iLigne) + _iColonne ;

// X' = (X * Cosinus(Alpha)) - (Y * Sinus(Alpha))
// Y' = (X * Sinus(Alpha)) + (Y * Cosinus(Alpha))

_dX = ((_dColonne - _dCentreX) * _dCosinus) - ((_dLigne - _dCentreY) * _dSinus) ;
_dY = ((_dColonne - _dCentreX) * _dSinus) + ((_dLigne - _dCentreY) * _dCosinus) ;

_dXY = (((double) _lpNewImage->BitmapInfo.bmiHeader.biWidth) * _dY) + _dX ;
_iXYNew = (int) _dXY ;

*(_lpNewBits + _iXYNew) = *(_lpOldBits + _iXYOld) ;
}
}

ImageFree(__lpImageInfos) ;

return (ImageToGflBitmap(_lpNewImage)) ;
}


I want to make a rotation and I think the formula :

      X' = (X * Cosinus(Alpha)) - (Y * Sinus(Alpha))
      Y' = (X * Sinus(Alpha)) + (Y * Cosinus(Alpha))

is good.

My problem is to convert for my image.
The image size is 4 * width and 4 * height of original image.


The crash is here
Quote*(_lpNewBits + _iXYNew) = *(_lpOldBits + _iXYOld) ;

The variable _iXYNew is wrong, FALSE or too big.

Quote_dXY = (((double) _lpNewImage->BitmapInfo.bmiHeader.biWidth) * _dY) + _dX ;
         _iXYNew = (int) _dXY ;

I have the Z axis to zero that comes to this simple formula.
The center is half the size of the original image.

The Point (0,0) of the image is the point (0 - CentreX,0 - CentreY) because image is centered on it.
When I compute X and Y I have the real coordinates.

My problem, my crash problem, is when I compute the XY position into the bitmap.
I am obliged to create a bitmap larger and higher the original because of negative coordinates.

I need help.

Sam Steele

#1
This line:

    _lpNewBits += (_lpNewImage->BitmapInfo.bmiHeader.biWidth * _lpNewImage->BitmapInfo.bmiHeader.biHeight) ;

seems wrong.

You point to  the end of your array.

You probably ought to point into the middle of the array:

    _lpNewBits += (_lpNewImage->BitmapInfo.bmiHeader.biWidth * _lpNewImage->BitmapInfo.bmiHeader.biHeight) / 2;

Also, your new bitmap probably doesn't need to be 4 × 4 = 16 times bigger.
I reckon 1½ × 1½ = 2¼ times bigger would cover any angle.

Nice code.

—Sam.