OpenGl中如何在一个在窗口坐标中固定大小绘图

void CModelView::test()//by ZhouZhuo 2014.06.21 固定大小绘图测试
{	
	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();

	GLfloat oldcolor[4];
	glGetFloatv(GL_CURRENT_COLOR,oldcolor);
	GLfloat oldlinewidth;
	glGetFloatv(GL_LINE_WIDTH,&oldlinewidth);
	int OpenGLVersion[2];
	glGetIntegerv(GL_MAJOR_VERSION, &OpenGLVersion[0]);
	glGetIntegerv(GL_MINOR_VERSION, &OpenGLVersion[1]);
	glLineWidth(2);
	int l = glGetError();
	if (l == GL_INVALID_VALUE)
	{
		return;
	}
	glDisable(GL_LIGHTING);

	float delta = 0;	
	float r = 100;
	Pnt3 v;
	Pnt3 newv;


	GLdouble modelviewM[16];
	glGetDoublev(GL_MODELVIEW_MATRIX,modelviewM);
	MatX4 M(modelviewM);
	M.Transpose();//一定要转置
	MatX4 Mi = M;	
	Mi.Invert();

	GLdouble projectionP[16];
	glGetDoublev(GL_PROJECTION_MATRIX,projectionP);
	MatX4 P(projectionP);
	P.Transpose();
	MatX4 Pi = P;
	Pi.Invert();

	Pnt3 centerinObjectCrood(200,0,0);
	float ratio = 0.1*Pi.m[0][0]/r;
	Pnt3 center2(0,0,0);

	glBegin(GL_LINES);
	glColor3f(1,0,0);
	glVertex3f(0,0,0);
	glVertex3f(500,0,0);
	glColor3f(0,1,0);
	glVertex3f(0,0,0);
	glVertex3f(0,500,0);
	glColor3f(0,0,1);
	glVertex3f(0,0,0);
	glVertex3f(0,0,500);
	glEnd();
	Pnt4 v4;
	Pnt3 yu(0,1,0);
	Pnt3 xu(1,0,0);
	xu = xu.Normalize();
	glBegin(GL_LINE_LOOP);//方法一
	glColor3f(1,0,0);
	for (int i = 0;i<100;i++)
	{ 
		delta += 2*PI/100;
		v = xu*3*0.1*sin(delta) + yu*3*0.1*cos(delta);//经过模型视图矩阵,视景体投影矩阵后,坐标应为,在一个长宽高都是1的归一化视景体中
		v4 = Pnt4(v.x,v.y,v.z,1);
		//v *= ratio;
		v4 = Mi*Pi*v4;
		v4 =v4/v4.w;
		glVertex3f(v4.x,v4.y,v4.z);

	}
	glEnd();

	yu =Pnt3(0,1,0);
	xu =Pnt3(1,0,0);
	glBegin(GL_LINE_LOOP);//方法二
	glColor3f(0,1,0);
	for (int i = 0;i<100;i++)
	{ 
		delta += 2*PI/100;
		v = xu*2*r*sin(delta) + yu*2*r*cos(delta);		
		v *= ratio;
		v = v ;
		newv = Mi*v - Mi*Pnt3(0,0,0)+ centerinObjectCrood;//注意,此处的原点坐标(0,0,0)不是零向量齐次坐标应为(0,0,0,1),不可用结合律
		glVertex3f(newv.x,newv.y,newv.z);

	}
	glEnd();

	yu = Pnt3(0,0.5,1);
	xu = Pnt3(1,0,0);
	yu = yu.Normalize();
	glBegin(GL_LINE_LOOP);
	glColor3f(0,0,1);
	for (int i = 0;i<100;i++)
	{ 
		delta += 2*PI/100;
		v = xu*2*r*sin(delta) + yu*2*r*cos(delta);		
		v *= ratio;
		v = v;
		newv = Mi*v - Mi*Pnt3(0,0,0) + centerinObjectCrood;
		glVertex3f(newv.x,newv.y,newv.z);

	}
	glEnd();

	glEnable(GL_LIGHTING);

	glColor4fv(oldcolor);
	glLineWidth(oldlinewidth);
	glMatrixMode(GL_MODELVIEW);
	glPopMatrix();
	glMatrixMode(GL_PROJECTION);
	glPopMatrix();

}


转载于:https://my.oschina.net/syhgzz/blog/282704

要编写一个OpenGL程序,在窗口绘制余弦曲线,可以按照以下步骤进行: 1. 导入所需的头文件和库文件,包括OpenGL和GLUT库。 2. 定义窗口的宽度和高度。 3. 编写绘制曲线的函数,其包括绘制坐标轴和绘制余弦曲线的代码。例如,使用for循环计算曲线上的点的坐标,并使用glVertex2f函数将这些点绘制窗口上。 4. 在主函数,初始化OpenGL窗口,设置窗口大小和标题。 5. 注册回调函数,包括绘制函数和窗口大小改变时的回调函数。 6. 进入主循环,等待窗口事件的发生。 下面是一个示例代码,用于绘制余弦曲线的OpenGL程序: ```c #include <GL/glut.h> #include <math.h> // 定义窗口的宽度和高度 #define WIDTH 800 #define HEIGHT 600 // 绘制曲线的函数 void drawCurve() { glClear(GL_COLOR_BUFFER_BIT); // 设置坐标轴颜色 glColor3f(1.0, 1.0, 1.0); // 绘制 x 轴 glBegin(GL_LINES); glVertex2f(-1, 0); glVertex2f(1, 0); glEnd(); // 绘制 y 轴 glBegin(GL_LINES); glVertex2f(0, -1); glVertex2f(0, 1); glEnd(); // 设置曲线颜色 glColor3f(1.0, 0.0, 0.0); // 绘制余弦曲线 glBegin(GL_LINE_STRIP); for (float x = -1.0; x <= 1.0; x += 0.01) { float y = cos(x); glVertex2f(x, y); } glEnd(); glFlush(); } int main(int argc, char** argv) { // 初始化OpenGL窗口 glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(WIDTH, HEIGHT); glutCreateWindow("Cosine Curve"); // 注册回调函数 glutDisplayFunc(drawCurve); glutReshapeFunc(reshape); // 进入主循环 glutMainLoop(); return 0; } ``` 这段代码使用了OpenGL的基本绘图函数,并通过for循环计算余弦曲线上的点的坐标,并使用glVertex2f函数将这些点绘制窗口上。绘制过程坐标轴和曲线的颜色设置为白色和红色,可以根据需要进行调整。在主函数,注册了绘制函数和窗口大小改变时的回调函数,然后进入主循环,等待窗口事件的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值