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
00026
00027
00028
00029
00030 #ifndef CHASTEELLIPSOID_HPP_
00031 #define CHASTEELLIPSOID_HPP_
00032
00033 #include "AbstractChasteRegion.hpp"
00034 #include "ChastePoint.hpp"
00035
00036
00042 template <unsigned SPACE_DIM>
00043 class ChasteEllipsoid : public AbstractChasteRegion<SPACE_DIM>
00044 {
00045 private:
00046
00048 ChastePoint<SPACE_DIM> mCentre;
00049
00051 ChastePoint<SPACE_DIM> mRadii;
00052
00053 public:
00054
00061 ChasteEllipsoid(ChastePoint<SPACE_DIM>& rCentre, ChastePoint<SPACE_DIM>& rRadii)
00062 : mCentre(rCentre),
00063 mRadii(rRadii)
00064 {
00065 for (unsigned dim=0; dim<SPACE_DIM; dim++)
00066 {
00067 if (mRadii[dim] < 0.0)
00068 {
00069 EXCEPTION("Attempted to create an ellipsoid with a negative radius");
00070 }
00071 }
00072
00073 }
00074
00075
00082 bool DoesContain(const ChastePoint<SPACE_DIM>& rPointToCheck) const
00083 {
00084
00085 double x_distance, y_distance, z_distance;
00086 switch(SPACE_DIM)
00087 {
00088
00089 case 1:
00090
00091 if (rPointToCheck[0] < mCentre[0] - mRadii[0] - 100.0 * DBL_EPSILON ||
00092 rPointToCheck[0] > mCentre[0] + mRadii[0] + 100.0 * DBL_EPSILON )
00093 {
00094 return false;
00095 }
00096 break;
00097 case 2:
00098 x_distance = (rPointToCheck[0]-mCentre[0])/mRadii[0];
00099 y_distance = (rPointToCheck[1]-mCentre[1])/mRadii[1];
00100 if ( (x_distance*x_distance + y_distance*y_distance) > (1.0 + 100.0 * DBL_EPSILON) )
00101 {
00102 return false;
00103 }
00104 break;
00105 case 3:
00106 x_distance = (rPointToCheck[0]-mCentre[0])/mRadii[0];
00107 y_distance = (rPointToCheck[1]-mCentre[1])/mRadii[1];
00108 z_distance = (rPointToCheck[2]-mCentre[2])/mRadii[2];
00109 if ( (x_distance*x_distance + y_distance*y_distance + z_distance*z_distance) > (1.0 + 100.0 * DBL_EPSILON) )
00110 {
00111 return false;
00112 }
00113 break;
00114 }
00115 return true;
00116 }
00117
00119 const ChastePoint<SPACE_DIM>& rGetCentre() const
00120 {
00121 return mCentre;
00122 }
00124 const ChastePoint<SPACE_DIM>& rGetRadii()
00125 {
00126 return mRadii;
00127 }
00128
00129 };
00130
00131 #endif