贝兹曲线(Bézier curve),貌似学图形学就肯定逃不出这个玩意。。。介绍什么的我也就不浪费笔墨了。直接看wiki好了
http://zh.wikipedia.org/zh/%E8%B2%9D%E8%8C%B2%E6%9B%B2%E7%B7%9A
然后呢,我们图形学课老师上机貌似要做这个,所以就提前写出来了。贴一下,加了详细的注释,也方便自己复习用~
对了,如果你是windows记得改一下头文件位置,这是unix下的头文件。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | /* * homework1.cpp * OpenGLhello * * Created by zerob13 on 10/13/10. * Copyright 2010 __MyCompanyName__. All rights reserved. * */ #include<stdio.h> #include <stdlib.h> #include<GLUT/GLUT.h> double x[4],y[4];//存放输入的四个控制点 /* *用以绘制曲线的函数 * */ void Bezier(double X0,double Y0, double X1,double Y1, double X2,double Y2, double X3,double Y3) { double xx,yy,X,Y; xx=X0;yy=Y0; glColor3f(1.0, 0, 0.0);//设定曲线颜色 /*for循环绘制曲线*/ for (double t=0.0; t<= 1.0;t=t+0.0001)//步长设置为0.0001,足够了 { X=xx;Y=yy; xx=(1-t)*(1-t)*(1-t)*X0+3*t*(1-t)*(1-t)*X1+3*t*t*(1-t)*X2+t*t*t*X3; yy=(1-t)*(1-t)*(1-t)*Y0+3*t*(1-t)*(1-t)*Y1+3*t*t*(1-t)*Y2+t*t*t*Y3;//最主要的两个方程,用以计算曲线的点 glPointSize(1.0); glBegin(GL_LINES);//描短直线成曲线 glVertex2f(X, Y); glVertex2f(xx, yy); glEnd(); glFlush(); } } /* *用以显示曲线以及辅助线的函数 * */ void display() { glClear(GL_COLOR_BUFFER_BIT);//清屏 glColor3f(0.0, 1, 0.0);//设定辅助线颜色 glPointSize(1.0);//设定点大小 glBegin(GL_LINES);//画辅助线 glVertex2f(x[0],y[0]); glVertex2f(x[1], y[1]); glVertex2f(x[1],y[1]); glVertex2f(x[2], y[2]); glVertex2f(x[2],y[2]); glVertex2f(x[3], y[3]); glEnd(); glFlush(); Bezier(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]); } /* *主函数 * */ int main(int argc,char ** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(0, 0); glutInitWindowSize(500, 500); glutCreateWindow("Zerob13's Bezier Demo"); printf("Please input 4 Points:\n"); scanf("%lf %lf %lf %lf %lf %lf %lf %lf",x,y,x+1,y+1,x+2,y+2,x+3,y+3); glutDisplayFunc(display); glutMainLoop(); return 0; } |
