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

📄 colorlookuptable.cpp

📁 二维规则网格数据的等值线追踪
💻 CPP
字号:
// ColorLookUpTable.cpp: implementation of the CColorLookUpTable class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ContourGenerator.h"
#include "ColorLookUpTable.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CColorLookUpTable::CColorLookUpTable()
{
	m_ValueMin = m_ValueMax = 0;

	//缺省颜色表为RainBow颜色表
	m_ColorTable.Add( CColorNode(0.f,RGB(153,102,255)) );
	m_ColorTable.Add( CColorNode(0.2f,0x0000FF) );
	m_ColorTable.Add( CColorNode(0.4f,0x00FF00) );
	m_ColorTable.Add( CColorNode(0.6f,0xFFFF00) );
	m_ColorTable.Add( CColorNode(0.8f,RGB(255,102,0)) );
	m_ColorTable.Add( CColorNode(1.f,0xFF0000) );
}

CColorLookUpTable::~CColorLookUpTable()
{

}

//根据pos的位置找出在ColorTable中对应的颜色,
//pos为0~1的值
COLORREF CColorLookUpTable::GetColor(float pos) const
{
	ASSERT( pos>=0.f && pos<=1.0f );
	
	if(pos<=m_ColorTable.GetAt(0).pos)
		return m_ColorTable.GetAt(0).color;
	
	
	int count=m_ColorTable.GetSize();
	float ps = 0;
	
	for(int i=0; i<count; i++)
	{
		ps = m_ColorTable[i].pos;

		if( pos == ps)
		{
			return m_ColorTable[i].color;
		}
		else if( pos > ps )
		{
			continue;
		}
		else if( pos < ps )
		{ 
			float ratio = (                 pos - m_ColorTable[i-1].pos ) / 
				          ( m_ColorTable[i].pos - m_ColorTable[i-1].pos );

			COLORREF color = m_ColorTable[i-1].color;
			BYTE s_r = GetRValue(color);
			BYTE s_g = GetGValue(color);
			BYTE s_b = GetBValue(color);
			
			color = m_ColorTable[i].color;
			BYTE e_r = GetRValue(color);
			BYTE e_g = GetGValue(color);
			BYTE e_b = GetBValue(color);
			
			return RGB(s_r+(e_r-s_r)*ratio,
				       s_g+(e_g-s_g)*ratio,
				       s_b+(e_b-s_b)*ratio);
		}
	}

	return m_ColorTable.GetAt(count-1).color;
	

}

void CColorLookUpTable::SetColor(float pos, COLORREF newClr)
{
	ASSERT( pos>=0.f && pos<=1.0f );

	InsertColorIntoTable(pos,newClr);


}

 //在颜色表中查询v值的颜色
COLORREF CColorLookUpTable::LookUpColor(float v) const
{
	ASSERT( v>=m_ValueMin && v<=m_ValueMax );

	return GetColor( (v-m_ValueMin)/(m_ValueMax-m_ValueMin) );
}

//向颜色表中加入颜色节点,根据pos从小到大顺序插入,同时返回插入后所在的位置
int CColorLookUpTable::InsertColorIntoTable(float pos, COLORREF newClr)
{
	ASSERT( pos>=0.f && pos<=1.0f );

	int count = m_ColorTable.GetSize();

	float p = 0.f;
	for(int i=0; i<count; i++)
	{
		p = m_ColorTable.GetAt(i).pos;
		if( pos > p)
		{			
			continue;
		}
		else if( pos == p )
		{
            m_ColorTable[i].color = newClr;  //修改
			return i;
		}
		else if( pos < p  )
		{
			m_ColorTable.InsertAt(i,CColorNode(pos,newClr));
			return i;
		}
	}
	
	return m_ColorTable.Add(CColorNode(pos,newClr));
}

//删除颜色表中的颜色节点
void CColorLookUpTable::RemoveColorFromTable(float pos)
{
	int nSize = m_ColorTable.GetSize();

	for(int i=0; i<nSize; i++)
	{
		if( m_ColorTable.GetAt(i).pos == pos )
		{
			m_ColorTable.RemoveAt(i);
		}
	}

}

void CColorLookUpTable::GradientRectangle(CDC* pDC, const CRect& drawRect,
										  COLORREF clrStart,COLORREF clrEnd)
{//从clrStart开始到clrEnd渐变填充矩形drawRect
	

	int width  = drawRect.Width();
	int height = drawRect.Height();

	CPoint pt0 = drawRect.TopLeft(); //左上角
	CPoint pt1 = drawRect.BottomRight(); //右下角

	BYTE r,g,b;

	//按像素填充颜色
	COLORREF fillClr;

    for(int i=pt0.x; i<pt1.x; i++)
	{
		//线性插值
		 r = i*( GetRValue(clrEnd) - GetRValue(clrStart) ) / width + ( pt1.x*GetRValue(clrStart) - pt0.x*GetRValue(clrEnd) )/width;
		 g = i*( GetGValue(clrEnd) - GetGValue(clrStart) ) / width + ( pt1.x*GetGValue(clrStart) - pt0.x*GetGValue(clrEnd) )/width;
		 b = i*( GetBValue(clrEnd) - GetBValue(clrStart) ) / width + ( pt1.x*GetBValue(clrStart) - pt0.x*GetBValue(clrEnd) )/width;
		 
		 fillClr = RGB(r,g,b);
		
		for(int j=pt0.y; j<pt1.y; j++)
		{
			//MemDC.SetPixelV(i,j,RGB(r,g,b));
			pDC->SetPixelV(i,j,fillClr);
		}
	}

 

}

//绘制颜色表的颜色谱
void CColorLookUpTable::DrawColorSpectrum(CDC* pDC, const CRect& drawRect)
{
	int nSize = m_ColorTable.GetSize();

	CRect rect(drawRect);
    
	for(int i=1; i<nSize; i++)//i从1开始
	{
		rect.right = drawRect.left + int(drawRect.Width()*m_ColorTable.GetAt(i).pos);

		GradientRectangle(pDC,rect,m_ColorTable.GetAt(i-1).color,m_ColorTable.GetAt(i).color);
		
		rect.left = rect.right;
	}
	
}

BOOL CColorLookUpTable::LoadColorTable(const CString& filePath )
{
	FILE* fp=fopen(filePath,"rt");

	if(!fp)
	{
		AfxMessageBox("Open error!!");
		return FALSE;
	}

	char head[13]="";
	int headlen=strlen("ColorMap 1 1");
	fread( head, sizeof( char ), headlen, fp );
	if(strcmp(head,"ColorMap 1 1")!=0)
	{
		AfxMessageBox("文件格式有误,不能打开文件.");
		fclose(fp);
		return FALSE;
	}

	//-------开始读取颜色表------------------
	m_ColorTable.RemoveAll();

	UINT r,g,b;
	float pos;
	while(!feof(fp))
	{
		fscanf(fp,"%f%d%d%d",&pos, &r, &g, &b);
		m_ColorTable.Add( CColorNode(pos/100.f,RGB(r,g,b)) );
		if(pos>=100.f)
			break;
	}

	fclose(fp);

	return TRUE;

}

BOOL CColorLookUpTable::SaveColorTable(const CString& filePath )
{
     //Don't call
	//not impemented.......

	return FALSE; 

}


⌨️ 快捷键说明

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