OpenGL 利用中点算法画y=kx+b直线
2016-03-27 13:32
363 查看
本文直接用(0< k<1)来说明中点算法画直线。其他的斜率可直接按照此方法进行类推。
1。设一个函数为F(x,y) = y - kx - b;
若F(x,y) > 0, 那么该点在这条直线的上方
若F(x,y) = 0, 那么该点在这条直线上
若F(x,y) <0, 那么该点在这条直线下方
2。 因为k的范围是 0 < k<1,那么x平均每单位的增量是大于y的,所以以x为自增量来确定y的坐标。意思是当前所选的像素点为(Xp,Yp),那么下个像素点的可选择范围是(Xp+1,Yp)或者(Xp+1,Yp+1)。每个像素点都比当前像素点的x坐标加一,y坐标要么保持不变,要么加一。
3。设d = F(Xp+1,Yp+1/2),即以d的值来确定下个像素点的y值。如上图的Midpoint,该点的横坐标是Xp+1,纵坐标是Yp+1/2。将这个坐标带入F(x,y)函数中,若d>0,则说明该Midpoint在这条直线的上方。那么可以清晰的看到图中,Yp到理想值的距离是明显小于Yp+1到理想值的距离的。(理想值是当横坐标为Xp+1,纵坐标在直线上的那点),所以下一点的纵坐标定为Yp。同理可得,当d<0时,下一点的纵坐标为Yp+1;
4。计算d值。首先d0是很容易给出的。数学公式打不出来还是见草稿纸吧。
又到了开心的贴代码时间啦…
1。设一个函数为F(x,y) = y - kx - b;
若F(x,y) > 0, 那么该点在这条直线的上方
若F(x,y) = 0, 那么该点在这条直线上
若F(x,y) <0, 那么该点在这条直线下方
2。 因为k的范围是 0 < k<1,那么x平均每单位的增量是大于y的,所以以x为自增量来确定y的坐标。意思是当前所选的像素点为(Xp,Yp),那么下个像素点的可选择范围是(Xp+1,Yp)或者(Xp+1,Yp+1)。每个像素点都比当前像素点的x坐标加一,y坐标要么保持不变,要么加一。
3。设d = F(Xp+1,Yp+1/2),即以d的值来确定下个像素点的y值。如上图的Midpoint,该点的横坐标是Xp+1,纵坐标是Yp+1/2。将这个坐标带入F(x,y)函数中,若d>0,则说明该Midpoint在这条直线的上方。那么可以清晰的看到图中,Yp到理想值的距离是明显小于Yp+1到理想值的距离的。(理想值是当横坐标为Xp+1,纵坐标在直线上的那点),所以下一点的纵坐标定为Yp。同理可得,当d<0时,下一点的纵坐标为Yp+1;
4。计算d值。首先d0是很容易给出的。数学公式打不出来还是见草稿纸吧。
又到了开心的贴代码时间啦…
// 所给代码在VS2013版本下运行成功 // 支持给出直线的两个坐标,画出该直线 #include <stdafx.h> //在win32控制台下运行所加的头文件,貌似在VC下运行不需要加此头文件 #include <GL/glut.h> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <algorithm> using namespace std; void init(){ glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 200.0, 0.0, 150.0);//四个坐标分别是左下角x坐标,右上角x坐标,左下角y坐标,右上角y坐标 } void setPixel(GLint x, GLint y) { glBegin(GL_POINTS); glVertex2i(x, y); glEnd(); } void line() { double x0, y0, xn, yn; cout << "Please enter the first point:"; cin >> x0 >> y0; cout << "Please enter the second point:"; cin >> xn >> yn; if (x0 > xn) swap(x0, xn), swap(y0, yn); double k = (yn - y0) / (xn - x0); double b = y0 - k*x0; double d = 1. / 2 - k; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); while (x0 <= xn) { x0++; if (d<0){ y0++; d += 1. - k; } else d -= k; setPixel(x0, y0); } glFlush(); } void main(int argc, char ** argv)//main函数的基本程序 貌似是必须要写的 { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(50, 100); glutInitWindowSize(400, 300); glutCreateWindow("wsm: y = kx + b "); init(); glutDisplayFunc(line); glutMainLoop(); }
相关文章推荐
- 解决Vista系统OpenGL驱动问题的方法整理
- Delphi下OpenGL2d绘图之画四边形的方法
- Delphi下OpenGL2d绘图之画点的方法
- Delphi下OpenGL2d绘图之初始化流程详解
- Delphi使用OpenGL2d绘图之画图片Bmp的方法
- 通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸
- VC运用OPENGL加载BMP纹理图的实现方法汇总
- java实现OpenGL ES纹理映射的方法
- java基于OpenGL ES实现渲染实例
- OpenGL坐标系介绍
- 【翻译】安卓opengl ES教程之四——添加颜色
- linux下opengl的安装(with qt)
- OpenGL超级宝典笔记——显示列表
- OpenGL超级宝典笔记——顶点数组
- OpenGL生成轮廓
- OpenGL超级宝典笔记——性能比较
- OpenGL超级宝典笔记——顶点缓冲区对象
- OpenGL超级宝典笔记——选择
- OpenGL超级宝典笔记——反馈
- OpenGL超级宝典笔记——遮挡查询