2017-04-01 45 views
-2

試圖找出如何繪製白線,直到這些紅線:C,OPEN GL,繪製直到另一條線

enter image description here

我能畫,直到綠點高度的,但不是紅線。

+1

到目前爲止您嘗試了哪些代碼,以及發生了什麼意外的事情? –

+1

您如何期待我們在不提供單行代碼的情況下爲您提供幫助? – user7771338

+0

對不起,我創建了點和紅線。如果你可以等到我家到了。我可以複製我的代碼。 – aqeyndx

回答

0

下面是一個使用固定功能的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

我將離開你的鍛鍊,使其beautier(圓點,抗鋸齒,剪裁,平滑的渲染),並正確地重構代碼,以更快速地清理器&。希望能幫助到你。

編輯:

上面的代碼的簡要說明:

在開始的時候你就會有一些控制點(綠點)。通常您將這些點存儲爲浮點值數組,在上面的代碼中,它們只存儲在名爲points的全局變量中。爲了繪製這些點,您只需要循環訪問數組並使用opengl函數繪製點,它們就表示y座標x &。你也可以很容易地從[x,y]到[x,0]繪製白線。

現在,棘手的部分,我們如何繪製中間點?他們究竟是什麼?首先,您需要了解線性插值是什麼,請閱讀here,但基本上是一個像x*b+(1-x)*a這樣的公式,如果考慮x = 0,結果將是a,如果x = 1,結果將爲b,如果值在[0,1]之間,你會得到一個值在&之間b。因此,爲了計算中間點,您只需應用之前的&下一點之間的線性插值,您可以在行glVertex2f(x0 + j, lerp(k, y0, y1))中看到。

關於step_x & step_y參數,如果它更容易理解,用0代替它們並將它們除去,這樣您就可以輕鬆地理解代碼。

+0

感謝您的回答。試圖理解。它實際上看起來很複雜.https://pastebin.com/NYsNACqu。我編寫了這個代碼段來創建隨機化的綠點和紅線。併爲即將到來的遺憾感到遺憾。 – aqeyndx

+0

@BDL我編輯了我的答案,我已經考慮過這些代碼,因爲沒有解釋任何東西,所以這些代碼很簡單......但你可能就在這裏,我在這裏假設了一些基本的東西。在一天結束時只是一個真正未優化代碼的例子,您不應該使用定點流水線,也不要在顯示循環中計算點,所以... – BPL

+0

感謝您的解釋。這非常有幫助。我會盡量整合我的隨機點。 – aqeyndx