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(i m_nMaxLevel){ level--; m=m_pSize[m_nF]; for(j=0;j next())%14; while(str[k]!='\0') { i=0; while(i m_nMaxLevel){ level--; m=m_pSize[m_nF]; for(j=0;j setCurSeed((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; }