www.pudn.com > final_6.rar > Cone.cpp


#include "stdafx.h" 
#include "CG.h" 
#include "math.h" 
//#include "PerView.h" 
//#include "TopView.h" 
#include "Shape.h" 
#include "CGDoc.h" 
#include "LeftView.h" 
#include "Operation.h" 
#include "Base.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
IMPLEMENT_SERIAL(CCone,CShape,0) 
CCone::CCone() 
{ 
} 
 
void CCone::DrawTop(CDC *pDC,CRect *rc){ 
 	int x,y; 
	for (x=0;x<=7;x++) 
	{ 
	   for (y=0;y<=14;y++) 
	   { 
           pDC->MoveTo((int)this->BPoint[x][y].x,(int)this->BPoint[x][y].z); 
		   pDC->LineTo((int)this->BPoint[x][y+1].x,(int)this->BPoint[x][y+1].z); 
		   pDC->MoveTo((int)this->BPoint[x][y].x,(int)this->BPoint[x][y].z); 
		   pDC->LineTo((int)this->BPoint[x+1][y].x,(int)this->BPoint[x+1][y].z); 
	   } 
	} 
    for (x=0;x<=7;x++) 
	{ 
	      pDC->MoveTo((int)this->BPoint[x][15].x,(int)this->BPoint[x][15].z); 
		  pDC->LineTo((int)this->BPoint[x][0].x,(int)this->BPoint[x][0].z); 
	      pDC->MoveTo((int)this->BPoint[x][15].x,(int)this->BPoint[x][15].z); 
		  pDC->LineTo((int)this->BPoint[x+1][15].x,(int)this->BPoint[x+1][15].z); 
	 
	} 
	for (x=0;x<=14;x++) 
	{ 
	      pDC->MoveTo((int)this->BPoint[8][x].x,(int)this->BPoint[8][x].z); 
		  pDC->LineTo((int)this->BPoint[8][x+1].x,(int)this->BPoint[8][x+1].z); 
	} 
    pDC->MoveTo((int)this->BPoint[8][15].x,(int)this->BPoint[8][15].z); 
	 pDC->LineTo((int)this->BPoint[8][0].x,(int)this->BPoint[8][0].z); 
 
} 
void CCone::DrawLeft(CDC* pDC,CRect* rc){ 
 
int x,y; 
	for (x=0;x<=7;x++) 
	{ 
	   for (y=0;y<=14;y++) 
	   { 
           pDC->MoveTo(-(int)this->BPoint[x][y].z,(int)this->BPoint[x][y].y); 
		   pDC->LineTo(-(int)this->BPoint[x][y+1].z,(int)this->BPoint[x][y+1].y); 
 
 
		   pDC->MoveTo(-(int)this->BPoint[x][y].z,(int)this->BPoint[x][y].y); 
		   pDC->LineTo(-(int)this->BPoint[x+1][y].z,(int)this->BPoint[x+1][y].y); 
	   } 
	} 
    for (x=0;x<=7;x++) 
	{ 
	       
	      pDC->MoveTo(-(int)this->BPoint[x][15].z,(int)this->BPoint[x][15].y); 
		  pDC->LineTo(-(int)this->BPoint[x+1][15].z,(int)this->BPoint[x+1][15].y); 
	} 
 
	for (x=0;x<=8;x++) 
	{ 
	     pDC->MoveTo(-(int)this->BPoint[x][15].z,(int)this->BPoint[x][15].y); 
		 pDC->LineTo(-(int)this->BPoint[x][0].z,(int)this->BPoint[x][0].y); 
	 
	 
	} 
	for (x=0;x<=14;x++) 
	{ 
	      pDC->MoveTo(-(int)this->BPoint[8][x].z,(int)this->BPoint[8][x].y); 
		  pDC->LineTo(-(int)this->BPoint[8][x+1].z,(int)this->BPoint[8][x+1].y); 
	} 
} 
void CCone::DrawFront(CDC*pDC,CRect *rc){ 
	int x,y; 
	for (x=0;x<=7;x++) 
	{ 
	   for (y=0;y<=14;y++) 
	   { 
           pDC->MoveTo((int)this->BPoint[x][y].x,(int)this->BPoint[x][y].y); 
		   pDC->LineTo((int)this->BPoint[x][y+1].x,(int)this->BPoint[x][y+1].y); 
		   pDC->MoveTo((int)this->BPoint[x][y].x,(int)this->BPoint[x][y].y); 
		   pDC->LineTo((int)this->BPoint[x+1][y].x,(int)this->BPoint[x+1][y].y); 
	   } 
	} 
    for (x=0;x<=7;x++) 
	{ 
	      pDC->MoveTo((int)this->BPoint[x][15].x,(int)this->BPoint[x][15].y); 
		  pDC->LineTo((int)this->BPoint[x+1][15].x,(int)this->BPoint[x+1][15].y); 
	 
	} 
    for (x=0;x<=8;x++) 
	{ 
	   pDC->MoveTo((int)this->BPoint[x][15].x,(int)this->BPoint[x][15].y); 
	   pDC->LineTo((int)this->BPoint[x][0].x,(int)this->BPoint[x][0].y); 
	 
	} 
	for (x=0;x<=14;x++) 
	{ 
	      pDC->MoveTo((int)this->BPoint[8][x].x,(int)this->BPoint[8][x].y); 
		  pDC->LineTo((int)this->BPoint[8][x+1].x,(int)this->BPoint[8][x+1].y); 
	} 
} 
void CCone::DrawPer(CDC*pDC,CRect *rc){ 
int x,y; 
	for (x=0;x<=7;x++) 
	{ 
	   for (y=0;y<=14;y++) 
	   { 
           pDC->MoveTo((int)BPer[x][y].x,(int)BPer[x][y].y); 
		   pDC->LineTo((int)BPer[x][y+1].x,(int)BPer[x][y+1].y); 
		   pDC->MoveTo((int)BPer[x][y].x,(int)BPer[x][y].y); 
		   pDC->LineTo((int)BPer[x+1][y].x,(int)BPer[x+1][y].y); 
	   } 
	} 
    for (x=0;x<=7;x++) 
	{ 
	      pDC->MoveTo((int)BPer[x][15].x,(int)BPer[x][15].y); 
		  pDC->LineTo((int)BPer[x][0].x,(int)BPer[x][0].y); 
	      pDC->MoveTo((int)BPer[x][15].x,(int)BPer[x][15].y); 
		  pDC->LineTo((int)BPer[x+1][15].x,(int)BPer[x+1][15].y); 
	} 
	for (x=0;x<=14;x++) 
	{ 
	      pDC->MoveTo((int)BPer[8][x].x,(int)BPer[8][x].y); 
		  pDC->LineTo((int)BPer[8][x+1].x,(int)BPer[8][x+1].y); 
	} 
     pDC->MoveTo((int)BPer[8][15].x,(int)BPer[8][15].y); 
	 pDC->LineTo((int)BPer[8][0].x,(int)BPer[8][0].y); 
} 
void CCone::Serialize(CArchive &ar){ 
 
	CShape::Serialize(ar); 
	if (ar.IsStoring()) 
	{ 
	   ar<>radius>>height; 
 	} 
	center.Serialize(ar); 
	int x,y; 
	for (x=0;x<=8;x++) 
      for (y=0;y<=15;y++) 
	   { 
	     BPoint[x][y].Serialize(ar);		    
	   } 
} 
 
void CCone::SetConePoint(double radius,double height,CCone *pCone) 
{ 
      int x,y; 
	  for (x=0;x<=8;x++) 
		  for (y=0;y<=15;y++) 
		  { 
              pCone->BPoint[x][y].x=x*radius/8*sin(y*PI/8-PI/2)+pCone->center.x; 
		      pCone->BPoint[x][y].y=-(height-x*height/8)+pCone->center.y; 
			  pCone->BPoint[x][y].z=x*radius/8*sin(y*PI/8)+pCone->center.z;   
		  } 
	//¼ÆËãÍâ½ÓÇòÐÄ 
	double d = height/2 - radius*radius/height/2;//distance between two center 
	CGPoint* vector = new CGPoint(pCone->BPoint[0][0].x - pCone->center.x, 
		                         pCone->BPoint[0][0].y - pCone->center.y, 
								 pCone->BPoint[0][0].z - pCone->center.z); 
	COperation::Specify(vector, vector); 
	pCone->tempCenter.x = vector->x * d + pCone->center.x; 
	pCone->tempCenter.y = vector->y * d + pCone->center.y; 
	pCone->tempCenter.z = vector->z * d + pCone->center.z; 
} 
 
void CCone::SetBodyFace(){ 
     int x,y; 
     CGPlane *face; 
	 for (x=0;x<=7;x++) 
		 for (y=0;y<=14;y++) 
		 { 
		     face=&BFace[x][y]; 
	         COperation::CaculateFace(face,BPoint[x][y],BPoint[x][y+1],BPoint[x+1][y+1],BPoint[x+1][y]); 
		 } 
     for (x=0;x<=7;x++) 
	 { 
	     face=&BFace[x][15]; 
	     COperation::CaculateFace(face,BPoint[x][15],BPoint[x][0],BPoint[x+1][0],BPoint[x+1][15]); 
	 } 
	 face=&BFace[8][1];//base 
	 COperation::CaculateFace(face,BPoint[8][0],BPoint[8][4],BPoint[8][8],BPoint[8][12]); 
}