关于Bezier曲线的生成问题

qq_23436877 2014-11-18 02:41:43
#include<GL/glut.h>
#include<math.h>
#include<stdlib.h>
class Pt3D//定义二维点坐标数据结构
{
public:
GLfloat x,y,z;
};//计算多项式的系数

void GetCnk(GLint n,GLint*c)
{
GLint i,k;
for(k=0;k<=n;k++)
{
c[k]=1;
for(i=n;i>=k+1;i--)
c[k]=c[k]*i;
for(i=n-k;i>=2;i--)
c[k]=c[k]/i;
}
}//计算Bezier曲线上点的坐标

void GetPointPr(GLint*c,GLfloat t,Pt3D*Pt,int ControlN,Pt3D*ControlP)
{
GLint k,n=ControlN-1;
GLfloat Bernstein;
Pt->x=0.0;
Pt->y=0.0;
Pt->z=0.0;
for(k=0;k<ControlN;k++)
{
Bernstein=c[k]*pow(t,k)*pow(1-n,n-k);
Pt->x+=ControlP[k].x*Bernstein;
Pt->x+=ControlP[k].x*Bernstein;
Pt->x+=ControlP[k].x*Bernstein;
}
}//根据控制点,求曲线上的m个点

void BezierCurve(GLint m,GLint ControlN,Pt3D*ControlP)
{
GLint*C,i;
Pt3D CurvePt;
C=new GLint[ControlN];
GetCnk(ControlN-1,C);
glBegin(GL_POINTS);
for(i=0;i<=m;i++)
{
GetPointPr(C,(GLfloat)i/(GLfloat)m,&CurvePt,ControlN,ControlP);
glVertex2f(CurvePt.x,CurvePt.y);
}
glEnd();
delete []C;
}

void initial(void)
{
glClearColor(1.0,1.0,1.0,0.0);
}

void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
GLint ControlN=4,m=500;//指定有4个控制点,生成的Bezier曲线由500个点组成
Pt3D ControlP[4]={{-80.0,-40.0,0.0},{-10.0,90.0,0.0},{10.0,-90.0,0.0},{80.0,40.0,0.0}};//控制点坐标
glPointSize(2);//设置当前绘制点大小
glColor3f(0.0,0.0,0.0);
BezierCurve(m,ControlN,ControlP);//绘制Bezier曲线
glBegin(GL_LINE_STRIP);//绘制控制多边形
for(GLint i=0;i<4;i++)
glVertex3f(ControlP[1].x,ControlP[1].y,ControlP[1].z);
glEnd();
glFlush();
}

void Reshape(GLint newWidth,GLint newHeight)
{
glViewport(0,0,newWidth,newHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-100.0,100.0,-100.0,100.0);
}

void main(void)
{
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式
glutInitWindowSize(400,400); //设置窗口的尺寸
glutInitWindowPosition(100,100); //设置窗口的位置
glutCreateWindow("Bezier直线"); //创建窗口名
glutDisplayFunc(Display); //设置当前窗口的显示回调函数
initial(); //完成窗口初始化
glutReshapeFunc(Reshape);
glutMainLoop(); //启动主GLUT事件处理循环
}
...全文
302 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujk 2015-01-10
  • 打赏
  • 举报
回复
你把工作分成几个步骤来完成 1.在窗体上画直线。 2.在窗体上画贝塞尔曲线 坐标都是通过代码来指定 3.移动控件并返回它的坐标。 4.将 2、3 结合起来,就可以了。 另外,贝塞尔是曲线
shiter 2014-11-18
  • 打赏
  • 举报
回复
http://blog.csdn.net/augusdi/article/details/20050495
shiter 2014-11-18
  • 打赏
  • 举报
回复
试了几个不同的显示模式,发现问题可能是程序逻辑的问题吧。 另外你也没有初始化啊:glutInit(&argc, argv);?//我也是初学




GLfloat ctrlpoints[9][3] = {{0,-0.2,0},{-1.2,-0.5,0},{-1.6,-1,0},{-1.4,-1.5,0},
{-1,-2.2,0},{-0.5,-2.7,0},{-0.35,-3.2,0},{-0.6,-3.7,0},{-1.6,-4.2,0}};//控制点

void init(void)
{
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glShadeModel(GL_FLAT);
	glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 9, &ctrlpoints[0][0]);
	glEnable(GL_MAP1_VERTEX_3);
}
void display(void)
{
	int i;
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 1.0, 1.0);
	glBegin(GL_POINTS);//(GL_LINE_STRIP);
	for (i = 0; i <= 30; i++) 
		glEvalCoord1f((GLfloat) i/30.0);
	glEnd();
	/* The following code displays the control points as dots. */
	glPointSize(5.0);
	glColor3f(1.0, 1.0, 0.0);
	glBegin(GL_POINTS);
	for (i = 0; i < 9; i++) 
		glVertex3fv(&ctrlpoints[i][0]);
	glEnd();
	glFlush();
}
void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if (w <= h)
		glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w, 
		5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);
	else
		glOrtho(-5.0*(GLfloat)w/(GLfloat)h, 
		5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y)
{
	switch (key) {
	case 27:
		exit(0);
		break;
	}
}
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize (500, 500);
	glutInitWindowPosition (100, 100);
	glutCreateWindow (argv[0]);
	init ();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutKeyboardFunc (keyboard);
	glutMainLoop();
	return 0;
}


qq_23436877 2014-11-18
  • 打赏
  • 举报
回复
研究了一天了,还是不知道哪出问题了,求大神解决
qq_23436877 2014-11-18
  • 打赏
  • 举报
回复
运行后出现的图形界面是这样的

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧