view.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "view.hpp"
  2. void
  3. QtView::initializeGL(){
  4. glClearColor(1,1,1,1);
  5. glEnable(GL_DEPTH_TEST);
  6. glEnable(GL_LIGHT0);
  7. glEnable(GL_LIGHTING);
  8. glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
  9. glEnable(GL_COLOR_MATERIAL);
  10. }
  11. void
  12. QtView::resizeGL(int w,int h){
  13. glViewport(0,0,w,h);
  14. glMatrixMode(GL_PROJECTION);
  15. glLoadIdentity();
  16. gluOrtho2D(0,1,0,1);
  17. glMatrixMode(GL_MODELVIEW);
  18. glLoadIdentity();
  19. }
  20. void
  21. QtView::paintGL(){
  22. Geometry& G=data->geometry;
  23. glBegin(GL_TRIANGLES);
  24. for(size_t i=0;i<G.nX-1;++i){
  25. size_t max_left=G.nZ[i];
  26. size_t max_right=G.nZ[i+1];
  27. size_t left=0;
  28. size_t right=0;
  29. while(left<max_left-1 and right<max_right-1){
  30. if(G.Z[i][left+1]<G.Z[i+1][right+1]){
  31. drawTriangle(i,left,i+1,right,i,left+1);
  32. ++left;
  33. }
  34. else{
  35. drawTriangle(i,left,i+1,right,i+1,right+1);
  36. ++right;
  37. }
  38. }
  39. if(left==max_left-1){
  40. while(right<max_right-1){
  41. drawTriangle(i,left,i+1,right,i+1,right+1);
  42. ++right;
  43. }
  44. }
  45. if(right==max_right-1){
  46. while(left<max_left-1){
  47. drawTriangle(i,left,i+1,right,i,left+1);
  48. ++left;
  49. }
  50. }
  51. }
  52. glEnd();
  53. drawOverland();
  54. }
  55. void
  56. QtView::setColor(size_t ix,size_t iz){
  57. double p=getP(ix,iz);
  58. double s=Physics::s(p);
  59. double r=(1-s);
  60. double g=0.7*(1-s);
  61. double b=0.8*s+0.4*(1-s);
  62. glColor3f(r,g,b);
  63. }
  64. void
  65. QtView::drawTriangle(size_t ix1,size_t iz1,size_t ix2,size_t iz2,size_t ix3,size_t iz3){
  66. Geometry& G=data->geometry;
  67. double factor_inv=1/data->factor;
  68. double dX=1/double(G.nX-1);
  69. double x1=ix1*dX;
  70. double x2=ix2*dX;
  71. double x3=ix3*dX;
  72. double y1=G.Z[ix1][iz1]*factor_inv;
  73. double y2=G.Z[ix2][iz2]*factor_inv;
  74. double y3=G.Z[ix3][iz3]*factor_inv;
  75. setColor(ix1,iz1);
  76. glVertex3f(x1,y1,0);
  77. setColor(ix2,iz2);
  78. glVertex3f(x2,y2,0);
  79. setColor(ix3,iz3);
  80. glVertex3f(x3,y3,0);
  81. }
  82. void
  83. QtView::drawOverland(){
  84. Geometry& G=data->geometry;
  85. double dX=1/double(G.nX-1);
  86. double factor_inv=1/data->factor;
  87. glColor3f(0.5,0.5,1);
  88. glBegin(GL_QUADS);
  89. for(size_t i=0;i<G.nX-1;++i){
  90. glVertex3f(i*dX,G.hsoil[i]*factor_inv,0);
  91. glVertex3f(i*dX,data->initial_state->hov[i]*factor_inv,0);
  92. glVertex3f(i*dX+dX,data->initial_state->hov[i+1]*factor_inv,0);
  93. glVertex3f(i*dX+dX,G.hsoil[i+1]*factor_inv,0);
  94. }
  95. glEnd();
  96. /* glColor3f(0.2,0.2,1);
  97. glLineWidth(2);
  98. glBegin(GL_LINE_STRIP);
  99. for(size_t i=0;i<G.nX;++i){
  100. glVertex2f(i*dX,data->initial_state.hov[i]*factor_inv);
  101. }
  102. glEnd();*/
  103. }