www.pudn.com > 3d_terrain.rar > ColorRamp.cpp, change:1998-10-24,size:3379b


//******************************************** 
// ColorRamp.cpp 
//******************************************** 
// pierre.alliez@cnet.francetelecom.fr 
// Created : 19/05/98 
// Modified : 19/05/98 
//******************************************** 
 
#include "stdafx.h" 
#include "ColorRamp.h" 
 
//******************************************** 
// Constructor 
//******************************************** 
CColorRamp::CColorRamp() 
{ 
	BuildDefault(); 
} 
 
//******************************************** 
// Destructor 
//******************************************** 
CColorRamp::~CColorRamp() 
{ 
} 
 
//******************************************** 
// Build 
//******************************************** 
int CColorRamp::Build() 
{ 
 int x1,y1,x2,y2; 
 float a,b; 
 ASSERT(m_NbNode >= 2); 
 for(unsigned char k=0;k<3;k++) 
	 for(int i=0;i<m_NbNode-1;i++) 
   { 
    x1 = (int)m_Node[i]; 
    x2 = (int)m_Node[i+1]; 
 
    ASSERT(x1<x2); 
    y1 = m_Color[k][x1]; 
    y2 = m_Color[k][x2]; 
 
    a = (float)(y2-y1) / (float)(x2-x1); 
    b = (float)y1 - a*(float)x1; 
 
    for(int j=x1;j<x2;j++) 
      m_Color[k][j]=(unsigned char)(a*(float)j+b); 
   } 
	return 1; 
} 
 
//******************************************** 
// Build 
//******************************************** 
int CColorRamp::BuildNodes() 
{ 
	// Check first and last are set 
	m_Color[3][0] = 1; 
	m_Color[3][m_Size-1] = 1; 
	// Count nodes 
	m_NbNode = 0; 
	for(int i=0;i<m_Size;i++) 
		if(m_Color[3][i]==1) 
		{ 
			m_Node[m_NbNode]=(unsigned char)i; 
			m_NbNode++; 
		} 
	TRACE("NbNode : %d\n",m_NbNode); 
	ASSERT(m_NbNode>=2); 
	return 1; 
} 
 
//******************************************** 
// ResetNodes 
// Just first and last node 
//******************************************** 
void CColorRamp::ResetNodes() 
{ 
	for(int i=0;i<m_Size;i++) 
		m_Color[3][i] = 0; 
	m_Color[3][0] = 1; 
	m_Color[3][m_Size-1] = 1; 
	BuildNodes(); 
} 
 
//******************************************** 
// BuildDefault 
// 256 grey levels 
//******************************************** 
void CColorRamp::BuildDefault() 
{ 
	m_Size = 256; 
	ResetNodes(); 
 
	// Grey scales 
	for(unsigned char i=0;i<3;i++) 
	{ 
		m_Color[i][0]=0; 
		m_Color[i][255]=255; 
	} 
	Build(); 
} 
 
//******************************************** 
// BuildDefault 
// 256 grey levels 
//******************************************** 
void CColorRamp::BuildRainbow() 
{ 
	m_Size = 256; 
	ResetNodes(); 
 
	// Rainbow 
	m_Color[3][0] = 1;m_Color[0][0] = 0;m_Color[1][0] = 0;m_Color[2][0] = 255; 
	m_Color[3][48] = 1;m_Color[0][48] = 0;m_Color[1][48] = 254;m_Color[2][48] = 255; 
	m_Color[3][96] = 1;m_Color[0][96] = 0;m_Color[1][96] = 254;m_Color[2][96] = 0; 
	m_Color[3][144] = 1;m_Color[0][144] = 255;m_Color[1][144] = 255;m_Color[2][144] = 0; 
	m_Color[3][192] = 1;m_Color[0][192] = 255;m_Color[1][192] = 126;m_Color[2][192] = 0; 
	m_Color[3][240] = 1;m_Color[0][240] = 255;m_Color[1][240] = 0;m_Color[2][240] = 0; 
	m_Color[3][255] = 1;m_Color[0][255] = 255;m_Color[1][255] = 255;m_Color[2][255] = 255; 
 
	BuildNodes(); 
	Build(); 
} 
 
//******************************************** 
// Trace 
//******************************************** 
void CColorRamp::Trace() 
{ 
	TRACE("Ramp (%d elts)\n",m_Size); 
	for(int i=0;i<m_Size;i++) 
	{ 
		TRACE("  %3d %3d %3d\n",m_Color[0][i],m_Color[1][i],m_Color[2][i]); 
	} 
} 
 
//** EOF **