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
00031
00032
00033 #ifndef _BARYCOORDSYSTEMTRIANGLE3D_H
00034 #define _BARYCOORDSYSTEMTRIANGLE3D_H
00035
00036
00037 #include "Array.h"
00038 #include "Volumes.h"
00039 #include <iostream>
00040 #include <algorithm>
00041
00042
00043 namespace Go {
00046
00047
00054 class BaryCoordSystemTriangle3D {
00055 public:
00057 BaryCoordSystemTriangle3D() { }
00058
00061 BaryCoordSystemTriangle3D(const Array<double, 3>* corners)
00062 {
00063 std::copy(corners, corners+3, corners_);
00064 total_area_ = area(corners);
00065 normal_ = (corners[1]-corners[0]) % (corners[2]-corners[0]);
00066 normal_.normalize();
00067 }
00068
00071 template <typename T>
00072 Array<T, 3> baryToCart(const Array<T, 3>& bary_pt) const
00073 {
00074 Array<T, 3> cart_pt(T(0.0), T(0.0), T(0.0));
00075 for (int i = 0; i < 3; ++i) {
00076 cart_pt[0] += corners_[i][0] * bary_pt[i];
00077 cart_pt[1] += corners_[i][1] * bary_pt[i];
00078 cart_pt[2] += corners_[i][2] * bary_pt[i];
00079 }
00080 return cart_pt;
00081 }
00082
00085 template <typename T>
00086 Array<T, 3> cartToBary(const Array<T, 3>& cart_pt) const
00087 {
00088 static Array<T, 3> subtriangle[3];
00089 int i;
00090 for (i = 1; i < 3; ++i) {
00091 subtriangle[i] = corners_[i];
00092 }
00093
00094 Array<T, 3> bary_pt;
00095 for (i = 0; i < 3; ++i) {
00096 subtriangle[i] = cart_pt;
00097 bary_pt[i] = signed_area(subtriangle, normal_);
00098 subtriangle[i] = corners_[i];
00099 }
00100 return bary_pt / total_area_;
00101 }
00102
00103 private:
00104 Array<double, 3> corners_[3];
00105 Array<double, 3> normal_;
00106 double total_area_;
00107 };
00108
00109
00111 }
00112
00113 #endif // _BARYCOORDSYSTEMTRIANGLE3D_H
00114
00115