C、 打开总帐,绘制到另一行

C、 打开总帐,绘制到另一行,c,opengl,C,Opengl,试图找出如何绘制白线直到这些红线: 我可以一直画到绿点高度,但不能画红线。下面是一个使用固定函数opengl管道的未优化示例: #define FREEGLUT_LIB_PRAGMAS 1 #define NDEBUG 1 #include <GL/glut.h> #include <cmath> using namespace std; #define MAX_POINTS 8 #define PROJ_VALUE 40 float points[MAX_P

试图找出如何绘制白线直到这些红线:



我可以一直画到绿点高度,但不能画红线。

下面是一个使用固定函数opengl管道的未优化示例:

#define FREEGLUT_LIB_PRAGMAS 1
#define NDEBUG 1

#include <GL/glut.h>
#include <cmath>

using namespace std;

#define MAX_POINTS 8
#define PROJ_VALUE 40

float points[MAX_POINTS][2];

void init() {
    points[0][0] = 0;
    points[0][1] = 10;
    points[1][0] = 1;
    points[1][1] = 8;
    points[2][0] = 2;
    points[2][1] = 4;
    points[3][0] = 3;
    points[3][1] = 7;
    points[4][0] = 4;
    points[4][1] = 3;
    points[5][0] = 5;
    points[5][1] = 4;
    points[6][0] = 6;
    points[6][1] = 5;
    points[7][0] = 7;
    points[7][1] = 0;
}

float lerp(float x, float a, float b) {
    return x * b + (1 - x) * a;
}

void plot_function(int step_x, int step_y) {
    for (int i = 0; i < MAX_POINTS; i++) {
        float x0 = (float)points[i][0] * step_x + step_x;
        float y0 = (float)points[i][1] * step_y;
        float x1 = (float)points[i + 1][0] * step_x + step_x;
        float y1 = (float)points[i + 1][1] * step_y;

        for (int j = 0; j < step_x; j++) {
            float k = (float)j / step_x;

            glColor3f(1.0, 1.0, 1.0);
            glBegin(GL_LINES);
            glVertex2f(x0 + j, 0);
            glVertex2f(x0 + j, lerp(k, y0, y1));
            glEnd();
        }

        glColor3f(0.0, 1.0, 0.0);
        glPointSize(8);
        glBegin(GL_POINTS);
        glVertex2f(x0, y0);
        glEnd();

        glColor3f(1.0, 0.0, 0.0);
        glBegin(GL_LINES);
        glVertex2f(x0, y0);
        glVertex2f(x1, y1);
        glEnd();
    }
}

void display() {
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, PROJ_VALUE, 0, PROJ_VALUE, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    plot_function(5, 2);
    glutSwapBuffers();
}

int main(int argc, char **argv) {
    init();

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(640, 480);
    glutCreateWindow("StackOverflow gl plotting");
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}
#定义FREEGLUT_LIB_PRAGMAS 1
#定义缺陷1
#包括
#包括
使用名称空间std;
#定义最大点8
#定义项目值40
浮点数[最大点数][2];
void init(){
[0][0]=0分;
[0][1]=10分;
[1][0]=1分;
[1][1]=8分;
[2][0]=2分;
[2][1]=4分;
[3][0]=3分;
[3][1]=7分;
[4][0]=4分;
[4][1]=3分;
[5][0]=5分;
[5][1]=4分;
[6][0]=6分;
[6][1]=5分;
[7][0]=7分;
[7][1]=0分;
}
浮子lerp(浮子x、浮子a、浮子b){
返回x*b+(1-x)*a;
}
void plot_函数(int step_x,int step_y){
对于(int i=0;i
结果如下:

我将把这个练习留给您,让它更漂亮(圆点、抗锯齿、剪裁、平滑渲染),并正确地重构代码,使其更快更干净。希望能有帮助

编辑:

上述代码的简要说明:

一开始你会有一些控制点(绿点)。通常将这些点存储到浮点值数组中,在上面的代码中,它们只存储在一个名为
points
的全局变量中。要绘制这些点,只需在数组中循环并使用opengl函数绘制点,它们表示x&y坐标。您还可以轻松地从[x,y]到[x,0]绘制白线

现在,棘手的部分,我们如何画中间点?它们实际上是什么?首先,你需要了解线性插值是什么,读,但基本上是一个公式,如代码> x*b+(1-x)*< /> >,如果你考虑x=0,结果将是A,如果x=1,结果将是B,如果该值在[0,1]之间,你将得到a和b之间的值。因此,为了计算中间点,您只需在上一个点和下一个点之间应用线性插值,您可以在直线中看到
glVertex2f(x0+j,lerp(k,y0,y1))


关于step_x&step_y参数,如果您更容易理解,请将其替换为0并删除,这样您就可以轻松理解代码。

到目前为止您尝试了哪些代码,发生了什么意外情况?您希望我们如何在不提供一行代码的情况下帮助您?啊,对不起,我创建了点和红线。如果你能等到我到家。我可以复制我的代码。出于好奇,你们是不是厌倦了用典型的句子“到目前为止你们都做了些什么”,“我们不是来为你们编码的”等等来抱怨。要么你帮忙,要么你编码,要么你不。。。我敢肯定op从Heath那里知道他对这个课题的研究不够,而且他有点懒。。。那又怎样?谢谢你的回答。试着去理解。实际上看起来很复杂。。我编写这个代码段是为了随机创建绿点和红线。很抱歉来得太晚。@BDL我已经编辑了我的答案,我认为代码太琐碎了,不能解释任何东西。。。但你可能就在这里,我在这里假设了一些基本情况。最后,这只是一个真正未优化代码的示例,您既不应该使用定点管道,也不应该计算显示循环上的点,因此…感谢您的解释。这很有帮助。我将尝试整合我的随机点。@aqeyndx不客气,我看你是第一次这么做。如果您认为答案解决了问题,请单击绿色复选标记将其标记为“已接受”。这有助于将注意力集中在仍然没有答案的老年人身上。