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
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
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;
00099 }
00100 }
00101
00102 }