⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 general.h

📁 基于电磁波方程
💻 H
字号:
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

void cmap_1side(float &h, float &s, float &v, float xpnt) 
{
	float t;
	if (xpnt > 0.8) 
	{
	    h = 330. + 30*(1.-xpnt)/0.2;
	    s = (1.-xpnt)/0.2;
	    v = 1.0;
	} 
	else if (xpnt > 0.2) 
	{
	    t = 2.0*M_PI*((xpnt-0.2)/.6);
	    h = 240.0*(0.8-xpnt)/0.6 + 5.0*sin(t);
	    s = 1.0;
	    v = 1.0;
	} 
	else 
	{
	    h = 270.0*(.2-xpnt)+240.0;
	    s = 1.0;
	    v = xpnt/0.2;
	}
}

void cmap_2side(float &h, float &s, float &v, float xpnt) 
{
	if(xpnt > 0.8) 
	{
		h = 30. - 30.*(xpnt-0.8)*(xpnt-0.8)/0.04;
		s = (1.0-xpnt)/0.2;
		v = 1.0;
	} 
	else if (xpnt > .3)
	{
		h = (135.0 - 105.*(xpnt-.3)/.5);
		s = 1.0;
	    v = 1.0;
	} 
	else if (xpnt > 0.) 
	{
		h = (180.0 - 45.*xpnt/.3);
		s = 1.0;
		v = xpnt/.3;
	} 
	else if (xpnt > -.3) 
	{
	    h = (180. - 45.*xpnt/.3);
	    s = 1.0;
	    v = fabs(xpnt)/.3;
	} 
	else
	{
		h = (225. - 135.*(xpnt+.3)/.7);
	    s = 1.0;
	    v = 1.0;
	}
	return;
}

#define GRAY_ZERO 0.3
void cmap_gray(float &h, float &s, float &v, float xpnt) {
  h = 0;
  s = 0;
  v = (GRAY_ZERO+xpnt)/(1.0+GRAY_ZERO);
  return;
}
#undef GRAY_ZERO

/* hsvrgb: convert and HSV specified color to an RGB color
 *
 * Copyright (C) 2003  John B. Schneider, 
 *                     original algorithm from Patrick J. Flynn
 *
 * input: 
 * 0 <= h <= 360    (hue)
 * 0 <= v <= 1.0    (brightness)
 * 0 <= s <= 1.0    (saturation)
 *
 * output: 0 <= ir,ig,ib <= 255
 */

void hsvrgb(float h, float s, float v, unsigned char &ir, unsigned char &ig, unsigned char &ib)
{
  float pqvt[4], f;
  int i, irpnt[6]={2,1,0,0,3,2},
         igpnt[6]={3,2,2,1,0,0},
         ibpnt[6]={0,0,3,2,2,1};

  if (s == 0.0) {
    ir = 255.0*v;
    ig = ir;
    ib = ir;
    return;
  }

  if (h == 360.0) h=0.0;
  h = h / 60.0;
  i = floor(h);
  f = h-i;

  pqvt[2] = 255.0*v;
  pqvt[0] = pqvt[2]*(1.0-s);
  pqvt[1] = pqvt[2]*(1.0-s*f);
  pqvt[3] = pqvt[2]*(1.0-s*(1.0-f));

  ir = pqvt[irpnt[i]];
  ig = pqvt[igpnt[i]];
  ib = pqvt[ibpnt[i]];

  return;
}

float **DefineArray(int DimensionX,int DimensionY)
{
	float **p;
	p=(float **)malloc(DimensionX*sizeof(float *));
	for(int i=0;i<DimensionX;i++)
	{
		p[i]=(float *)malloc(DimensionY*sizeof(float));
		memset(p[i],0,DimensionY*sizeof(float));
	}
	return p;
}
void FreeArray(float **p,int DimensionX)
{
	for(int i=0;i<DimensionX;i++) free(p[i]);
	free(p);
}
unsigned char **DefineIntArray(int DimensionX,int DimensionY)
{
	unsigned char **p;
	p=(unsigned char **)malloc(DimensionX*sizeof(unsigned char *));
	for(int i=0;i<DimensionX;i++)
	{
		p[i]=(unsigned char *)malloc(DimensionY*sizeof(unsigned char));
		memset(p[i],0,DimensionY*sizeof(unsigned char));
	}
	return p;
}
void FreeIntArray(unsigned char **p,int DimensionX)
{
	for(int i=0;i<DimensionX;i++) free(p[i]);
	free(p);
	printf("sdfsaff\n");
}



LPBITMAPFILEHEADER bmfh=new BITMAPFILEHEADER;
BITMAPINFOHEADER m_lpBMPHdr;
LPRGBQUAD m_lpvColorTable=(LPRGBQUAD)new RGBQUAD[256];;	
int sizeHdr;
DWORD m_dwImageSize;
DWORD dwBytes;

void WriteMyColor()
{
	float h,s,v;
	unsigned char ir,ig,ib;
	float temp;
	for(int i=0;i<256;i++)
	{
		temp=(2*i/255.0-1.0);//(255-i)/255.0;
		cmap_2side(h,s,v,temp);
		hsvrgb(h,s,v,ir,ig,ib);
		m_lpvColorTable[i].rgbBlue=ib;
		m_lpvColorTable[i].rgbGreen=ig;
		m_lpvColorTable[i].rgbRed=ir;
		m_lpvColorTable[i].rgbReserved=0;
		
	}
	return;
}

void init256BMP(unsigned long width, unsigned long height)
{
	int nBitCounts=8;
	int m_nColorEntries=256;
	bmfh->bfType = 0x4d42;  // 'BM'
	bmfh->bfSize = 0;
	bmfh->bfReserved1 = bmfh->bfReserved2 = 0;
	bmfh->bfOffBits = 
		sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
		sizeof(RGBQUAD) * m_nColorEntries;
//	memset(&bmfh, 0, sizeof(BITMAPFILEHEADER));

	sizeHdr = sizeof(BITMAPINFOHEADER) + 
				sizeof(RGBQUAD) * m_nColorEntries;
	m_lpBMPHdr.biSize = sizeof(BITMAPINFOHEADER);	//以下是为BITMAPINFOHEADER结构赋值
	m_lpBMPHdr.biWidth = width;
	m_lpBMPHdr.biHeight = height;
	m_lpBMPHdr.biPlanes = 1;
	m_lpBMPHdr.biBitCount = nBitCounts;
	m_lpBMPHdr.biCompression = BI_RGB;
	m_lpBMPHdr.biSizeImage = 0;
	m_lpBMPHdr.biXPelsPerMeter = 0;
	m_lpBMPHdr.biYPelsPerMeter = 0;
	m_lpBMPHdr.biClrUsed = m_nColorEntries;
	m_lpBMPHdr.biClrImportant = m_nColorEntries;

//	LPVOID m_lpvColorTable;	
//	m_lpvColorTable =(LPBYTE) &m_lpBMPHdr + sizeof(BITMAPINFOHEADER);
	
//	memset(m_lpvColorTable, 0, sizeof(RGBQUAD) * m_nColorEntries);
	printf("%d\n",bmfh->bfType );
//	RGBQUAD *lprgb=(RGBQUAD *)m_lpvColorTable;
	WriteMyColor();//写入我的颜色表
	printf("%dnf2\n",(LPBYTE)m_lpvColorTable+sizeof(RGBQUAD) * m_nColorEntries);
	printf("%d\n",bmfh->bfType );
//	m_lpvColorTable = NULL;	

	dwBytes = ((DWORD) m_lpBMPHdr.biWidth * m_lpBMPHdr.biBitCount) / 32;
	if(((DWORD) m_lpBMPHdr.biWidth * m_lpBMPHdr.biBitCount) % 32) 
	{
		dwBytes++;
	}//实际长为dwBytes,原来的长为width
	dwBytes *= 4;
	m_lpBMPHdr.biSizeImage=dwBytes * m_lpBMPHdr.biHeight;
	m_dwImageSize=m_lpBMPHdr.biSizeImage;//没被压缩
	bmfh->bfSize=bmfh->bfOffBits+m_lpBMPHdr.biSizeImage;
}
float smr=1000.0;
BOOL New256BMPFile(char filename[],float **myArray,unsigned long width, unsigned long height)
{
	LPBYTE m_lpDIBits=(LPBYTE)new unsigned char[m_dwImageSize];
	memset(m_lpDIBits, 0, m_dwImageSize);
	unsigned char* pp=m_lpDIBits;
	for(unsigned long i=0;i<height;i++)
	{
		for(unsigned long j=0;j<width;j++)
		{
			*pp=(unsigned char)((smr+myArray[i][j])*255.0/(2*smr));
			pp++;

		}
		
		for(j=width;j<dwBytes;j++)
		{
			*pp=0;pp++;
		}
		
	}

	CFile* pFile;
	pFile = new CFile;
	pFile->Open(filename, CFile::modeCreate|CFile::modeWrite);
	try {                                                      //注意区别
		pFile->Write((LPVOID) bmfh, sizeof(BITMAPFILEHEADER));//结构体指针的地址
		pFile->Write((LPVOID) &m_lpBMPHdr, sizeof(BITMAPINFOHEADER));//结构体的地址
		pFile->Write((LPVOID) m_lpvColorTable, 256*sizeof(RGBQUAD));//数组的地址
		pFile->Write((LPVOID) m_lpDIBits, m_dwImageSize);//结构体数组的地址呢?
	}
	catch(CException* pe) {
		pe->Delete();
		AfxMessageBox("write error");
		return FALSE;
	}
	pFile->Close();
	delete[] m_lpDIBits;
	m_lpDIBits = NULL;
//	m_lpvColorTable = NULL;
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -