cgma
|
#include <TDDelaunay.hpp>
Public Member Functions | |
TDDelaunay () | |
virtual | ~TDDelaunay () |
void | reset () |
CubitVector & | circumcenter2d (TRIA *tri_ptr) |
double | radius2d (TRIA *tri_ptr) |
CubitVector & | circumcenter (TRIA *tri_ptr) |
double | radius (TRIA *tri_ptr) |
int | circumsphere (TRIA *tet_ptr, CubitVector ¢er, double &rad) |
int | visit_flag () |
void | visit_flag (int visit) |
int | tri_sort_list () |
void | tri_sort_list (int index) |
Static Public Member Functions | |
static int | is_delaunay (const ToolData *td) |
Private Attributes | |
CubitVector | mCenter |
double | mRadius |
int | visitFlag |
int | sortIndex |
Definition at line 18 of file TDDelaunay.hpp.
MY_INLINE TDDelaunay< TRIA, NODE >::TDDelaunay | ( | ) |
Definition at line 21 of file TDDelaunay.cpp.
MY_INLINE TDDelaunay< TRIA, NODE >::~TDDelaunay | ( | ) | [virtual] |
Definition at line 29 of file TDDelaunay.cpp.
{ }
MY_INLINE CubitVector & TDDelaunay< TRIA, NODE >::circumcenter | ( | TRIA * | tri_ptr | ) |
Definition at line 58 of file TDDelaunay.cpp.
{ if (mRadius < 0.0) { NODE *corner[3]; tri_ptr->tri_nodes( corner[0], corner[1], corner[2] ); // Use coordinates relative to point `a' of the triangle. CubitVector vec_ba(corner[0]->coordinates(), corner[1]->coordinates()); CubitVector vec_ca(corner[0]->coordinates(), corner[2]->coordinates()); // Squares of lengths of the edges incident to `a'. double ba_length = vec_ba.length_squared(); double ca_length = vec_ca.length_squared(); // Cross product of these edges. // (Take your chances with floating-point roundoff.) CubitVector cross_bc = vec_ba * vec_ca; // Calculate the denominator of the formulae. double denominator = 0.5 / (cross_bc % cross_bc); assert(denominator != 0.0); // Calculate offset (from `a') of circumcenter. mCenter = (ba_length * vec_ca - ca_length * vec_ba) * cross_bc; mCenter *= denominator; // radius is length from point `a' to center mRadius = mCenter.length(); // Add point `a' to get global coordinate of center mCenter += corner[0]->coordinates(); } return mCenter; }
MY_INLINE CubitVector & TDDelaunay< TRIA, NODE >::circumcenter2d | ( | TRIA * | tri_ptr | ) |
Definition at line 103 of file TDDelaunay.cpp.
{ if (mRadius < 0.0) { NODE *corner[3]; tri_ptr->tri_nodes( corner[0], corner[1], corner[2] ); double A11 = corner[1]->coordinates().x() - corner[0]->coordinates().x(); double A12 = corner[1]->coordinates().y() - corner[0]->coordinates().y(); double A21 = corner[2]->coordinates().x() - corner[0]->coordinates().x(); double A22 = corner[2]->coordinates().y() - corner[0]->coordinates().y(); double det = A11*A22 - A21*A12; if(det == 0.0) { PRINT_ERROR("Co-linear points can not be used to determine circle.\n"); mCenter.x(0.0);//assert(0); mCenter.y(0.0); mCenter.z(0.0); return mCenter; } double B1 = (A11*A11) + (A12*A12); double B2 = (A21*A21) + (A22*A22); det += det; double xc = (B1*A22 - B2*A12)/det; double yc = (B2*A11 - B1*A21)/det; mRadius = xc * xc + yc * yc; mCenter.x( corner[0]->coordinates().x() + xc ); mCenter.y( corner[0]->coordinates().y() + yc ); } return mCenter; }
MY_INLINE int TDDelaunay< TRIA, NODE >::circumsphere | ( | TRIA * | tet_ptr, |
CubitVector & | center, | ||
double & | rad | ||
) |
Definition at line 179 of file TDDelaunay.cpp.
{ if (mRadius != -1) { radsq = mRadius; center = mCenter; return CUBIT_SUCCESS; } double reltol = DBL_EPSILON * 100.0; NODE *na, *nb, *nc, *nd; tet_ptr->tet_nodes(nc, nb, na, nd); CubitVector a = na->coordinates(); CubitVector b = nb->coordinates(); CubitVector c = nc->coordinates(); CubitVector d = nd->coordinates(); CubitVector da = a - d; CubitVector db = b - d; CubitVector dc = c - d; double rhsa = 0.5*(SQR(da.x()) + SQR(da.y()) + SQR(da.z())); double rhsb = 0.5*(SQR(db.x()) + SQR(db.y()) + SQR(db.z())); double rhsc = 0.5*(SQR(dc.x()) + SQR(dc.y()) + SQR(dc.z())); double cpa = db.y()*dc.z() - dc.y()*db.z(); double cpb = dc.y()*da.z() - da.y()*dc.z(); double cpc = da.y()*db.z() - db.y()*da.z(); double det = da.x()*cpa + db.x()*cpb + dc.x()*cpc; double xmax = CUBIT_MAX(fabs(a.x()),fabs(b.x())); xmax = CUBIT_MAX(xmax,fabs(c.x())); xmax = CUBIT_MAX(xmax,fabs(d.x())); double ymax = CUBIT_MAX(fabs(a.y()),fabs(b.y())); ymax = CUBIT_MAX(ymax,fabs(c.y())); ymax = CUBIT_MAX(ymax,fabs(d.y())); double zmax = CUBIT_MAX(fabs(a.z()),fabs(b.z())); zmax = CUBIT_MAX(zmax,fabs(c.z())); zmax = CUBIT_MAX(zmax,fabs(d.z())); double tolabs = reltol*xmax*ymax*zmax; if (fabs(det) <= tolabs) { radsq = mRadius = -1.0; return CUBIT_FAILURE; } center.x( (rhsa*cpa + rhsb*cpb + rhsc*cpc)/det ); cpa = db.x()*rhsc - dc.x()*rhsb; cpb = dc.x()*rhsa - da.x()*rhsc; cpc = da.x()*rhsb - db.x()*rhsa; center.y( (da.z()*cpa + db.z()*cpb + dc.z()*cpc)/det ); center.z( -(da.y()*cpa + db.y()*cpb + dc.y()*cpc)/det ); radsq = SQR(center.x()) + SQR(center.y()) + SQR(center.z()); center += d; mRadius = radsq; mCenter = center; return CUBIT_SUCCESS; }
static int TDDelaunay< TRIA, NODE >::is_delaunay | ( | const ToolData * | td | ) | [inline, static] |
Definition at line 36 of file TDDelaunay.hpp.
{return (CAST_TO(td, const TDDelaunay) != NULL);}
MY_INLINE double TDDelaunay< TRIA, NODE >::radius | ( | TRIA * | tri_ptr | ) |
Definition at line 148 of file TDDelaunay.cpp.
{ if (mRadius < 0.0) { this->circumcenter( tri_ptr ); } return mRadius; }
MY_INLINE double TDDelaunay< TRIA, NODE >::radius2d | ( | TRIA * | tri_ptr | ) |
Definition at line 163 of file TDDelaunay.cpp.
{ if (mRadius < 0.0) { this->circumcenter2d( tri_ptr ); } return mRadius; }
MY_INLINE void TDDelaunay< TRIA, NODE >::reset | ( | ) |
Definition at line 41 of file TDDelaunay.cpp.
int TDDelaunay< TRIA, NODE >::tri_sort_list | ( | ) | [inline] |
Definition at line 57 of file TDDelaunay.hpp.
{return sortIndex;};
void TDDelaunay< TRIA, NODE >::tri_sort_list | ( | int | index | ) | [inline] |
Definition at line 58 of file TDDelaunay.hpp.
{sortIndex = index;};
int TDDelaunay< TRIA, NODE >::visit_flag | ( | ) | [inline] |
Definition at line 53 of file TDDelaunay.hpp.
{return visitFlag;};
void TDDelaunay< TRIA, NODE >::visit_flag | ( | int | visit | ) | [inline] |
Definition at line 54 of file TDDelaunay.hpp.
{visitFlag = visit;};
CubitVector TDDelaunay< TRIA, NODE >::mCenter [private] |
Definition at line 25 of file TDDelaunay.hpp.
double TDDelaunay< TRIA, NODE >::mRadius [private] |
Definition at line 26 of file TDDelaunay.hpp.
int TDDelaunay< TRIA, NODE >::sortIndex [private] |
Definition at line 28 of file TDDelaunay.hpp.
int TDDelaunay< TRIA, NODE >::visitFlag [private] |
Definition at line 27 of file TDDelaunay.hpp.