您的位置:首页 > 运维架构

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是很容易给出的。数学公式打不出来还是见草稿纸吧。



又到了开心的贴代码时间啦…

// 所给代码在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();

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opengl