OpenGL 利用中点算法画y=kx+b直线

本文直接用(0< k<1)来说明中点算法画直线。其他的斜率可直接按照此方法进行类推。

OpenGL 利用中点算法画y=kx+b直线_第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是很容易给出的。数学公式打不出来还是见草稿纸吧。
OpenGL 利用中点算法画y=kx+b直线_第2张图片


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


// 所给代码在VS2013版本下运行成功
// 支持给出直线的两个坐标,画出该直线

#include  //在win32控制台下运行所加的头文件,貌似在VC下运行不需要加此头文件
#include 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
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 利用中点算法画y=kx+b直线_第3张图片

你可能感兴趣的:(*Others)