抛物样条曲线

最近写了很多的图形学方面的程序,给大家分享下。

源代码如下,需要opengl库函数的支持。

#include <GL/glut.h>
#include<Windows.h>

GLfloat bc=0.0001f;
int sign=0;
void drawparabola(GLfloat point[10][2],GLint num)
{
     GLfloat px,py;
     GLint i=0;
     for(i=0;i<num-2;i++)
     {   GLfloat t,tempt;
         if(i==0||i==num-3)
         {
             if(sign==0)
             {   tempt=0.0f;sign=1;}
             else
             {   tempt=0.5f;sign=0;}
            
             for(t=tempt;t<(tempt+0.5f);)
             {
                  px=(2*t*t-3*t+1)*point[i][0]+(4*t-4*t*t)*point[i+1][0]+(2*t*t-t)*point[i+2][0];
                  py=(2*t*t-3*t+1)*point[i][1]+(4*t-4*t*t)*point[i+1][1]+(2*t*t-t)*point[i+2][1];
                  t=t+bc;
                  glColor3f(1.0,1.0,0.0);
                  glBegin(GL_POINTS);
                     glVertex2f(px,py);
                  glEnd();
             }
         }
     }
     for(i=0;i<num-3;i++)
     {   GLfloat t;

         for(t=0.0f;t<=0.5f;)
         {
              px=(-4*t*t*t+4*t*t-t)*point[i][0]+(12*t*t*t-10*t*t+1)*point[i+1][0]+(-12*t*t*t+8*t*t+t)*point[i+2][0]+(4*t*t*t-2*t*t)*point[i+3][0];
              py=(-4*t*t*t+4*t*t-t)*point[i][1]+(12*t*t*t-10*t*t+1)*point[i+1][1]+(-12*t*t*t+8*t*t+t)*point[i+2][1]+(4*t*t*t-2*t*t)*point[i+3][1];
              t=t+bc;
              glColor3f(1.0,0.0,0.0);
              glBegin(GL_POINTS);
                 glVertex2f(px,py);
              glEnd();
         }
     }
}


void display()
{
     GLfloat point[7][2]={{-0.7f,-0.2f},{-0.5f,0.6f},{-0.2f,-0.2f},{0.4f,0.6f},{0.6f,-0.2f},{0.8f,0.6f},{1.0,-0.2f}};
     glClear(GL_COLOR_BUFFER_BIT);
     glColor3f(1.0,0.0,0.0);//设置当前颜色状态为红色
     drawparabola(point,7);
     glFlush();//发送缓冲区
    
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("抛物样条曲线");
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值