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

本文直接用(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();

}

这里写图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值