用OpenGL画一条任意线(即轴范围没有限制)

Posted

技术标签:

【中文标题】用OpenGL画一条任意线(即轴范围没有限制)【英文标题】:draw an arbitrary line with OpenGL(i.e. no limit on axis range) 【发布时间】:2019-03-11 02:18:57 【问题描述】:

我想用用户定义的参数绘制一条二维线。但是x和y轴的范围是[-1,1]。

如何绘制可以在窗口中完整显示的线条?我使用了gluOrtho2D(-10.0, 10.0, -10.0, 10.0),但这似乎不是一个好的选择,因为范围根据参数是动态的。

例如,该行是y=ax^3+bx^2+cx+d。 x 的范围是 [1, 100]。

我的代码是:

#include "pch.h"
#include<windows.h>

#include <gl/glut.h>

#include <iostream>
using namespace std;

double a, b, c, d;
void init(void)

    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(-10.0, 10.0, -10.0, 10.0);


double power(double x, int p) 
    double y = 1.0;
    for (int i = 0; i < p; ++i) 
        y *= x;
    
    return y;


void linesegment(void)

    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1, 0, 0);
    glPointSize(1);

    glBegin(GL_POINTS);
    for (int i = 1; i <= 10; ++i) 
        double y = a * power(i, 3) + b * power(i, 2) + c * i + d;
        glVertex2f(i, y);
    
    glEnd();

    glFlush();


int main(int argc, char**argv)


    if (argc < 4) 
        cout << "should input 4 numbers" << endl;
        return 0;
    

    a = atof(argv[1]);
    b = atof(argv[2]);
    c = atof(argv[3]);
    d = atof(argv[4]);

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(50, 100);
    glutInitWindowSize(400, 300);
    glutCreateWindow("AnExample");

    init();

    glutDisplayFunc(linesegment);
    glutMainLoop();

    return 0;

【问题讨论】:

只是一个建议。您可能要考虑学习 modern opengl 而不是 10 年以上弃用的 opengl "范围根据参数是动态的。" - 什么? 如果你想画一条线然后使用GL_LINES, GL_LINE_STRIP ...。如果要绘制窗口(像素)坐标,左上角为 (0, 0),则正交投影必须为 gluOrtho2D(0.0, 400.0, 300.0, 0.0); @Rabbid76 嗨,我的意思是当 a,b,c,d 变化时,y 的最大值会变化。所以gluOrtho2D的参数不能是静态的。 @IHaveAProblem 然后你要设置一个新的正交投影glLoadIdentity();gluOrtho2D(...); 【参考方案1】:

设置投影矩阵不是一次性操作。您可以随时更改它。事实上,强烈建议不要使用 init 的方式。只需在绘图功能中设置投影参数即可。还要使用标准库函数,不要自己动手。无需自己实现power。只需使用pow 标准库函数。最后但同样重要的是,使用双缓冲;因为它提供了更好的性能,并且具有更好的兼容性。

#include "pch.h"
#include <windows.h>

#include <gl/glut.h>

#include <iostream>
#include <cmath>
using namespace std;

double a, b, c, d;
double x_min, x_max, y_min, y_max; // <<<<---- fill these per your needs

void linesegment(void)

    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(x_min, x_max, y_min, y_max, -1, 1);

    glColor3f(1, 0, 0);
    glPointSize(1);

    glBegin(GL_POINTS);
    for (int i = 1; i <= 10; ++i) 
        double y = a * pow(i, 3) + b * pow(i, 2) + c * i + d;
        glVertex2f(i, y);
    
    glEnd();

    glFlush();

【讨论】:

以上是关于用OpenGL画一条任意线(即轴范围没有限制)的主要内容,如果未能解决你的问题,请参考以下文章

Unity实现任意两点之间画一条直线——bresenham算法(直线的处理)

在 UIViewController 上画一条线

在现代 OpenGL 中画一条线

twoway怎么画一条线

用html代码怎样画一条竖直线。1像素,纯黑色的,长500px.

在MATLAB中,画一条曲线,用啥命令?