#include<windows.h>
#include <stdio.h>
#include<gl/glut.h>
#include<vector>
#include<iostream>
using namespace std;
const int MaxNum = 200;vector<int>Face[10];//最大数面数vector
int winWidth = 1000, winHeight = 600;//窗口宽高
int PointNum = 4, FaceNum = 4; //用户图形的顶点,面数
double Matrix[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 },
{ 0, 0, 1, 0 }, { 500, 300, 300, 1 }
};//初始化为单位矩阵
double XOZ[4][4] = { { 1, 0, 0, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 1, 0 }, { 0, 0, 0, 1 }
};//主视图变换矩阵
double XOY[4][4] = { { 1, 0, 0, 0 }, { 0, 0, -1, 0 },
{ 0, 0, 0, 0 }, { 0, 0, -50, 1 }
};//俯视图变换矩阵
double YOZ[4][4] = { { 0, 0, 0, 0 }, { -1, 0, 0, 0 },
{ 0, 0, 1, 0 }, { -150, 0, 0, 1 }
};//侧视图变换矩阵
double DD= -400, NN = -200, MM = -360, LL = -500;//DD视点平移到适当距离NN.MM.LL
double YOY[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 },
{ 0, 0, 0, 1 / DD }, { LL, MM, 0, 1 + NN / DD }
};//一点透视矩阵
//定义图形的顶点 www.docin.comstruct
struct DefPoint
{
double x, y, z, tag;
}Point[MaxNum], TPoint[MaxNum], XOZPoint[MaxNum],XOYPoint[MaxNum],YOZPoint[MaxNum],YOYPoint[MaxNum];
//初始化自定义三维图形
void ThPmidInit()
{
PointNum = 4;
Point[0].x = 400, Point[0].y = 0, Point[0].z = 0,
Point[0].tag = 1;
Point[1].x = 400, Point[1].y = 200, Point[1].z = 0,
Point[1].tag = 1;
Point[2].x = 0, Point[2].y = 200, Point[2].z = 0,
Point[2].tag = 1;
Point[3].x = 200, Point[3].y = 200, Point[3].z = 200,
Point[3].tag = 1;
FaceNum = 4;
Face[0].push_back(0);
Face[0].push_back(1);
Face[0].push_back(2);
Face[1].push_back(0);
Face[1].push_back(1);
Face[1].push_back(3);
Face[2].push_back(0);
Face[2].push_back(2);
Face[2].push_back(3);
Face[3].push_back(1);
Face[3].push_back(2);
Face[3].push_back(3);
}
//获得变换后的用户图形的顶点
void TransForm(DefPoint NewPoint[], DefPoint OldPoint[],double Tran[4][4])
{
for (int i = 0; i<PointNum; i++)
{
double tx = OldPoint[i].x, ty = OldPoint[i].y,tz = OldPoint[i].z, ttag = OldPoint[i].tag;
NewPoint[i].x = tx*Tran[0][0] + ty*Tran[1][0] + tz*Tran[2][0] + ttag*Tran[3][0];
NewPoint[i].y = tx*Tran[0][1] + ty*Tran[1][1] + tz*Tran[2][1] + ttag*Tran[3][1];
NewPoint[i].z = tx*Tran[0][2] + ty*Tran[1][2] + tz*Tran[2][2] + ttag*Tran[3][2];
NewPoint[i].tag = tx*Tran[0][3] + ty*Tran[1][3] + tz*Tran[2][3] + ttag*Tran[3][3];
if (NewPoint[i].tag != 0 && NewPoint[i].tag != 1)
{
NewPoint[i].x /= NewPoint[i].tag,NewPoint[i].y /= NewPoint[i].tag,NewPoint[i].z /= NewPoint[i].tag,NewPoint[i].tag = 1;
}
}
}
//重新指定窗口的宽高
void ReShape(int w, int h)
{
winWidth = w; winHeight = h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, winWidth, 0.0, winHeight);
}
//绘制指定的图形
void OnDraw(DefPoint TempPoint[])
{
glBegin(GL_LINES);
for (int i = 0; i<FaceNum; i++)
{
int size = Face[i].size();
for (int j = 0; j<size; j++)
{
glVertex2d(TempPoint[Face[i][j]].x,TempPoint[Face[i][j]].z);
glVertex2d(TempPoint[Face[i][(j + 1) % size]].x,TempPoint[Face[i][(j + 1) % size]].z);
}
}
glEnd();
}
//绘制指定的图形
void OnDraw_O(DefPoint TempPoint[])
{
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_LINES);
glVertex2d(TempPoint[0].x, TempPoint[0].y);
glVertex2d(TempPoint[1].x, TempPoint[1].y);
glVertex2d(TempPoint[0].x, TempPoint[0].y);
glVertex2d(TempPoint[2].x, TempPoint[2].y);
glVertex2d(TempPoint[0].x, TempPoint[0].y);
glVertex2d(TempPoint[3].x, TempPoint[3].y);
glVertex2d(TempPoint[1].x, TempPoint[1].y);
glVertex2d(TempPoint[2].x, TempPoint[2].y);
glVertex2d(TempPoint[1].x, TempPoint[1].y);
glVertex2d(TempPoint[3].x, TempPoint[3].y);
glVertex2d(TempPoint[2].x, TempPoint[2].y);
glVertex2d(TempPoint[3].x, TempPoint[3].y);
glEnd();
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_LINES);
glVertex2d(TempPoint[0].x, TempPoint[0].y);
glVertex2d(0, 0);
glVertex2d(TempPoint[1].x, TempPoint[1].y);
glVertex2d(0, 0);
glVertex2d(TempPoint[2].x, TempPoint[2].y);
glVertex2d(0, 0);
glVertex2d(TempPoint[3].x, TempPoint[3].y);
glVertex2d(0, 0);
glEnd();
}
//绘制坐标系
void OnCoordinate()
{
glColor3f(0.0f, 0.0f, 0.0f);
glBegin(GL_LINES);
glVertex2d(winWidth / 2, 0);
glVertex2d(winWidth / 2, winHeight);
glVertex2d(0, winHeight / 2);
glVertex2d(winWidth, winHeight / 2);
//标记Z轴
glVertex2d(winWidth / 2 + 5, winHeight - 15);
glVertex2d(winWidth / 2 + 15, winHeight - 15);
glVertex2d(winWidth / 2 + 5, winHeight - 25);
glVertex2d(winWidth / 2 + 15, winHeight - 15);
glVertex2d(winWidth / 2 + 5, winHeight - 25);
glVertex2d(winWidth / 2 + 15, winHeight - 25);
glVertex2d(winWidth / 2 - 5, winHeight - 5);
glVertex2d(winWidth / 2, winHeight);
glVertex2d(winWidth / 2 + 5, winHeight - 5);
glVertex2d(winWidth / 2, winHeight);
//标记Y轴
glVertex2d(winWidth / 2 + 25, 0 + 15);
glVertex2d(winWidth / 2 + 20, 0 + 10);
glVertex2d(winWidth / 2 + 15, 0 + 15);
glVertex2d(winWidth / 2 + 20, 0 + 10);
glVertex2d(winWidth / 2 + 20, 0 + 10);
glVertex2d(winWidth / 2 + 20, 0 + 5);
glVertex2d(winWidth / 2 - 5, 0 + 5);
glVertex2d(winWidth / 2, 0);
glVertex2d(winWidth / 2 + 5, 0 + 5);
glVertex2d(winWidth / 2, 0);
//标记Y轴
glVertex2d(0 + 25, winHeight / 2 + 15);
glVertex2d(0 + 20, winHeight / 2 + 10);
glVertex2d(0 + 15, winHeight / 2 + 15);
glVertex2d(0 + 20, winHeight / 2 + 10);
glVertex2d(0 + 20, winHeight / 2 + 10);
glVertex2d(0 + 20, winHeight / 2 + 5);
glVertex2d(0 + 5, winHeight / 2 + 5);
glVertex2d(0, winHeight / 2);
glVertex2d(0 + 5, winHeight / 2 - 5);
glVertex2d(0, winHeight / 2);
//标记X轴
glVertex2d(winWidth - 25, winHeight / 2 + 15);
glVertex2d(winWidth - 15, winHeight / 2 + 5);
glVertex2d(winWidth - 25, winHeight / 2 + 5);
glVertex2d(winWidth - 15, winHeight / 2 + 15);
glVertex2d(winWidth - 5, winHeight / 2 - 5);
glVertex2d(winWidth, winHeight / 2);
glVertex2d(winWidth - 5, winHeight / 2 + 5);
glVertex2d(winWidth, winHeight / 2);
glEnd();
}
//绘制图形
void Display()
{
glClear(GL_COLOR_BUFFER_BIT);
OnCoordinate();
glColor3f(0.0f, 0.0f, 0.0f);
glBegin(GL_LINES);
glVertex2d(winWidth / 2, 0);
glVertex2d(winWidth / 2, winHeight);
glVertex2d(0, winHeight / 2);
glVertex2d(winWidth, winHeight / 2);
glEnd();
glColor3f(1.0f, 0.0f, 0.0f);
OnDraw(XOZPoint);
glColor3f(0.0f, 1.0f, 0.0f);
OnDraw(XOYPoint); glColor3f(0.0f, 0.0f, 1.0f);
OnDraw(YOZPoint);
glColor3f(1.0f, 0.0f, 0.0f);
OnDraw_O(YOYPoint);
glutSwapBuffers();
}
//三维图形变换主函数
void GetThPmidView()
{
TransForm(XOZPoint, Point, XOZ);
TransForm(XOYPoint, Point, XOY);
TransForm(YOZPoint, Point, YOZ);
TransForm(YOYPoint, Point, YOY);
TransForm(XOZPoint, XOZPoint, Matrix);
TransForm(XOYPoint, XOYPoint, Matrix);
TransForm(YOZPoint, YOZPoint, Matrix);
TransForm(YOYPoint, YOYPoint, Matrix);
}
//初始化
void Initial()
{
for (int i = 0; i<10; i++)Face[i].clear();
glClearColor(1.0f,1.0f, 1.0f, 1.0f);
ThPmidInit();
GetThPmidView();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLU