00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "sampling.h"
00026 #include "paramset.h"
00027
00028 class GaussianFilter : public Filter {
00029 public:
00030
00031 GaussianFilter(float xw, float yw, float a)
00032 : Filter(xw, yw) {
00033 alpha = a;
00034 expX = expf(-alpha * xWidth * xWidth);
00035 expY = expf(-alpha * yWidth * yWidth);
00036 }
00037 float Evaluate(float x, float y) const;
00038 private:
00039
00040 float alpha;
00041 float expX, expY;
00042
00043 float Gaussian(float d, float expv) const {
00044 return max(0.f, float(expf(-alpha * d * d) - expv));
00045 }
00046 };
00047
00048 float GaussianFilter::Evaluate(float x, float y) const {
00049 return Gaussian(x, expX) * Gaussian(y, expY);
00050 }
00051 extern "C" DLLEXPORT Filter *CreateFilter(const ParamSet &ps) {
00052
00053 float xw = ps.FindOneFloat("xwidth", 2.);
00054 float yw = ps.FindOneFloat("ywidth", 2.);
00055 float alpha = ps.FindOneFloat("alpha", 2.f);
00056 return new GaussianFilter(xw, yw, alpha);
00057 }