polaroid-pp

Schlieren and contour plot tool
git clone https://git.0xfab.ch/polaroid-pp.git
Log | Files | Refs | Submodules | README | LICENSE

SchlierenCartridge.cpp (2388B)


      1 // File       : SchlierenCartridge.cpp
      2 // Date       : Fri 29 Apr 2016 11:30:07 AM CEST
      3 // Author     : Fabian Wermelinger
      4 // Description: Schlieren shader implementation
      5 // Copyright 2016 ETH Zurich. All Rights Reserved.
      6 #include "SchlierenCartridge.h"
      7 
      8 void SchlierenCartridge::_compute(Slice& data)
      9 {
     10     m_gradX.resize(data.width(), data.height());
     11     m_gradY.resize(data.width(), data.height());
     12     _gradX(data);
     13     _gradY(data);
     14     for (int h=0; h < data.height(); ++h)
     15         for (int w=0; w < data.width(); ++w)
     16         {
     17             const Real IphiI2 = m_gradX(w,h)*m_gradX(w,h) + m_gradY(w,h)*m_gradY(w,h);
     18             data(w,h) = sqrt(IphiI2);
     19         }
     20 }
     21 
     22 // 4th-order Finite Differences
     23 void SchlierenCartridge::_gradX(const Slice& data)
     24 {
     25     // this assumes
     26     // 1.) uniform grid-spacing
     27     // 2.) maximum extend = 1
     28     const Real fac = data.get_max3Ddim()/12.0;
     29 
     30     // left
     31     for (int h=0; h < data.height(); ++h)
     32         for (int w=0; w < 2; ++w)
     33             m_gradX(w,h) = fac*(-25.0*data(w,h) + 48.0*data(w+1,h) - 36.0*data(w+2,h) + 16.0*data(w+3,h) - 3.0*data(w+4,h));
     34 
     35     // right
     36     for (int h=0; h < data.height(); ++h)
     37         for (int w=data.width()-2; w < data.width(); ++w)
     38             m_gradX(w,h) = -fac*(-25.0*data(w,h) + 48.0*data(w-1,h) - 36.0*data(w-2,h) + 16.0*data(w-3,h) - 3.0*data(w-4,h));
     39 
     40     // interior
     41     for (int h=0; h < data.height(); ++h)
     42         for (int w=2; w < data.width()-2; ++w)
     43             m_gradX(w,h) = fac*(-data(w+2,h) + 8.0*data(w+1,h) - 8.0*data(w-1,h) + data(w-2,h));
     44 }
     45 
     46 void SchlierenCartridge::_gradY(const Slice& data)
     47 {
     48     // this assumes
     49     // 1.) uniform grid-spacing
     50     // 2.) maximum extend = 1
     51     const Real fac = data.get_max3Ddim()/12.0;
     52 
     53     // left
     54     for (int h=0; h < 2; ++h)
     55         for (int w=0; w < data.width(); ++w)
     56             m_gradY(w,h) = fac*(-25.0*data(w,h) + 48.0*data(w,h+1) - 36.0*data(w,h+2) + 16.0*data(w,h+3) - 3.0*data(w,h+4));
     57 
     58     // right
     59     for (int h=data.height()-2; h < data.height(); ++h)
     60         for (int w=0; w < data.width(); ++w)
     61             m_gradY(w,h) = -fac*(-25.0*data(w,h) + 48.0*data(w,h-1) - 36.0*data(w,h-2) + 16.0*data(w,h-3) - 3.0*data(w,h-4));
     62 
     63     // interior
     64     for (int h=2; h < data.height()-2; ++h)
     65         for (int w=0; w < data.width(); ++w)
     66             m_gradY(w,h) = fac*(-data(w,h+2) + 8.0*data(w,h+1) - 8.0*data(w,h-1) + data(w,h-2));
     67 }