Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

SpecFVR/TorstensFilters.cpp

Go to the documentation of this file.
00001 #include "TorstensFilters.h"
00002 
00003 namespace SpecFVRNS 
00004 {
00005     
00006 TorstensFilters::TorstensFilters()
00007 {
00008 }
00009 
00010 TorstensFilters::TorstensFilters(TorstensFilters& l)
00011 {
00012 }
00013 
00014 TorstensFilters::TorstensFilters(int (*filter)(float a, float t, float *coeff), float a)
00015 {
00016         SetFilter(filter, a);
00017 }
00018 
00019 TorstensFilters::~TorstensFilters()
00020 {
00021 }
00022 
00023 TorstensFilters& TorstensFilters::operator=(TorstensFilters& rhs)
00024 {
00025         return *this;
00026 }
00027 
00028 void TorstensFilters::SetFilter(int (*filter)(float a, float t, float *coeff), float a)
00029 {
00030         float Coeff[MAX_TFILTER_EXTENT];
00031         m_Filter = filter;
00032         m_FilterWidth = (dword) m_Filter(a, 0, Coeff);
00033         m_FilterSize = m_FilterWidth * m_FilterWidth * m_FilterWidth;
00034         m_a = a;
00035 
00036         MakeWeights();
00037 }
00038 
00039 dword TorstensFilters::getWidth(void)
00040 {
00041         return m_FilterWidth;
00042 }
00043 
00044 void TorstensFilters::MakeWeights(void)
00045 {
00046         float ti, tj, tk;
00047         float tstep;
00048         dword pos;
00049 
00050         m_Weights = new float[FILTER_TABLE_SIZE *
00051                                                 FILTER_TABLE_SIZE *
00052                                                 FILTER_TABLE_SIZE * m_FilterSize];
00053 
00054         tstep = 1.0f / (float)FILTER_TABLE_SIZE;
00055 
00056         pos = 0;
00057         tk = 0;
00058         for(dword k = 0; k < FILTER_TABLE_SIZE; ++k) {
00059                 tj = 0;
00060                 for(dword j = 0; j < FILTER_TABLE_SIZE; ++j) {
00061                         ti = 0;
00062                         for(dword i = 0;i < FILTER_TABLE_SIZE; ++i) {
00063                                 MakeWeightCube(&m_Weights[pos], ti, tj, tk);
00064 
00065                                 pos += m_FilterSize;
00066                                 ti += tstep;
00067                         }
00068                         tj += tstep;
00069                 }
00070                 tk += tstep;
00071         }
00072 }
00073 
00074 void TorstensFilters::MakeWeightCube(float* w, float ti, float tj, float tk)
00075 {
00076         float wi[MAX_TFILTER_EXTENT], wj[MAX_TFILTER_EXTENT], wk[MAX_TFILTER_EXTENT];
00077 
00078         m_Filter(m_a, ti, wi);
00079         m_Filter(m_a, tj, wj);
00080         m_Filter(m_a, tk, wk);
00081 
00082         dword pos = 0;
00083         for(dword k = 0; k < m_FilterWidth; ++k)
00084                 for(dword j = 0; j < m_FilterWidth; ++j)
00085                     for(dword i = 0; i < m_FilterWidth; ++i)
00086                         w[pos++] = wi[i] * wj[j] * wk[k];
00087 }
00088  
00089 } // end of namespace

Generated on Wed Dec 15 21:20:32 2004 for vuVolume by  doxygen 1.3.9.1