-2
A
回答
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;
}
這裏的結果:
我將離開你的鍛鍊,使其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代替它們並將它們除去,這樣您就可以輕鬆地理解代碼。
相關問題
- 1. 在Open GL ES 2.0中繪製一條線
- 2. 的Open GL繪製靜點
- 3. 繪製直線的線條
- 4. Open GL:繪製帶邊框的矩形?
- 5. IOS open GL ES繪製立方體
- 6. Android - open gl es 1.1 - 繪製效率
- 7. Open GL ES 2.0多重繪製元素和繪製順序
- 8. 繪製一條曲線連接,而不是一條直線
- 9. 繪製一條水平線直到第一個蠟燭杆
- 10. Open GL - ES 2.0:畫一條簡單的線
- 11. 在紋理中畫一條線Open GL ES 2.0 Android
- 12. Open GL
- 13. 將直方圖繪製爲線條
- 14. 如何在Open Inventor 3D圖形API中繪製一條線?
- 15. 在c#圖上繪製一條線
- 16. 從一個畫布繪製線條到另一個畫布
- 17. 核心圖形和Open GL繪圖
- 18. 在Open GL中靜態繪圖
- 19. 如何在Highcharts中繪製從一開始直到結束的一條直線?
- 20. 在iPhone的UITextView上繪製直線條
- 21. Vue-chartjs繪製多條直線圖
- 22. 用Java swing繪製一條線繪製多條線
- 23. 用導航條繪製一條小垂直線
- 24. 繪製一條平均曲線的直線
- 25. 將矢量繪製到一條線上
- 26. 如何在同一圖表的兩個Y軸上繪製一條直線和一條直線,用R-ggplot?
- 27. 從一個座標和一個角度繪製一條直線
- 28. OPEN GL(glOrtho functiion)
- 29. Open GL轉換
- 30. Open GL Alternative?
到目前爲止您嘗試了哪些代碼,以及發生了什麼意外的事情? –
您如何期待我們在不提供單行代碼的情況下爲您提供幫助? – user7771338
對不起,我創建了點和紅線。如果你可以等到我家到了。我可以複製我的代碼。 – aqeyndx