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

FVR/TorstensFilters.cpp

Go to the documentation of this file.
00001 #include "TorstensFilters.h"
00002 
00003 namespace FVR_NS
00004 {
00005 
00006 TorstensFilters::TorstensFilters()
00007 {
00008 }
00009 
00010 TorstensFilters::TorstensFilters(TorstensFilters& l)
00011 {
00012 }
00013 
00014 TorstensFilters::TorstensFilters(int (*filter)(t_data a, t_data t, t_data *coeff), t_data 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)(t_data a, t_data t, t_data *coeff), t_data a)
00029 {
00030         t_data 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   t_data ti, tj, tk;
00047   t_data tstep;
00048   dword pos;
00049   
00050   m_Weights = new t_data[FILTER_TABLE_SIZE *
00051                        FILTER_TABLE_SIZE *
00052                        FILTER_TABLE_SIZE * m_FilterSize];
00053 
00054   m_grads = new vuVector[FILTER_TABLE_SIZE *
00055                        FILTER_TABLE_SIZE *
00056                        FILTER_TABLE_SIZE * m_FilterSize];
00057   
00058   tstep = 1.0f / (t_data)FILTER_TABLE_SIZE;
00059   
00060   pos = 0;
00061   tk = 0;
00062   for(dword k = 0; k < FILTER_TABLE_SIZE; ++k) {
00063     tj = 0;
00064     for(dword j = 0; j < FILTER_TABLE_SIZE; ++j) {
00065       ti = 0;
00066       for(dword i = 0;i < FILTER_TABLE_SIZE; ++i) {
00067         MakeWeightCube(&m_Weights[pos], &m_grads[pos], ti, tj, tk);
00068         
00069         pos += m_FilterSize;
00070         ti += tstep;
00071       }
00072       tj += tstep;
00073     }
00074     tk += tstep;
00075   }
00076 }
00077 
00078 void TorstensFilters::MakeWeightCube(t_data* w, vuVector* v, t_data ti, t_data tj, t_data tk)
00079 {
00080   //double the filter extent for the gradient of the filter reside in second half of wi,wj,wk
00081   t_data wi[MAX_TFILTER_EXTENT], wj[MAX_TFILTER_EXTENT], wk[MAX_TFILTER_EXTENT];
00082 
00083   m_Filter(m_a, ti, wi);
00084   m_Filter(m_a, tj, wj);
00085   m_Filter(m_a, tk, wk);
00086   
00087   dword pos = 0;
00088   for(dword k = 0; k < m_FilterWidth; ++k)
00089     for(dword j = 0; j < m_FilterWidth; ++j)
00090       for(dword i = 0; i < m_FilterWidth; ++i)
00091         {
00092           w[pos] = wi[i] * wj[j] * wk[k];
00093           //      v[pos++] = vuVector(wi[m_FilterWidth + i], wj[m_FilterWidth + j], wk[m_FilterWidth + k]);
00094           vuVector myv(0,0,0);
00095           myv[0] = wj[j] * wk[k] * wi[m_FilterWidth + i];
00096           myv[1] = wi[i] * wk[k] * wj[m_FilterWidth + j];
00097           myv[2] = wi[i] * wj[j] * wk[m_FilterWidth + k];
00098           v[pos++] = myv;//wk[m_FilterWidth + k]);
00099         }
00100 }
00101 
00102 } // NS_END

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