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
*(_lpNewBits + _iXYNew) = *(_lpOldBits + _iXYOld) ;
The variable _iXYNew is wrong, FALSE or too big.
_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.