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 #ifndef IMAGE_STATE_SPATIAL_DOMAIN_HH
00026 #define IMAGE_STATE_SPATIAL_DOMAIN_HH
00027
00028 #include <iostream>
00029
00030 #include <ost/base.hh>
00031 #include <ost/img/point.hh>
00032 #include <ost/img/size.hh>
00033 #include <ost/img/extent.hh>
00034 #include <ost/img/pixel_sampling.hh>
00035 #include <ost/img/value_util.hh>
00036 #include "value_holder.hh"
00037 #include "index.hh"
00038
00039 namespace ost { namespace img { namespace image_state {
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 class DLLEXPORT_OST_IMG_BASE SpatialDomain {
00050 public:
00051 SpatialDomain(const Extent& e):
00052 extent_(e)
00053 {}
00054
00055
00056 DataDomain GetDomain() const {return SPATIAL;}
00057
00058 void SetSpatialOrigin(const Point& o) {
00059 extent_=Extent(o,extent_.GetSize());
00060 }
00061
00062 Point GetSpatialOrigin() const {
00063 return extent_.GetStart();
00064 }
00065
00066 Extent GetExtent() const {
00067 return extent_;
00068 }
00069
00070 Extent GetLogicalExtent() const {
00071 return extent_;
00072 }
00073
00074 Extent GetPhysicalExtent() const {
00075 return extent_;
00076 }
00077
00078 template <typename V>
00079 Real GetReal(const Point &p, const ValueHolder<V>& data) const {
00080 if(extent_.Contains(p)) {
00081 return Val2Val<V,Real>(data.Value(Point2Index(p)));
00082 } else {
00083 return 0.0;
00084 }
00085 }
00086
00087 template <typename V>
00088 void SetReal(const Point &p, const Real& r, ValueHolder<V>& data) {
00089 if(extent_.Contains(p)) {
00090 data.Value(Point2Index(p))=Val2Val<Real,V>(r);
00091 }
00092 }
00093
00094 template <typename V>
00095 Complex GetComplex(const Point &p, const ValueHolder<V>& data) const {
00096 if(extent_.Contains(p)) {
00097 return Val2Val<V,Complex>(data.Value(Point2Index(p)));
00098 } else {
00099 return Complex(0.0,0.0);
00100 }
00101 }
00102
00103 template <typename V>
00104 void SetComplex(const Point &p, const Complex& c, ValueHolder<V>& data) {
00105 if(extent_.Contains(p)) {
00106 data.Value(Point2Index(p))=Val2Val<Complex,V>(c);
00107 }
00108 }
00109
00110 Index Point2Index(const Point& p) const {
00111 Point start=extent_.GetStart();
00112 return Index(p[0]-start[0],
00113 p[1]-start[1],
00114 p[2]-start[2]);
00115 }
00116
00117 private:
00118 Extent extent_;
00119
00120 };
00121
00122 }}}
00123
00124 #endif