gpt4 book ai didi

C、打开gl,绘制直到另一行

转载 作者:行者123 更新时间:2023-11-30 20:34:10 25 4
gpt4 key购买 nike

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

enter image description here

我可以绘制到绿点高度,但不能绘制红线。

最佳答案

这是一个使用固定功能 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;
}

结果如下:

enter image description here

我将留给您练习使其更美观(圆点、抗锯齿、裁剪、平滑渲染)并正确重构代码以使其更快更干净。希望对您有所帮助。

编辑:

上述代码简单解释:

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

现在,棘手的部分是,我们如何绘制中间点?它们究竟是什么?首先,你需要了解什么是线性插值,请阅读here ,但基本上是一个像x*b+(1-x)*a这样的公式,如果你考虑x=0,结果将是a,如果x=1,结果将是b,如果值在 [0,1] 之间,您将得到 a&b 之间的值。因此,为了计算中间点,您只需在上一个点和下一个点之间应用线性插值,您可以在 glVertex2f(x0 + j, lerp(k, y0, y1)) 行中看到这一点。

关于step_x和step_y参数,如果您更容易理解,请将它们替换为0并去掉它们,这样您就可以轻松理解代码。

关于C、打开gl,绘制直到另一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43158801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com