请教下面哈密三次曲线哪里不对?

请问下面哈密三次曲线哪里不对???
http://blog.163.com/liang_ce_521@126/blog/static/7092021520104141443158/


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

#include "stdafx.h"
/*********************************************
才才 2010-5-14
利用哈密顿三次曲线画一个心形图案(送给H)
/********************************************/
//注:P(t)=G*M*T
//包含所需的glut头文件。该头文件已经默认包含gl.h,和glu.h。
#include<math.h> //数学函数的头文件
#include <iostream>
using namespace std;
#include <gl/glut.h>
#include <gl/glut.h>
#include <gl/GLU.H>
#include <gl/GL.H>
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"opengl32.lib")


//定义顶点的个数
#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;