interp.hpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #ifndef INTERP_HPP
  2. #define INTERP_HPP
  3. template<class real> inline void quadrati(real *vnodes,
  4. real& first, real& second)
  5. {
  6. first = 0.375*vnodes[0] + 0.75*vnodes[1] - 0.125*vnodes[2];
  7. second = -0.125*vnodes[0] + 0.75*vnodes[1] + 0.375*vnodes[2];
  8. }
  9. template<class real> inline void interp1(real *temp, real *image,int nx,
  10. int i,int j)
  11. {
  12. auto indix= [nx](int i, int j){return i*nx+j;};
  13. int I=i-2,J=j-2;
  14. //1) ligne horizontale en haut :
  15. temp[0]=image[indix(I-2,J-2)];
  16. temp[1]=image[indix(I-2,J)];
  17. temp[2]=image[indix(I-2,J+2)];
  18. quadrati(temp,image[indix(I-2,J-1)],image[indix(I-2,J+1)]);
  19. //2) colonne verticale gauche :
  20. temp[0]=image[indix(I-2,J-2)];
  21. temp[1]=image[indix(I,J-2)];
  22. temp[2]=image[indix(I+2,J-2)];
  23. quadrati(temp,image[indix(I-1,J-2)],image[indix(I+1,J-2)]);
  24. //3) colonne verticale centrale :
  25. temp[0]=image[indix(I-2,J)];
  26. temp[1]=image[indix(I,J)];
  27. temp[2]=image[indix(I+2,J)];
  28. quadrati(temp,image[indix(I-1,J)],image[indix(I+1,J)]);
  29. //4) colonne verticale à droite :
  30. temp[0]=image[indix(I-2,J+2)];
  31. temp[1]=image[indix(I,J+2)];
  32. temp[2]=image[indix(I+2,J+2)];
  33. quadrati(temp,image[indix(I-1,J+2)],image[indix(I+1,J+2)]);
  34. //5) première ligne:
  35. temp[0]=image[indix(I-2,J-2)];
  36. temp[1]=image[indix(I-2,J)];
  37. temp[2]=image[indix(I-2,J+2)]; //
  38. quadrati(temp,image[indix(I-2,J-1)],image[indix(I-2,J+1)]);
  39. //6) deuxième ligne:
  40. temp[0]=image[indix(I-1,J-2)];
  41. temp[1]=image[indix(I-1,J)];
  42. temp[2]=image[indix(I-1,J+2)]; //
  43. quadrati(temp,image[indix(I-1,J-1)],image[indix(I-1,J+1)]);
  44. //7) troisième ligne
  45. temp[0]=image[indix(I,J-2)];
  46. temp[1]=image[indix(I,J)];
  47. temp[2]=image[indix(I,J+2)]; //
  48. quadrati(temp,image[indix(I,J-1)],image[indix(I,J+1)]);
  49. //8) quatrième ligne:
  50. temp[0]=image[indix(I+1,J-2)];
  51. temp[1]=image[indix(I+1,J)];
  52. temp[2]=image[indix(I+1,J+2)];
  53. quadrati(temp,image[indix(I+1,J-1)],image[indix(I+1,J+1)]);
  54. }
  55. // Un point sur deux étant calculé dans image, interpoler qudratiquement
  56. // les autres points.
  57. // image : l'image
  58. // nx, ny: les dimensions de l'image
  59. template<class real> void interpquad(real* image,int nx,int ny)
  60. {
  61. // tester si nx et ny sont divisibles par 4
  62. // à faire!
  63. real temp[3];
  64. for(int i=4;i<nx;i+=4)
  65. for(int j=4;j<ny;j+=4)
  66. interp1(temp,image,nx,i,j);
  67. for(int j=4;j<ny;j+=4)
  68. interp1(temp,image,nx,nx-1,j);
  69. for(int i=4;i<nx;i+=4)
  70. interp1(temp,image,nx,i,ny-1);
  71. }
  72. #endif