view_solution_geometry.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "qt/view_solution_geometry.hpp"
  2. QtViewSolutionGeometry::QtViewSolutionGeometry(Kernel* _kernel){
  3. kernel=_kernel;
  4. };
  5. void
  6. QtViewSolutionGeometry::initializeGL(){
  7. glClearColor(1,1,1,1);
  8. glEnable(GL_DEPTH_TEST);
  9. glEnable(GL_LIGHT0);
  10. glEnable(GL_LIGHTING);
  11. glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
  12. glEnable(GL_COLOR_MATERIAL);
  13. }
  14. void
  15. QtViewSolutionGeometry::paintGL(){
  16. cout<<"PaintGL"<<endl;
  17. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  18. if(step>kernel->step){
  19. cout<<"Pas encore calculé"<<endl;
  20. }
  21. else{
  22. double dX=kernel->geometry.dX;
  23. double lX=kernel->geometry.lX;
  24. double h=height();
  25. double w=width();
  26. glBegin(GL_TRIANGLES);
  27. for(size_t i=0;i<kernel->geometry.nX-1;++i){
  28. size_t max_left=kernel->nZ(i);
  29. size_t max_right=kernel->nZ(i+1);
  30. size_t left=0;
  31. size_t right=0;
  32. while(left<max_left-1 and right<max_right-1){
  33. if(kernel->Z(i,left+1)<=kernel->Z(i+1,right+1)){
  34. drawTriangle(i,left,i+1,right,i,left+1);
  35. ++left;
  36. }
  37. else{
  38. drawTriangle(i,left,i+1,right,i+1,right+1);
  39. ++right;
  40. }
  41. }
  42. if(left==max_left-1){
  43. while(right<max_right-1){
  44. drawTriangle(i,left,i+1,right,i+1,right+1);
  45. ++right;
  46. }
  47. }
  48. if(right==max_right-1){
  49. while(left<max_left-1){
  50. drawTriangle(i,left,i+1,right,i,left+1);
  51. ++left;
  52. }
  53. }
  54. }
  55. glEnd();
  56. }
  57. }
  58. void
  59. QtViewSolutionGeometry::resizeGL(int w,int h){
  60. glViewport(0,0,w,h);
  61. glMatrixMode(GL_PROJECTION);
  62. glLoadIdentity();
  63. gluOrtho2D(0,kernel->geometry.lX,0,1);
  64. //gluPerspective(45, (float)w/h, 0.01, 100.0);
  65. glMatrixMode(GL_MODELVIEW);
  66. glLoadIdentity();
  67. //gluLookAt(0,0,5,0,0,0,0,1,0);
  68. }
  69. /*void
  70. QtViewSolutionGeometry::paintEvent(QPaintEvent* event){
  71. QPainter painter(this);
  72. painter.beginNativePainting();
  73. glClearColor(0, 0, 0, 1);
  74. glEnable(GL_DEPTH_TEST);
  75. glEnable(GL_LIGHT0);
  76. glEnable(GL_LIGHTING);
  77. glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
  78. glEnable(GL_COLOR_MATERIAL);
  79. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  80. glBegin(GL_TRIANGLES);
  81. glColor3f(1.0, 0.0, 0.0);
  82. glVertex3f(0, 10, 0);
  83. glColor3f(0.0, 1.0, 0.0);
  84. glVertex3f(20, -20, 0);
  85. glColor3f(0.0, 0.0, 1.0);
  86. glVertex3f(0.0, 50, 0);
  87. glEnd();
  88. /*if(step>kernel->step){
  89. cout<<"Pas encore calculé"<<endl;
  90. }
  91. else{
  92. double dX=kernel->geometry.dX;
  93. double lX=kernel->geometry.lX;
  94. double h=height();
  95. double w=width();
  96. for(size_t i=0;i<kernel->geometry.nX-1;++i){
  97. size_t max_left=kernel->nZ(i);
  98. size_t max_right=kernel->nZ(i+1);
  99. size_t left=0;
  100. size_t right=0;
  101. while(left<max_left-1 and right<max_right-1){
  102. if(kernel->Z(i,left+1)<=kernel->Z(i+1,right+1)){
  103. drawTriangle(painter,i,left,i+1,right,i,left+1);
  104. ++left;
  105. }
  106. else{
  107. drawTriangle(painter,i,left,i+1,right,i+1,right+1);
  108. ++right;
  109. }
  110. }
  111. if(left==max_left-1){
  112. while(right<max_right-1){
  113. drawTriangle(painter,i,left,i+1,right,i+1,right+1);
  114. ++right;
  115. }
  116. }
  117. if(right==max_right-1){
  118. while(left<max_left-1){
  119. drawTriangle(painter,i,left,i+1,right,i,left+1);
  120. ++left;
  121. }
  122. }
  123. }
  124. }
  125. painter.endNativePainting();
  126. painter.end();
  127. }
  128. */
  129. void
  130. QtViewSolutionGeometry::drawTriangle(size_t ix1,size_t iz1,size_t ix2,size_t iz2,size_t ix3,size_t iz3){
  131. double dX=kernel->geometry.dX;
  132. double lX=kernel->geometry.lX;
  133. double h=height();
  134. double w=width();
  135. double x1=ix1*dX;
  136. double x2=ix2*dX;
  137. double x3=ix3*dX;
  138. double y1=kernel->Z(ix1,iz1);
  139. double y2=kernel->Z(ix2,iz2);
  140. double y3=kernel->Z(ix3,iz3);
  141. glColor3f(1,0,0);
  142. glVertex2f(x1,y1);
  143. glVertex2f(x2,y2);
  144. glVertex2f(x3,y3);
  145. }
  146. void
  147. QtViewSolutionGeometry::draw(size_t _step){
  148. step=_step;
  149. update();
  150. }
  151. void
  152. QtViewSolutionGeometry::mousePressEvent(QMouseEvent* event){
  153. double x=double(event->x())/width()*kernel->geometry.lX;
  154. double y=1-(double(event->y())/height());
  155. displayInfos(x,y);
  156. }
  157. void
  158. QtViewSolutionGeometry::displayInfos(double x,double z){
  159. cout<<"---------------------------------"<<endl;
  160. cout<<"x = "<<x<<endl;
  161. cout<<"z = "<<z<<endl;
  162. size_t ix=floor(x/kernel->geometry.dX+0.5);
  163. if(ix==kernel->geometry.nX) --ix;
  164. cout<<"ix = "<<ix<<endl;
  165. double hbot=kernel->geometry.hbot[ix];
  166. cout<<"hbot = "<<hbot<<endl;
  167. double hsoil=kernel->geometry.hsoil[ix];
  168. cout<<"hsoil = "<<hsoil<<endl;
  169. if(z>hbot and z<hsoil){
  170. double dZ=kernel->geometry.dZ[ix];
  171. cout<<"dZ = "<<dZ<<endl;
  172. size_t nz=kernel->geometry.nZ[ix];
  173. cout<<"nZ = "<<nz<<endl;
  174. size_t iz=floor((z-hbot)/dZ+0.5);
  175. if(iz==nz) --iz;
  176. cout<<"iz = "<<iz<<endl;
  177. }
  178. }