正八面体正交投影

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
F[4].En=3;F[3].v[0]=0;F[3].v[1]=4;F[3].v[2]=1;
F[5].En=3;F[5].v[0]=5;F[5].v[1]=3;F[5].v[2]=2;
F[6].En=3;F[6].v[0]=5;F[6].v[1]=4;F[6].v[2]=3;
F[7].En=3;F[7].v[0]=5;F[7].v[1]=1;F[7].v[2]=4;
NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图
pOldBitmap=MemDC.SelectObject(&NewBitmap); //将兼容位图选入MemDC
MemDC.SetMapMode(MM_ANISOTROPIC);//MemDC自定义坐标系
T[0][1] = sin(angle);
T[1][0] = -sin(angle);
T[1][1] = cos(angle);
MultiplyMatrix();
}
2.读取点表、面表:
void CTestView::ReadPoint()
{
//正八面体顶点表
double a=200;
P[0].x=0; P[0].y=a; P[0].z=0;
pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//屏幕中心为原点
CDC MemDC;//内存DC
CBitmap NewBitmap,*pOldBitmap;//内存中承载图像的临时位图
MemDC.CreateCompatibleDC(pDC);//建立与屏幕pDC兼容的MemDC
MemDC.SelectObject(pOldBitmap);//恢复位图
NewBitmap.DeleteObject();//删除位图
MemDC.DeleteDC();//删除MemDC
ReleaseDC(pDC);//释放DC
}
DrawObject(&MemDC);
pDC->BitBlt(-rect.Width()/2,-rect.Height()/2,rect.Width(),rect.Height(),&MemDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);//将内存位图拷贝到屏幕
1.旋转变换:
void CTransform::RotateX(double beta)
{
//绕X轴旋转
Identity();
double angle = beta*PI/180;
T[1][1] = cos(angle);
T[1][2] = sin(angle);
T[2][1] = -sin(angle);
C2DP P1,P2;
for(int nFace=0; nFace<8; nFace++)//绘制各个面
{
for(int n=0; n<F[nFace].m_nVertex; n++)
{
P1 = P[F[nFace].v[n]];
if(n==0)
{
pDC->MoveTo(P1.x,P1.y);
P2=P1;
P[1].x=0; P[1].y=0; P[1].z=a;
P[2].x=a; P[2].y=0; P[2].z=0;
P[3].x=0; P[3].y=0; P[3].z=-a;
P[4].x=-a;P[4].y=0; P[4].z=0;
P[5].x=0; P[5].y=-a;P[5].z=0;
}
void CTestView::ReadFace()
}
else
pDC->LineTo(P1.x,P1.y);
}
pDC->LineTo(P2.x,P2.y);
}
}
4.在OnTimer中:
void CTestView::OnTimer(UINT nIDEvent)
{
alpha=5;
beta=5;
transform.RotateX(alpha);
transform.RotateY(beta);
MemDC.SetWindowExt(rect.Width(),rect.Height());
MemDC.SetViewportExt(rect.Width(),-rect.Height());
MemDC.SetViewportOrg(rect.Width()/2,rect.Height()/2);
}
3.绘制正八面体
void CTestView::DrawObject(CDC *pDC)
{
//绘制正八面体
CPen NewPen,*OldPen;
NewPen.CreatePen(PS_SOLID,2,RGB(255,255,255));
OldPen = pDC->SelectObject(&NewPen);
{//面的边数、面的顶点编号
F[0].En=3;F[0].v[0]=0;F[0].v[1]=1;F[0].v[2]=2;
F[2].En=3;F[1].v[0]=0;F[1].v[1]=2;F[1].v[2]=3;
F[3].En=3;F[2].v[0]=0;F[2].v[1]=3;F[2].v[2]=4;
T[2][2] = cos(angleቤተ መጻሕፍቲ ባይዱ;
MultiplyMatrix();
}
void CTransform::RotateY(double beta)
{
//绕Y轴旋转
Identity();
double angle = beta*PI/180;
T[0][0] = cos(angle);
T[0][2] = -sin(angle);
Invalidate(FALSE);
CView::OnTimer(nIDEvent);
}
5.双缓冲,并将坐标原点固定于屏幕中心
void CTestView::DoubleBuffer()
{
//双缓冲绘图
CDC* pDC=GetDC();
CRect rect;//定义客户区
GetClientRect(&rect);//获得客户区的大小
pDC->SetMapMode(MM_ANISOTROPIC);//pDC自定义坐标系
pDC->SetWindowExt(rect.Width(),rect.Height());//设置窗口范围
pDC->SetViewportExt(rect.Width(),-rect.Height());//x轴水平向右,y轴垂直向上
T[2][0] = sin(angle);
T[2][2] = cos(angle);
MultiplyMatrix();
}
void CTransform::RotateZ(double beta)
{
//绕Z轴旋转
Identity();
double angle = beta*PI/180;
T[0][0] = cos(angle);
相关文档
最新文档