📄 figure.cpp
字号:
//Version 1.1c
//Code by Phil.Z
//Date 2007-12-28
#include "stdafx.h"
#include "Figure.h"
#include <cmath>
//==========PT类实现================
PT::PT(float x,float y,float z) : X(x),Y(y),Z(z)
{
}
PT::PT(float * CoordList) : X(*CoordList),Y(*(CoordList + 1)),Z(*(CoordList + 2))
{
}
//=========Figure类实现=============
Figure::Figure() : m_fXRot(0),m_fYRot(0),m_fZRot(0),
m_nName(-1),m_bCurFigure(false)
{
}
Figure::~Figure()
{
}
void Figure::GetRot(float CurRot[]) const
{
CurRot[0] = m_fXRot;
CurRot[1] = m_fYRot;
CurRot[2] = m_fZRot;
}
void Figure::SetRot(float RotData[])
{
m_fXRot = RotData[0];
m_fYRot = RotData[1];
m_fZRot = RotData[2];
}
bool Figure::GetCurStatue() const
{
return m_bCurFigure;
}
void Figure::SetCurStatue(bool statue)
{
m_bCurFigure = statue;
}
int Figure::GetName() const
{
return m_nName;
}
void Figure::SetName(int newName)
{
m_nName = newName;
}
void Figure::Display() const
{
glRotatef(m_fXRot,1,0,0);
glRotatef(m_fYRot,0,1,0);
glRotatef(m_fZRot,0,0,1);
}
//========Figure2D类实现============
Figure2D::Figure2D() : m_vecMove(0,0,0)
{
}
Figure2D::~Figure2D()
{
}
void Figure2D::SetPos(float MoveVec[])
{
m_vecMove.X = MoveVec[0];
m_vecMove.Y = MoveVec[1];
m_vecMove.Z = MoveVec[2];
}
void Figure2D::GetPos(float MoveVec[])
{
MoveVec[0] = m_vecMove.X;
MoveVec[1] = m_vecMove.Y;
MoveVec[2] = m_vecMove.Z;
}
void Figure2D::Display() const
{
glTranslatef(m_vecMove.X,m_vecMove.Y,m_vecMove.Z);
}
//========Figure3D类实现=============
Figure3D::Figure3D(float ptCenter[]) : m_ptCenter(ptCenter)
{
}
void Figure3D::GetPos(float ptPos[])
{
ptPos[0] = m_ptCenter.X;
ptPos[1] = m_ptCenter.Y;
ptPos[2] = m_ptCenter.Z;
}
void Figure3D::SetPos(float ptPos[])
{
m_ptCenter.X = ptPos[0];
m_ptCenter.Y = ptPos[1];
m_ptCenter.Z = ptPos[2];
}
void Figure3D::Display() const
{
glTranslatef(m_ptCenter.X,m_ptCenter.Y,m_ptCenter.Z);
}
//=========Point类实现==============
Point::Point(float *initList) : m_Point(&initList[0]),
m_fSize(initList[3])
{
m_afColor[0] = initList[4];
m_afColor[1] = initList[5];
m_afColor[2] = initList[6];
}
Point::~Point()
{
}
void Point::Display() const
{
Figure2D::Display();
Figure::Display();
glPointSize(m_fSize);
glColor3fv(m_afColor);
glBegin(GL_POINTS);
glVertex3f(m_Point.X,m_Point.Y,m_Point.Z);
glEnd();
if (m_bCurFigure)
{
glPushAttrib(GL_LIGHTING_BIT);
glDisable(GL_LIGHTING);
glColor3f(1,1,1);
glLineWidth(1);
glBegin(GL_LINES);
//右上
glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y + m_fSize * 1.5,m_Point.Z);
glVertex3f(m_Point.X + m_fSize * 1.2,m_Point.Y + m_fSize * 1.5,m_Point.Z);
glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y + m_fSize * 1.5,m_Point.Z);
glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y + m_fSize * 1.2,m_Point.Z);
//右下
glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y - m_fSize * 1.5,m_Point.Z);
glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y - m_fSize * 1.2,m_Point.Z);
glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y - m_fSize * 1.5,m_Point.Z);
glVertex3f(m_Point.X + m_fSize * 1.2,m_Point.Y - m_fSize * 1.5,m_Point.Z);
//左上
glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y + m_fSize * 1.5,m_Point.Z);
glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y + m_fSize * 1.2,m_Point.Z);
glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y + m_fSize * 1.5,m_Point.Z);
glVertex3f(m_Point.X - m_fSize * 1.2,m_Point.Y + m_fSize * 1.5,m_Point.Z);
//左下
glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y - m_fSize * 1.5,m_Point.Z);
glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y - m_fSize * 1.2,m_Point.Z);
glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y - m_fSize * 1.5,m_Point.Z);
glVertex3f(m_Point.X - m_fSize * 1.2,m_Point.Y - m_fSize * 1.5,m_Point.Z);
glEnd();
glPopAttrib();
}
}
//==========Line类实现===========
Line::Line(float *initList) : m_ptFrom(&initList[0]),
m_ptTo(&initList[3]),
m_fWidth(initList[6])
{
m_afColor[0] = initList[7];
m_afColor[1] = initList[8];
m_afColor[2] = initList[9];
}
Line::~Line()
{
}
void Line::Display() const
{
Figure2D::Display();
Figure::Display();
glLineWidth(m_fWidth);
glColor3fv(m_afColor);
glBegin(GL_LINES);
glVertex3f(m_ptFrom.X,m_ptFrom.Y,m_ptFrom.Z);
glVertex3f(m_ptTo.X,m_ptTo.Y,m_ptTo.Z);
glEnd();
if (m_bCurFigure)
{
glPushAttrib(GL_LIGHTING_BIT);
glDisable(GL_LIGHTING);
glColor3f(1,1,1);
glLineWidth(1);
glBegin(GL_LINES);
//左上
glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y + m_fWidth * 0.75,m_ptFrom.Z);
glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y + m_fWidth * 0.25,m_ptFrom.Z);
glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y + m_fWidth * 0.75,m_ptFrom.Z);
glVertex3f(m_ptFrom.X + m_fWidth * 3,m_ptFrom.Y + m_fWidth * 0.75,m_ptFrom.Z);
//左下
glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y - m_fWidth * 0.75,m_ptFrom.Z);
glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y - m_fWidth * 0.25,m_ptFrom.Z);
glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y - m_fWidth * 0.75,m_ptFrom.Z);
glVertex3f(m_ptFrom.X + m_fWidth * 3,m_ptFrom.Y - m_fWidth * 0.75,m_ptFrom.Z);
//右上
glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y + m_fWidth * 0.75,m_ptTo.Z);
glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y + m_fWidth * 0.25,m_ptTo.Z);
glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y + m_fWidth * 0.75,m_ptTo.Z);
glVertex3f(m_ptTo.X - m_fWidth * 3,m_ptTo.Y + m_fWidth * 0.75,m_ptTo.Z);
//右下
glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y - m_fWidth * 0.75,m_ptTo.Z);
glVertex3f(m_ptTo.X - m_fWidth * 3,m_ptTo.Y - m_fWidth * 0.75,m_ptTo.Z);
glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y - m_fWidth * 0.75,m_ptTo.Z);
glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y - m_fWidth * 0.25,m_ptTo.Z);
glEnd();
glPopAttrib();
}
}
//=========Rect类实现==========
int Rect::m_nRectNum = 0;
unsigned int Rect::m_nDispList = 0;
Rect::Rect(float *initList) : m_ptCenter(&initList[0]),
m_fWidth(initList[3]),
m_fHeight(initList[4]),
m_nFillMode(initList[5])
{
m_afColor[0] = initList[6];
m_afColor[1] = initList[7];
m_afColor[2] = initList[8];
m_nRectNum++; //引用计数,如果当前没有该类的对象创建显示列表
if (m_nRectNum == 1)
{
m_nDispList = glGenLists(1);
glNewList(m_nDispList,GL_COMPILE);
glBegin(GL_QUADS);
glVertex3f(-0.5,0.5,0);
glVertex3f(-0.5,-0.5,0);
glVertex3f(0.5,-0.5,0);
glVertex3f(0.5,0.5,0);
glEnd();
glEndList();
}
}
Rect::~Rect()
{
m_nRectNum--; //更新引用计数,在最后一个对象销毁时删除显示列表
if (m_nRectNum == 0)
glDeleteLists(m_nDispList,1);
}
void Rect::Display() const
{
glPolygonMode(GL_FRONT,m_nFillMode);
glPushMatrix();
glTranslatef(m_ptCenter.X,m_ptCenter.Y,m_ptCenter.Z);
Figure2D::Display();
Figure::Display();
glScalef(m_fWidth,m_fHeight,1);
if (m_bCurFigure)
{
glPushAttrib(GL_LIGHTING_BIT);
glDisable(GL_LIGHTING);
glColor3f(1,1,1);
glLineWidth(1);
glBegin(GL_LINES);
//左上
glVertex3f(-0.6,0.6,0);
glVertex3f(-0.4,0.6,0);
glVertex3f(-0.6,0.6,0);
glVertex3f(-0.6,0.4,0);
//左下
glVertex3f(-0.6,-0.6,0);
glVertex3f(-0.4,-0.6,0);
glVertex3f(-0.6,-0.6,0);
glVertex3f(-0.6,-0.4,0);
//右上
glVertex3f(0.6,0.6,0);
glVertex3f(0.4,0.6,0);
glVertex3f(0.6,0.6,0);
glVertex3f(0.6,0.4,0);
//右下
glVertex3f(0.6,-0.6,0);
glVertex3f(0.4,-0.6,0);
glVertex3f(0.6,-0.6,0);
glVertex3f(0.6,-0.4,0);
glEnd();
glPopAttrib();
}
glColor3fv(m_afColor);
glCallList(m_nDispList);
glPopMatrix();
}
//========2D图形圆类实现==========
int Circle::m_nCircleNum = 0;
unsigned int Circle::m_nDispList = 0;
Circle::Circle(float *initList) : m_ptCenter(&initList[0]),
m_fXRadius(initList[3]),
m_fYRadius(initList[4])
{
m_afColor[0] = initList[5];
m_afColor[1] = initList[6];
m_afColor[2] = initList[7];
m_nCircleNum++; //引用计数,在创建第一个对象时创建显示列表
if (m_nCircleNum == 1)
{
const double PI = 3.1415926;
m_nDispList = glGenLists(1);
glNewList(m_nDispList,GL_COMPILE);
glBegin(GL_POLYGON);
for (int i = 1000;i >= 0;i--)
glVertex3f(cos(2 * i * PI / 1000),sin(2 * i * PI / 1000),0);
glEnd();
glEndList();
}
}
Circle::~Circle()
{
m_nCircleNum--; //更新引用计数,在最后一个对象销毁时删除显示列表
if (m_nCircleNum == 0)
glDeleteLists(m_nDispList,1);
}
void Circle::Display() const
{
glPushMatrix();
glTranslatef(m_ptCenter.X,m_ptCenter.Y,m_ptCenter.Z);
Figure2D::Display();
Figure::Display();
glScalef(m_fXRadius,m_fYRadius,1);
if (m_bCurFigure)
{
glColor3f(1,1,1);
glLineWidth(1);
glBegin(GL_LINES);
//左上
glVertex3f(-1,1,0);
glVertex3f(-0.5,1,0);
glVertex3f(-1,1,0);
glVertex3f(-1,0.5,0);
//左下
glVertex3f(-1,-1,0);
glVertex3f(-0.5,-1,0);
glVertex3f(-1,-1,0);
glVertex3f(-1,-0.5,0);
//右上
glVertex3f(1,1,0);
glVertex3f(0.5,1,0);
glVertex3f(1,1,0);
glVertex3f(1,0.5,0);
//右下
glVertex3f(1,-1,0);
glVertex3f(0.5,-1,0);
glVertex3f(1,-1,0);
glVertex3f(1,-0.5,0);
glEnd();
}
glColor3fv(m_afColor);
glCallList(m_nDispList);
glPopMatrix();
}
//=========立方体类实现==========
int Cube::m_nCubeNum = 0;
unsigned int Cube::m_nDispList = 0;
Cube::Cube(float *initList) : Figure3D(&initList[0]),
m_fXLength(initList[3]),
m_fYLength(initList[4]),
m_fZLength(initList[5])
{
m_afColor[0] = initList[6];
m_afColor[1] = initList[7];
m_afColor[2] = initList[8];
m_nCubeNum++; //引用计数,在创建第一个对象时创建显示列表
if (m_nCubeNum == 1)
{
m_nDispList = glGenLists(1);
glNewList(m_nDispList,GL_COMPILE);
glBegin(GL_QUADS);
//Front
glNormal3f(0,0,1);
glVertex3f(-0.5,0.5,0.5);
glVertex3f(-0.5,-0.5,0.5);
glVertex3f(0.5,-0.5,0.5);
glVertex3f(0.5,0.5,0.5);
//Back
glNormal3f(0,0,-1);
glVertex3f(0.5,0.5,-0.5);
glVertex3f(0.5,-0.5,-0.5);
glVertex3f(-0.5,-0.5,-0.5);
glVertex3f(-0.5,0.5,-0.5);
//Left
glNormal3f(-1,0,0);
glVertex3f(-0.5,0.5,-0.5);
glVertex3f(-0.5,-0.5,-0.5);
glVertex3f(-0.5,-0.5,0.5);
glVertex3f(-0.5,0.5,0.5);
//Right
glNormal3f(1,0,0);
glVertex3f(0.5,0.5,0.5);
glVertex3f(0.5,-0.5,0.5);
glVertex3f(0.5,-0.5,-0.5);
glVertex3f(0.5,0.5,-0.5);
//Up
glNormal3f(0,1,0);
glVertex3f(-0.5,0.5,-0.5);
glVertex3f(-0.5,0.5,0.5);
glVertex3f(0.5,0.5,0.5);
glVertex3f(0.5,0.5,-0.5);
//Down
glNormal3f(0,-1,0);
glVertex3f(0.5,-0.5,-0.5);
glVertex3f(0.5,-0.5,0.5);
glVertex3f(-0.5,-0.5,0.5);
glVertex3f(-0.5,-0.5,-0.5);
glEnd();
glEndList();
}
}
Cube::~Cube()
{
m_nCubeNum--; //更新引用计数,在最后一个对象销毁时删除显示列表
if (m_nCubeNum == 0)
glDeleteLists(m_nDispList,1);
}
void Cube::Display() const
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -