opengl哈密顿曲线//为什么画不出来了?

opengl哈密顿曲线//为啥画不出来了???
本帖最后由 mirroatl187 于 2014-02-23 17:20:47 编辑
opengl哈密顿曲线//为什么画不出来了?

// g_test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "gl/h/glut.h"
#include "gl/h/GLU.H"
#include "gl/h/GL.H"
#pragma comment(lib,"./gl/lib/glut32.lib")
#pragma comment(lib,"./gl/lib/glu32.lib")
#pragma comment(lib,"./gl/lib/opengl32.lib")
#include <iostream>
#include <math.h>
using namespace std;

#define COUNT 100
#define nC 200.0000

typedef struct{
GLfloat x;
GLfloat y;
GLfloat z;
}vertexD;

//创建用于计算三次哈密特曲线的矩阵,
//[1, 0, -3, 2]
//[0, 0,  3,-2]
//[0, 1, -2, 1]
//[0, 0, -1, 1]
float hemite[4][4]={ {1, 0, -3, 2},
                     {0, 0,  3,-2},
                     {0, 1, -2, 1},
                     {0, 0, -1, 1}};
float pr[3][4]={{  0,   0,1000 , -1500},
                {200,-150,1000 ,-500},
                {  0,   0,  0,  0}};
float coe[3][4];
void creatCoe()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
coe[i][j]=0;
for(int k=0;k<4;k++)
{   //矩阵的乘法 C = G*M
coe[i][j]+=(pr[i][k] * hemite[k][j]);

}
}
}


vertexD vD[COUNT];
void creatV()
{
vD[0].x=pr[0][0];
vD[0].y=pr[1][0];
vD[0].z=0;
float t=0.0000;    //
float delta=1/nC;  //设置等分的数量,变化值
for(int i=1;i<nC;i++)  //利用矩阵求出各点P= C*T
{
//T的转置矩阵为:[1,t,t^2,t^3]
t+=delta;
vD[i].x=coe[0][0]+coe[0][1]*t + coe[0][2]*t*t + coe[0][3]*t*t*t;
vD[i].y=coe[1][0]+coe[1][1]*t + coe[1][2]*t*t + coe[1][3]*t*t*t;
vD[i].z=coe[2][0]+coe[2][1]*t + coe[2][2]*t*t + coe[2][3]*t*t*t;
cout<<"["<<vD[i].x<<","<<vD[i].y<<","<<vD[i].z<<"]"<<endl;
}
vD[int(nC)].x=pr[0][1];
vD[int(nC)].y=pr[1][1];
vD[int(nC)].z=0;
}

void init()
{
//用于清屏的颜色rgba,在0--1之间的浮点数
glClearColor(1, 1, 1, 0.0);
//指定渲染模式:Flat(整个图元一个颜色), Smooth(光滑,插值)
glShadeModel(GL_FLAT);    //默认状态下就是光滑模式
}

//当窗口的内容需要进行重绘时将要被调用的函数。
//如:窗口刚被打开,被弹出,窗口的内容遭到破坏等。
//该函数中定义具体要绘制图形的语句。
void display()
{
cout<<"窗口被重绘"<<endl;
creatCoe();
creatV();
//执行清屏工作。参数表示清除哪个缓存
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0);
//调用glBegin、glEnd函数绘制图元
glLineWidth(3);   //设置线宽为像素
glBegin(GL_LINE_STRIP);    //开始绘制---利用参数指定图元类型为三角形 
for(int i=0; i<nC+1; i++)
{
glVertex2f(vD[i].x, vD[i].y);
}
glEnd();
glBegin(GL_LINE_STRIP);
for(int i=0;i<nC+1;i++)
{
glVertex2f(-vD[i].x, vD[i].y);
}
glEnd();    //绘制结束 
//强制执行opengl函数,不缓存
glFlush();
}

//当屏幕第一次被创建,或窗口的大小改变,窗口被移动的时候调用这个函数
void reshape(int w, int h)
{
//输出被改变的新的窗口大小
cout<<"新的窗口大小:"<<w<<", "<<h<<endl;
//设置新的画布大小,也就是我们看到的窗口的矩形区域大小---视口大小
//视口:是个矩形的窗口区域,图形就是在这个区域中绘制的。
//视口是用窗口坐标来测量的。默认情况下,视口被设置为占据打开窗口的整个像素矩形。
//我们还可以对窗口进行划分,在同一个窗体中显示分隔屏幕的效果。
//参数分别为:窗口左下角,窗口的宽度和高度。
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
//设置投影矩阵---glMatrixMode:指定哪一个矩阵是当前矩阵
glMatrixMode(GL_PROJECTION);     //标明接下来的函数影响投影矩阵,而不是模型变换矩阵。
//单位化,消除前面的矩阵留下的影响
glLoadIdentity();              
//正投影:参数分别为左右,下上。裁剪区域为矩形。
gluOrtho2D(-500, 500,-500, 500);    //定义坐标系范围--视景体
}

//获取鼠标的位置
void motion(int x, int y)
{
cout<<"鼠标被按下,并移动。位置为:"<<x<<", "<<y<<endl;
}

int _tmain(int argc, char* argv[])
{
//初始化GLUT,在所有glut函数调用之前调用该函数
glutInit(&argc, argv);
//初始化显示模式:RGBA颜色模式, 单缓存
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
//初始化窗口位置
glutInitWindowPosition(400,200);
//初始化窗口大小
glutInitWindowSize(500,500);
//创建上述函数定义的窗口,参数为窗口标题
glutCreateWindow("才才——三次哈密顿曲线");
//进行绘图前的一些初始化工作
init();
display();
glutDisplayFunc(display);  //设置窗口显示回调函数
glutReshapeFunc(reshape);  //设置窗口大小改变回调函数
glutMotionFunc(motion);    //设置鼠标按住移动回调函数  
glutMainLoop();   //进入事件循环,等待事件和消息,直到程序退出为止