台形則による数値積分とOpenGLとアフィン変換
ところでOpenGLの視点設定が覚えられない。難しすぎる。いつも視点移動させずに、座標を移動させたり縮小させたりしてデフォルトの範囲内におさまるようにしている。
#include<stdio.h> #include<GL/glut.h> // 自前のアフィン変換に使う double m[3][3] = {{0.7, 0, -.5}, {0, 0.7, -.5}, {0,0,1}}; double v[3] = {0, 0, 1}; double MulMatVec() { int i, j, k; for(i=0; i<3; i++){ double x=0; for(j=0; j<3; j++){ x += m[i][j] * v[j]; } v[i] = x; } } double vertex(double x, double y) { v[0] = x; v[1] = y; // アフィン変換 MulMatVec(); glVertex2d(v[0], v[1]); } double f(double x) { return x*x*x - 3./2*x*x +1; } double integration(double a, double b) { // 下限a,上限bの積分 // assert a < b int i; int d=4; // 分割数 double h = (b-a)/d; glColor3f(1,0,0); glBegin(GL_LINES); for(i=0; i<d; i++){ double an = a+ h*i; vertex(an, 0); vertex(an, f(an)); vertex(an, f(an)); vertex(an+h, f(an+h)); } vertex(b, 0); vertex(b, f(b)); glEnd(); } void display() { double x; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1,1,1); glBegin(GL_LINES); // 軸の描画 vertex(-1000, 0); vertex(1000, 0); vertex(0, -1000); vertex(0, 1000); glEnd(); // グラフの描画 glBegin(GL_POINTS); for(x=-10; x<10; x+=1e-3) vertex(x, f(x)); glEnd(); integration(0, 1.5); } int main(int argc, char **argv) { glutInit(&argc, argv); glutCreateWindow("Integration"); glutDisplayFunc(display); glutMainLoop(); return 0; }
OpenGL(R) Programming Guide: The Official Guide to Learning OpenGL(R), Version 2 (5th Edition)
- 作者: OpenGL Architecture Review Board,Dave Shreiner,Mason Woo,Jackie Neider,Tom Davis
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2005/08/11
- メディア: ペーパーバック
- この商品を含むブログ (4件) を見る