Были или нет американцы на Луне?
13,259,711 109,685
 

  CodeGrinder ( Слушатель )
07 сен 2009 20:21:02

Тред №144222

новая дискуссия Дискуссия  96

Прошу прощения, но в сферическую проекцию вкралась ошибка. Ловите исправления, сейчас ещё рисунки заново переделаю.

HBITMAP processBitmap(HBITMAP SrcBmp)
{
if (NULL != SrcBmp)
{
DIBSECTION ds;
if (sizeof(ds) == GetObject(SrcBmp, sizeof(ds), &ds)
&& 24 == ds.dsBm.bmBitsPixel)
{
int width = ds.dsBm.bmWidth;
int height = ds.dsBm.bmHeight;
PBYTE pBits = (PBYTE)ds.dsBm.bmBits;
double ax = atan(5.0*width/gPixelsPer10mm/gFocusLength);
double ax_1 = atan(10.0/gPixelsPer10mm/gFocusLength);
int cx = int(2*ax/ax_1);
double ay = atan(5.0*height/gPixelsPer10mm/gFocusLength);
double ay_1 = atan(10.0/gPixelsPer10mm/gFocusLength);
int cy = int(2*ay/ay_1);
BITMAPINFOHEADER bmih =
{
sizeof(bmih),
cx,
cy,
1,
24,
BI_RGB,
0, 0, 0, 0, 0
};
PBYTE pNewBits = NULL;
HBITMAP hbmr = CreateDIBSection(NULL, (BITMAPINFO *)&bmih, DIB_RGB_COLORS, (PVOID *)&pNewBits, NULL, 0);
if (NULL != hbmr)
{
int srcLineSize = (width*3+3)&~3;
int dstLineSize = (cx*3+3)&~3;

for (int j = 0; j < cy; j++)
{
for (int i = 0; i < cy; i++)
{
double xa = 2*ax*(i-cx/2.0f)/cx;
double ya = 2*ay*(j-cy/2.0f)/cy;
int x = int(gFocusLength*tan(xa)*gPixelsPer10mm/10)+width/2;
int y = int(gFocusLength*tan(ya)/cos(xa)*gPixelsPer10mm/10)+height/2;
if (x >= 0 &&
y >= 0
&& x < width
&& y < height)
{
RGBQUAD *pSrc = (RGBQUAD *)(pBits + y*srcLineSize+x*3);
RGBQUAD *pDst = (RGBQUAD *)(pNewBits + j*dstLineSize+i*3);
pDst->rgbRed = pSrc->rgbRed;
pDst->rgbGreen = pSrc->rgbGreen;
pDst->rgbBlue = pSrc->rgbBlue;
}
}
}
return hbmr;
}
}
}
return NULL;
}
Отредактировано: CodeGrinder - 20 авг 2014 12:57:13
  • +0.00 / 0
  • АУ
ОТВЕТЫ (0)
 
Комментарии не найдены!