www.pudn.com > Grass.rar > FGrass.cpp


// FGrass.cpp: implementation of the CFGrass class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Grass.h" 
#include "FGrass.h" 
#include "Rand.h" 
 
#include  
#include  
 
#define pi 3.1415926 
#define xs(x)  ((int)(m_fFact*((x)-m_fXmin))) 
#define ys(y)  ((int)(m_fFact*((y)-m_fYmin))) 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CFGrass::CFGrass() 
{ 
	m_nTurDir=m_nTsSize=0; 
	m_fTurx=m_fTury=0; 
	m_fD=1; 
	m_bFf=false; 
	m_nJ=0; 
	m_nF=0; 
	m_fYmax=m_fYmin=m_fXmax=m_fXmin=0; 
 
	m_pTsDir=m_pSize=NULL; 
	m_pTsx=m_pTsy=m_pAngle=NULL; 
	m_pKar=NULL; 
	m_pAxiom=NULL; 
	m_pRule=NULL; 
	m_pRand=NULL; 
} 
 
CFGrass::~CFGrass() 
{ 
	delete m_pTsDir; 
	delete m_pSize; 
	delete m_pTsx; 
	delete m_pTsy; 
	delete m_pAngle; 
	delete m_pRule; 
	delete m_pRand; 
} 
 
void CFGrass::TurState(CDC *pDC,char com) 
{  
	if(m_bFf){ 
		m_fD=float(m_pRand->next())+1; 
	} 
	if(com=='F'||com=='f'){  
		m_fTurx+=float(m_fD*cos(m_nTurDir*m_pAngle[m_nF]*pi/180.0)); 
		m_fTury+=float(m_fD*sin(m_nTurDir*m_pAngle[m_nF]*pi/180.0)); 
		if(com=='F') pDC->LineTo(xs(m_fTurx),ys(m_fTury)); 
		else pDC->MoveTo(xs(m_fTurx),ys(m_fTury)); 
	} 
	else if(com=='+') m_nTurDir--; 
	else if(com=='-') m_nTurDir++; 
	else if(com=='['){ 
		m_pTsx[m_nTsSize]=m_fTurx; 
		m_pTsy[m_nTsSize]=m_fTury; 
		m_pTsDir[m_nTsSize]=m_nTurDir; 
		m_nTsSize++; 
	} 
	else if(com==']'){ 
		m_nTsSize--; 
		m_fTurx=m_pTsx[m_nTsSize]; 
		m_fTury=m_pTsy[m_nTsSize]; 
		m_nTurDir=m_pTsDir[m_nTsSize]; 
		pDC->MoveTo(xs(m_fTurx),ys(m_fTury)); 
	} 
} 
 
int CFGrass::Turs(char com) 
{   
	if(m_bFf){ 
		m_fD=float(m_pRand->next())+1; 
	} 
	if(com=='F'||com=='f') 
	{  
		m_fTurx+=float(m_fD*cos(m_nTurDir*m_pAngle[m_nF]*pi/180.0)); 
		m_fTury+=float(m_fD*sin(m_nTurDir*m_pAngle[m_nF]*pi/180.0)); 
		m_fXmax=max(m_fTurx,m_fXmax); 
		m_fYmax=max(m_fTury,m_fYmax); 
		m_fXmin=min(m_fTurx,m_fXmin); 
		m_fYmin=min(m_fTury,m_fYmin); 
	} 
	else if(com=='+') m_nTurDir--; 
	else if(com=='-') m_nTurDir++; 
	else if(com=='['){  
		if(m_nTsSize>=m_nMaxTs) 
		{ 
			return -1; 
		} 
		m_pTsx[m_nTsSize]=m_fTurx; 
		m_pTsy[m_nTsSize]=m_fTury; 
		m_pTsDir[m_nTsSize]=m_nTurDir; 
		m_nTsSize++; 
	} 
	else if(com==']'){  
		if(m_nTsSize==0){ 
			return 1; 
		} 
		m_nTsSize--; 
		m_fTurx=m_pTsx[m_nTsSize]; 
		m_fTury=m_pTsy[m_nTsSize]; 
		m_nTurDir=m_pTsDir[m_nTsSize]; 
	} 
	return 0; 
} 
 
void CFGrass::Draw(char *str,int level) 
{  
	int i,j,k,m; 
	k=0; 
	m_nF=UINT(m_pRand->next())%14; 
	while(str[k]!='\0') 
	{  
		i=0; 
		while(im_nMaxLevel){  
				level--; 
				m=m_pSize[m_nF]; 
				for(j=0;jnext())%14; 
	while(str[k]!='\0') 
	{  
		i=0; 
		while(im_nMaxLevel){  
				level--; 
				m=m_pSize[m_nF]; 
				for(j=0;jsetCurSeed((unsigned)time( NULL )); 
//	srand( (unsigned)time( NULL ) ); 
	k=int(m_pRand->next());//rand(); 
	m_pRand->setCurSeed(k); 
//	srand(k); 
	if(ClacFact(1)==0) return 0; 
	pDC->MoveTo(xs(m_fTurx),ys(m_fTury)); 
	m_pRand->setCurSeed(k); 
//	srand(k); 
	Draw(m_pAxiom,1); 
	if(m_nJ){ 
		if(c!='4') 
			k=int(m_pRand->next());//k=rand(); 
		else m_bFf=true; 
		if(ClacFact(1)==0) return 0; 
		m_fXmin=m_fXmin-m_nMaxx*1.0f/2.0f/m_fFact; 
		pDC->MoveTo(xs(m_fTurx),ys(m_fTury)); 
		m_pRand->setCurSeed(k); 
	//	srand(k); 
		Draw(m_pAxiom,1); 
	} 
	return 1; 
}