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]);
}