|
cgma
|
#include <CubitFacetEdge.hpp>
Definition at line 38 of file CubitFacetEdge.hpp.
Definition at line 29 of file CubitFacetEdge.cpp.
: bezierOrder(0), markedFlag(0), isFeature(0), isFlipped(CUBIT_FALSE) { }
| CubitFacetEdge::~CubitFacetEdge | ( | ) | [virtual] |
Definition at line 41 of file CubitFacetEdge.cpp.
{
}
| virtual void CubitFacetEdge::add_facet | ( | CubitFacet * | ) | [inline, virtual] |
Reimplemented in CubitFacetEdgeData.
Definition at line 122 of file CubitFacetEdge.hpp.
{ assert(0); }
| void CubitFacetEdge::add_facets | ( | ) |
Definition at line 1082 of file CubitFacetEdge.cpp.
{
CubitPoint *p0 = point (0);
CubitPoint *p1 = point (1);
DLIList<CubitFacet *> adj_facets;
p0->shared_facets(p1, adj_facets );
CubitFacet *facet;
int ii;
for(ii=0; ii<adj_facets.size(); ii++)
{
facet = adj_facets.get_and_step();
facet->add_edge( this );
}
}
| virtual CubitFacet* CubitFacetEdge::adj_facet | ( | int | index | ) | [pure virtual] |
Implemented in CubitFacetEdgeData.
| CubitFacet * CubitFacetEdge::adj_facet_on_surf | ( | int | tool_id | ) |
Definition at line 854 of file CubitFacetEdge.cpp.
{
DLIList<CubitFacet *> cf_list;
facets( cf_list );
CubitFacet *adj_facet = NULL;
int found = 0;
for (int ii=0; ii<cf_list.size() && !found; ii++)
{
adj_facet = cf_list.get_and_step();
if (adj_facet->tool_id() == tool_id)
{
found = 1;
}
}
if (!found)
adj_facet = NULL;
return adj_facet;
}
| double CubitFacetEdge::angle_between_facets | ( | ) |
Definition at line 1099 of file CubitFacetEdge.cpp.
{
CubitFacet *facet0 = adj_facet(0);
CubitFacet *facet1 = adj_facet(1);
// assumes facets are always oriented with outwards pointing normal
CubitVector n0 = facet0->normal();
CubitVector n1 = facet1->normal();
// get orientation of edge with respect to facet0
CubitPoint *p0 = point(0);
CubitPoint *p1 = point(1);
CubitPoint *pnext = facet0->next_node(p0);
if (pnext != p1)
{
pnext = p0;
p0 = p1;
p1 = pnext;
}
CubitVector evec = p1->coordinates() - p0->coordinates();
evec.normalize();
CubitVector cross = n0 * n1; cross.normalize();
double angle;
double edot = evec % cross;
double ndot = n0 % n1;
if (ndot >= 1.0)
angle = 0.0;
else if (ndot <= -1.0)
angle = CUBIT_PI;
else
angle = acos(ndot);
if (edot <= 0.0)
{
angle = 2.0 * CUBIT_PI - angle;
}
return angle;
}
| virtual int CubitFacetEdge::bezier_order | ( | ) | [inline, virtual] |
Definition at line 90 of file CubitFacetEdge.hpp.
{return bezierOrder;};
| void CubitFacetEdge::boundary_edge_points | ( | CubitPoint *& | pt0, |
| CubitPoint *& | pt1, | ||
| int | tool_id = 0 |
||
| ) |
Definition at line 492 of file CubitFacetEdge.cpp.
{
if(num_adj_facets() == 0)
{
pt0 = point(0);
pt1 = point(1);
return;
}
CubitFacet *facet = NULL;
if (tool_id != 0)
{
int ii;
int found = 0;
DLIList <CubitFacet *> adj_facets;
facets(adj_facets);
for (ii=0; ii<adj_facets.size() && !found; ii++)
{
facet = adj_facets.get_and_step();
if (facet->tool_id() == tool_id)
found = 1;
}
assert(found);
}
else
{
facet = adj_facet(0);
if (!facet) facet = adj_facet(1);
assert(facet != 0);
}
int index = facet->edge_index( this );
int use = facet->edge_use( index );
if (use == 1) {
pt0 = point(0);
pt1 = point(1);
}
else {
pt0 = point(1);
pt1 = point(0);
}
}
| CubitBox CubitFacetEdge::bounding_box | ( | void | ) |
Definition at line 934 of file CubitFacetEdge.cpp.
{
CubitPoint *p1 = point (0);
CubitPoint *p2 = point (1);
CubitVector bbox_min, bbox_max;
bbox_min.x(CUBIT_MIN(p1->x(),p2->x()));
bbox_min.y(CUBIT_MIN(p1->y(),p2->y()));
bbox_min.z(CUBIT_MIN(p1->z(),p2->z()));
bbox_max.x(CUBIT_MAX(p1->x(),p2->x()));
bbox_max.y(CUBIT_MAX(p1->y(),p2->y()));
bbox_max.z(CUBIT_MAX(p1->z(),p2->z()));
CubitBox edge_box(bbox_min,bbox_max);
return edge_box;
}
| CubitVector CubitFacetEdge::center | ( | ) | [inline] |
Definition at line 184 of file CubitFacetEdge.hpp.
{ return position_from_fraction(0.5); }
| CubitStatus CubitFacetEdge::closest_point | ( | const CubitVector & | point, |
| CubitVector & | closest_point | ||
| ) |
Definition at line 381 of file CubitFacetEdge.cpp.
{
//CubitStatus rv = CUBIT_SUCCESS;
CubitPoint *pt0 = this->point(0);
CubitPoint *pt1 = this->point(1);
// the edge vector
CubitVector e0 ( pt1->x() - pt0->x(),
pt1->y() - pt0->y(),
pt1->z() - pt0->z() );
double elen = e0.normalize();
// vector from vert0 to point
CubitVector v0 ( point.x() - pt0->x(),
point.y() - pt0->y(),
point.z() - pt0->z() );
// project to edge
double len = v0%e0;
if (len <= 0.0)
{
closest_point = pt0->coordinates();
}
else if( len >= elen )
{
closest_point = pt1->coordinates();
}
else
{
closest_point.x ( pt0->x() + e0.x() * len );
closest_point.y ( pt0->y() + e0.y() * len );
closest_point.z ( pt0->z() + e0.z() * len );
}
return CUBIT_SUCCESS;
}
| CubitBoolean CubitFacetEdge::contains | ( | CubitPoint * | point_ptr | ) |
Definition at line 879 of file CubitFacetEdge.cpp.
{
if (point(0) == point_ptr || point(1) == point_ptr)
return CUBIT_TRUE;
return CUBIT_FALSE;
}
| int CubitFacetEdge::control_points | ( | CubitVector * | ctrl_pts | ) | [virtual] |
Definition at line 69 of file CubitFacetEdge.cpp.
{
DLIList<CubitPoint*> my_points;
points(my_points);
ctrl_pts[0] = my_points.get()->coordinates();
for(int i=0; i<bezierOrder-1; i++) {
ctrl_pts[i+1] = controlPoints[i];
}
ctrl_pts[bezierOrder] = my_points.next()->coordinates();
return bezierOrder;
}
| virtual CubitVector* CubitFacetEdge::control_points | ( | ) | [inline, virtual] |
Definition at line 93 of file CubitFacetEdge.hpp.
{ return controlPoints; };
| void CubitFacetEdge::control_points | ( | CubitVector * | ctrl_pts, |
| int | order | ||
| ) | [inline, virtual] |
Definition at line 250 of file CubitFacetEdge.hpp.
{
assert(order > 0 && order <=4);
bezierOrder = order;
for(int i=0; i<order-1; i++){
controlPoints[i] = ctrl_pts[i];
}
}
| CubitStatus CubitFacetEdge::control_points | ( | CubitFacet * | facet, |
| CubitVector * | ctrl_pts | ||
| ) | [virtual] |
Definition at line 89 of file CubitFacetEdge.cpp.
{
int index = -1;
CubitBoolean found = CUBIT_FALSE;
for (int i=0; i<3 && !found; i++) {
if (this == facet->edge(i)) {
index = i;
found = CUBIT_TRUE;
}
}
if (!found) {
return CUBIT_FAILURE;
}
DLIList<CubitPoint*> my_points;
points(my_points);
switch (facet->edge_use(index)) {
case 1:
ctrl_pts[0] = my_points.get()->coordinates();
ctrl_pts[1] = controlPoints[0];
ctrl_pts[2] = controlPoints[1];
ctrl_pts[3] = controlPoints[2];
ctrl_pts[4] = my_points.next()->coordinates();
break;
case -1:
ctrl_pts[0] = my_points.next()->coordinates();
ctrl_pts[1] = controlPoints[2];
ctrl_pts[2] = controlPoints[1];
ctrl_pts[3] = controlPoints[0];
ctrl_pts[4] = my_points.get()->coordinates();
break;
default:
return CUBIT_FAILURE;
}
return CUBIT_SUCCESS;
}
| void CubitFacetEdge::debug_draw | ( | int | color = -1, |
| int | flush = 1, |
||
| int | draw_uv = 0 |
||
| ) | [virtual] |
Implements FacetEntity.
Definition at line 892 of file CubitFacetEdge.cpp.
{
if ( color == -1 )
color = CUBIT_RED_INDEX;
GfxDebug::draw_facet_edge(this, color);
GfxDebug::draw_point( point(0)->coordinates(), color );
GfxDebug::draw_point( point(1)->coordinates(), color );
if ( flush )
GfxDebug::flush();
}
| double CubitFacetEdge::dist_to_edge | ( | const CubitVector & | this_point, |
| CubitVector & | close_point, | ||
| CubitBoolean & | outside_edge | ||
| ) |
Definition at line 543 of file CubitFacetEdge.cpp.
{
double dist = 0.0;
CubitVector p0 = point(0)->coordinates();
CubitVector p1 = point(1)->coordinates();
CubitVector edge_vec( p1, p0 );
CubitVector point_vec( this_point, p0 );
double edge_length;
edge_length = edge_vec.normalize();
double dist_on_edge = edge_vec % point_vec;
if (dist_on_edge < 0.0e0)
{
close_point = p0;
outside_edge = CUBIT_TRUE;
}
else if (dist_on_edge > edge_length)
{
close_point = p1;
outside_edge = CUBIT_TRUE;
}
else
{
close_point = p0 - edge_vec * dist_on_edge;
outside_edge = CUBIT_FALSE;
}
dist = close_point.distance_between( this_point );
return dist;
}
| CubitStatus CubitFacetEdge::edge_curvature | ( | const CubitVector & | point_on_edge, |
| CubitVector & | curvature, | ||
| CubitFacetEdge * | closest_edge | ||
| ) |
Definition at line 659 of file CubitFacetEdge.cpp.
{
CubitVector vec_ba, vec_ca, center_point;
//if point(0) is middle point
if( closest_edge->other_point( point(0) ) )
{
center_point = point(0)->coordinates();
vec_ba = closest_edge->point(0)->coordinates() - center_point;
vec_ca = point(1)->coordinates() - center_point;
}
//if point(1) is middle point
else if( closest_edge->other_point( point(1) ) )
{
center_point = point(1)->coordinates();
vec_ba = point(0)->coordinates() - center_point;
vec_ca = closest_edge->point(1)->coordinates() - center_point;
}
else
assert(0);
// 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 temp_dbl = cross_bc % cross_bc;
CubitVector circle_center(0.0,0.0,0.0);
if(fabs(temp_dbl) > CUBIT_DBL_MIN){
double denominator = 0.5 / (temp_dbl);
assert(denominator != 0.0);
// Calculate offset (from `a') of circumcenter.
circle_center = (ba_length * vec_ca - ca_length * vec_ba) * cross_bc;
circle_center *= denominator;
//store radius
double radius = circle_center.length();
circle_center.normalize();
circle_center /= radius;
}
curvature = circle_center;
return CUBIT_SUCCESS;
}
| CubitStatus CubitFacetEdge::edge_tangent | ( | const CubitVector & | point_on_edge, |
| CubitVector & | tangent | ||
| ) |
Definition at line 642 of file CubitFacetEdge.cpp.
{
CubitStatus stat = CUBIT_SUCCESS;
tangent = point(1)->coordinates() -
point(0)->coordinates();
tangent.normalize();
return stat;
}
| virtual void CubitFacetEdge::edges | ( | DLIList< CubitFacetEdge * > & | edge_list | ) | [pure virtual] |
Implements FacetEntity.
Implemented in CubitFacetEdgeData.
| virtual CubitPoint* CubitFacetEdge::end_node | ( | ) | [pure virtual] |
Implemented in CubitFacetEdgeData.
| CubitStatus CubitFacetEdge::evaluate | ( | double & | t, |
| CubitVector * | eval_point, | ||
| CubitVector * | eval_tangent | ||
| ) |
Definition at line 204 of file CubitFacetEdge.cpp.
{
CubitStatus stat = CUBIT_SUCCESS;
// project the position to the linear edge
double tt = (t + 1) * 0.5;
if (tt <= 0.0) tt = 0.0;
if (tt >= 1.0) tt = 1.0;
*eval_point = point(0)->coordinates() +
tt * (point(1)->coordinates() - point(0)->coordinates());
// evaluate the point on the facet (if the order is higher than 0)
CubitFacet *facet_ptr = this->adj_facet( 0 );
if (!facet_ptr || facet_ptr->is_flat())
{
if (eval_tangent)
{
*eval_tangent = point(1)->coordinates() - point(0)->coordinates();
(*eval_tangent).normalize();
}
}
else
{
CubitVector areacoord;
FacetEvalTool::facet_area_coordinate( facet_ptr, *eval_point, areacoord );
stat = facet_ptr->evaluate( areacoord, eval_point, eval_tangent );
if (stat != CUBIT_SUCCESS)
return stat;
if (eval_tangent)
{
CubitVector edvec = point(1)->coordinates() - point(0)->coordinates();
edvec.normalize();
CubitVector cross = edvec * *eval_tangent;
*eval_tangent = *eval_tangent * cross;
(*eval_tangent).normalize();
}
}
return stat;
}
| CubitStatus CubitFacetEdge::evaluate_2nd_derivative | ( | double & | t, |
| CubitVector * | outv | ||
| ) |
Definition at line 335 of file CubitFacetEdge.cpp.
{
CubitVector P0, P1, second_d;
DLIList<CubitPoint*> my_points;
double val;
// project the position to the linear edge
double tt = (t + 1) * 0.5;
if (tt <= 0.0) tt = 0.0;
if (tt >= 1.0) tt = 1.0;
points(my_points);
P0 = my_points.get()->coordinates();
P1 = my_points.next()->coordinates();
val = 12.*(1.-tt)*(1.-tt)*P0.x() -
24.*(2.*tt*tt - 3.*tt + 1.)*controlPoints[0].x() +
12.*(6.*tt*tt - 6.*tt + 1.)*controlPoints[1].x() +
24.*(tt - 2.*tt*tt)*controlPoints[2].x() +
12.*tt*tt*P1.x();
second_d.x(val);
val = 12.*(1.-tt)*(1.-tt)*P0.y() -
24.*(2.*tt*tt - 3.*tt + 1.)*controlPoints[0].y() +
12.*(6.*tt*tt - 6.*tt + 1.)*controlPoints[1].y() +
24.*(tt - 2.*tt*tt)*controlPoints[2].y() +
12.*tt*tt*P1.y();
second_d.y(val);
val = 12.*(1.-tt)*(1.-tt)*P0.z() -
24.*(2.*tt*tt - 3.*tt + 1.)*controlPoints[0].z() +
12.*(6.*tt*tt - 6.*tt + 1.)*controlPoints[1].z() +
24.*(tt - 2.*tt*tt)*controlPoints[2].z() +
12.*tt*tt*P1.z();
second_d.z(val);
*outv = second_d;
return CUBIT_SUCCESS;
}
| CubitStatus CubitFacetEdge::evaluate_position | ( | const CubitVector & | start_position, |
| CubitVector * | eval_point, | ||
| CubitVector * | eval_tangent | ||
| ) |
Definition at line 135 of file CubitFacetEdge.cpp.
{
CubitStatus stat = CUBIT_SUCCESS;
// find the adjacent facet
CubitFacet *facet_ptr = this->adj_facet( 0 );
// If there is none or this is a linear representation -
// then project to the linear edge
if (!facet_ptr || facet_ptr->eval_order() == 0 || facet_ptr->is_flat())
{
if (eval_point)
{
closest_point(start_position, *eval_point);
}
if (eval_tangent)
{
*eval_tangent = point(1)->coordinates() - point(0)->coordinates();
(*eval_tangent).normalize();
}
}
else
{
int vert0 = facet_ptr->point_index( point(0) );
int vert1 = facet_ptr->point_index( point(1) );
CubitVector pt_on_plane, close_point;
CubitVector start = start_position;
double dist_to_plane;
CubitBoolean outside_facet;
FacetEvalTool::project_to_facet_plane( facet_ptr, start,
pt_on_plane, dist_to_plane );
stat = FacetEvalTool::project_to_facetedge( facet_ptr,
vert0, vert1,
start,
pt_on_plane,
close_point,
outside_facet );
if (eval_point)
{
*eval_point = close_point;
}
if (eval_tangent)
{
CubitVector edvec = point(1)->coordinates() - point(0)->coordinates();
edvec.normalize();
CubitVector areacoord;
FacetEvalTool::facet_area_coordinate( facet_ptr, close_point, areacoord );
FacetEvalTool::eval_facet_normal(facet_ptr, areacoord, *eval_tangent);
CubitVector cross = edvec * *eval_tangent;
*eval_tangent = *eval_tangent * cross;
(*eval_tangent).normalize();
}
}
return stat;
}
| CubitStatus CubitFacetEdge::evaluate_single | ( | double & | t, |
| CubitVector * | outv | ||
| ) |
Definition at line 255 of file CubitFacetEdge.cpp.
{
CubitVector P0, P1;
double t4, t3, t2, one_minus_t, one_minus_t2, one_minus_t3, one_minus_t4;
DLIList<CubitPoint*> my_points;
// project the position to the linear edge
double tt = (t + 1) * 0.5;
if (tt <= 0.0) tt = 0.0;
if (tt >= 1.0) tt = 1.0;
points(my_points);
P0 = my_points.get()->coordinates();
P1 = my_points.next()->coordinates();
t2 = tt*tt;
t3 = t2*tt;
t4 = t3*tt;
one_minus_t = 1.-tt;
one_minus_t2 = one_minus_t*one_minus_t;
one_minus_t3 = one_minus_t2*one_minus_t;
one_minus_t4 = one_minus_t3*one_minus_t;
*outv = one_minus_t4*P0 +
4.*one_minus_t3*tt* controlPoints[0] +
6.*one_minus_t2*t2*controlPoints[1] +
4.*one_minus_t* t3*controlPoints[2] +
t4*P1;
return CUBIT_SUCCESS;
}
| CubitStatus CubitFacetEdge::evaluate_single_tangent | ( | double & | t, |
| CubitVector * | outv | ||
| ) |
Definition at line 296 of file CubitFacetEdge.cpp.
{
CubitVector P0, P1;
double t3, t2, one_minus_t, one_minus_t2, one_minus_t3;
DLIList<CubitPoint*> my_points;
// project the position to the linear edge
double tt = (t + 1) * 0.5;
if (tt <= 0.0) tt = 0.0;
if (tt >= 1.0) tt = 1.0;
points(my_points);
P0 = my_points.get()->coordinates();
P1 = my_points.next()->coordinates();
t2 = tt*tt;
t3 = t2*tt;
one_minus_t = 1.-tt;
one_minus_t2 = one_minus_t*one_minus_t;
one_minus_t3 = one_minus_t2*one_minus_t;
*outv = -4.*one_minus_t3*P0 +
4.*(one_minus_t3 -3.*tt*one_minus_t2)*controlPoints[0] +
12.*(tt*one_minus_t2 - t2*one_minus_t)*controlPoints[1] +
4.*(3.*t2*one_minus_t - t3)*controlPoints[2] +
4.*t3*P1;
return CUBIT_SUCCESS;
}
| virtual void CubitFacetEdge::facets | ( | DLIList< CubitFacet * > & | facet_list | ) | [pure virtual] |
Implements FacetEntity.
Implemented in CubitFacetEdgeData.
| CubitPoint * CubitFacetEdge::find_start_point_for_edge_list | ( | DLIList< CubitFacetEdge * > | edge_list | ) | [static] |
Definition at line 1229 of file CubitFacetEdge.cpp.
{
// look for an edge with a point only connected to the one edge in the set
//
// TODO - this algorithm could be made more efficient by only checking one endpoint
// per edge. The current implementation should match the order points were
// checked in previous functionality.
// If speed becomes an issue it could be reimplemented
//
if (1 == edge_list.size())
{
return edge_list[0]->point(0);
}
int i;
CubitPoint *start_point = NULL;
for (i=0; i<edge_list.size() && (start_point == NULL); i++)
{
CubitFacetEdge *tmp_edge = edge_list.get_and_step();
DLIList<CubitFacetEdge*> pt_edges;
tmp_edge->point(0)->edges(pt_edges);
pt_edges.intersect_unordered(edge_list);
if (pt_edges.size() == 1)
{
start_point = tmp_edge->point(0);
}
else
{
pt_edges.clean_out();
tmp_edge->point(1)->edges(pt_edges);
pt_edges.intersect_unordered(edge_list);
if (pt_edges.size() == 1)
{
start_point = tmp_edge->point(1);
}
}
}
return start_point;
}
| virtual void CubitFacetEdge::flip | ( | ) | [pure virtual] |
Implemented in CubitFacetEdgeData.
| void CubitFacetEdge::get_control_points | ( | CubitPoint * | point_ptr, |
| CubitVector | ctrl_pts[3] | ||
| ) | [inline, virtual] |
Definition at line 270 of file CubitFacetEdge.hpp.
{
DLIList<CubitPoint*> my_points;
points(my_points);
if (point_ptr == my_points.get())
{
ctrl_pts[0] = controlPoints[0];
ctrl_pts[1] = controlPoints[1];
ctrl_pts[2] = controlPoints[2];
}
else if(point_ptr == my_points.next())
{
ctrl_pts[0] = controlPoints[2];
ctrl_pts[1] = controlPoints[1];
ctrl_pts[2] = controlPoints[0];
}
else
{
assert(0); // point_ptr does not match either point
}
}
| virtual int CubitFacetEdge::get_flag | ( | ) | [inline, virtual] |
Definition at line 110 of file CubitFacetEdge.hpp.
{return markedFlag;};
| void CubitFacetEdge::get_parents | ( | DLIList< FacetEntity * > & | facet_list | ) | [virtual] |
Implements FacetEntity.
Definition at line 758 of file CubitFacetEdge.cpp.
{
DLIList<CubitFacet *> cf_list;
facets( cf_list );
for (int ii=0; ii<cf_list.size(); ii++)
facet_list.append(cf_list.get_and_step());
}
| virtual int CubitFacetEdge::id | ( | ) | [pure virtual] |
Implemented in CubitFacetEdgeData.
| CubitStatus CubitFacetEdge::intersect | ( | CubitVector & | aa, |
| CubitVector & | bb, | ||
| CubitVector & | norm, | ||
| CubitVector & | qq, | ||
| CubitBoolean & | does_intersect | ||
| ) |
Definition at line 429 of file CubitFacetEdge.cpp.
{
CubitPoint *pt0 = this->point(0);
CubitPoint *pt1 = this->point(1);
double P0[2], P1[2], AA[2], BB[2];
CubitVector absnorm(fabs(norm.x()), fabs(norm.y()), fabs(norm.z()));
if (absnorm.x() >= absnorm.y() && absnorm.x() >= absnorm.z())
{
P0[0] = pt0->coordinates().y(); P0[1] = pt0->coordinates().z();
P1[0] = pt1->coordinates().y(); P1[1] = pt1->coordinates().z();
AA[0] = aa.y(); AA[1] = aa.z();
BB[0] = bb.y(); BB[1] = bb.z();
}
else if (absnorm.y() >= absnorm.x() && absnorm.y() >= absnorm.z())
{
P0[0] = pt0->coordinates().z(); P0[1] = pt0->coordinates().x();
P1[0] = pt1->coordinates().z(); P1[1] = pt1->coordinates().x();
AA[0] = aa.z(); AA[1] = aa.x();
BB[0] = bb.z(); BB[1] = bb.x();
}
else
{
P0[0] = pt0->coordinates().x(); P0[1] = pt0->coordinates().y();
P1[0] = pt1->coordinates().x(); P1[1] = pt1->coordinates().y();
AA[0] = aa.x(); AA[1] = aa.y();
BB[0] = bb.x(); BB[1] = bb.y();
}
double QQ[4], s;
int ninter = intersect_2D_segments(P0, P1, AA, BB, QQ);
if (ninter != 1)
{
does_intersect = CUBIT_FALSE;
return CUBIT_SUCCESS;
}
does_intersect = CUBIT_TRUE;
double dx = P1[0] - P0[0];
double dy = P1[1] - P0[1];
if (fabs(dx) > fabs(dy))
s = (QQ[0] - P0[0]) / dx;
else
s = (QQ[1] - P0[1]) / dy;
qq = pt0->coordinates() + s * (pt1->coordinates() - pt0->coordinates());
return CUBIT_SUCCESS;
}
| int CubitFacetEdge::intersect_2D_segments | ( | double | P0[2], |
| double | P1[2], | ||
| double | P2[2], | ||
| double | P3[2], | ||
| double | qq[4] | ||
| ) | [static] |
Definition at line 963 of file CubitFacetEdge.cpp.
{
double D0[2], D1[2];
D0[0] = P1[0] - P0[0]; D0[1] = P1[1] - P0[1];
D1[0] = P3[0] - P2[0]; D1[1] = P3[1] - P2[1];
// segments P0 + s * D0 for s in [0,1],
// P2 + t * D1 for t in [0,1]
double sqr_epsilon = DBL_EPSILON * DBL_EPSILON;
double E[2];
E[0] = P2[0] - P0[0];
E[1] = P2[1] - P0[1];
double kross = D0[0] * D1[1] - D0[1] * D1[0];
double sqr_kross = kross * kross;
double sqr_len0 = D0[0] * D0[0] + D0[1] * D0[1];
double sqr_len1 = D1[0] * D1[0] + D1[1] * D1[1];
if (sqr_kross > sqr_epsilon * sqr_len0 * sqr_len1)
{
// lines of the segment are not parallel
double s = (E[0] * D1[1] - E[1] * D1[0]) / kross;
if (s < 0.0 || s > 1.0)
{
// intersection of lines is not a point on segment P0 + s * D0
return 0;
}
double t = (E[0] * D0[1] - E[1] * D0[0]) / kross;
if (t < 0.0 || t > 1.0)
{
// intersection of lines is not a point on segment P1 + t * D1
return 0;
}
// intersection of lines is a point on each segment
qq[0] = P0[0] + s * D0[0];
qq[1] = P0[1] + s * D0[1];
return 1;
}
// lines of the segments are parallel
double sqr_lenE = E[0] * E[0] + E[1] * E[1];
kross = E[0] * D0[1] - E[1] * D0[1];
sqr_kross = kross * kross;
if (sqr_kross > sqr_epsilon * sqr_len0 * sqr_lenE)
{
// lines of the segments are different
return 0;
}
// lines of the segment are the same. Need to test for overlap of segments
double s0 = (D0[0] * E[0] + D0[1] * E[1]) / sqr_len0;
double s1 = s0 + (D0[0] * D1[0] + D0[1] * D1[1]) / sqr_len0;
double smin = CUBIT_MIN(s0, s1);
double smax = CUBIT_MAX(s0, s1);
double w[2];
int imax = intersect_intervals(0.0, 1.0, smin, smax, w);
for (int i=0; i<imax; i++)
{
qq[i*2] = P0[0] + w[i] * D0[0];
qq[i*2+1] = P0[1] + w[i] * D0[1];
}
return imax;
}
| int CubitFacetEdge::intersect_intervals | ( | double | u0, |
| double | u1, | ||
| double | v0, | ||
| double | v1, | ||
| double | w[2] | ||
| ) | [static] |
Definition at line 1041 of file CubitFacetEdge.cpp.
{
if (u1 < v0 || u0 > v1)
return 0;
if (u1 > v0)
{
if (u0 < v1)
{
if (u0 < v0)
w[0] = v0;
else
w[0] = u0;
if (u1 > v1)
w[1] = v1;
else
w[1] = u1;
return 2;
}
else
{
w[0] = u0;
return 1;
}
}
else
{
w[0] = u1;
return 1;
}
return 0;
}
| CubitBoolean CubitFacetEdge::is_feature | ( | ) | [inline] |
Definition at line 212 of file CubitFacetEdge.hpp.
{return (isFeature ? CUBIT_TRUE : CUBIT_FALSE); }
| int CubitFacetEdge::is_flipped | ( | ) | [inline] |
Definition at line 66 of file CubitFacetEdge.hpp.
{
if(isFlipped)
return 1;
return 0;
}
| void CubitFacetEdge::is_flipped | ( | int | flipped | ) | [inline] |
Definition at line 72 of file CubitFacetEdge.hpp.
{
if(flipped)
isFlipped = CUBIT_TRUE;
else
isFlipped = CUBIT_FALSE;
}
| double CubitFacetEdge::length | ( | ) |
Definition at line 718 of file CubitFacetEdge.cpp.
{
CubitVector start = point(0)->coordinates();
CubitVector end = point(1)->coordinates();
return start.distance_between( end );
}
| int CubitFacetEdge::less_than | ( | CubitFacetEdge *& | e1, |
| CubitFacetEdge *& | e2 | ||
| ) | [inline] |
Definition at line 239 of file CubitFacetEdge.hpp.
| virtual void CubitFacetEdge::marked | ( | int | my_flag | ) | [inline, virtual] |
Reimplemented in CubitFacetEdgeData.
Definition at line 131 of file CubitFacetEdge.hpp.
{ set_flag(my_flag); }
| virtual int CubitFacetEdge::marked | ( | ) | [inline, virtual] |
Reimplemented in CubitFacetEdgeData.
Definition at line 132 of file CubitFacetEdge.hpp.
{ return get_flag(); }
| virtual int CubitFacetEdge::num_adj_facets | ( | ) | [pure virtual] |
Implemented in CubitFacetEdgeData.
| int CubitFacetEdge::num_adj_facets_on_surf | ( | int | tool_id | ) |
Definition at line 831 of file CubitFacetEdge.cpp.
{
DLIList<CubitFacet *> cf_list;
facets( cf_list );
CubitFacet *adj_facet = NULL;
int nfacets = 0;
for (int ii=0; ii<cf_list.size(); ii++)
{
adj_facet = cf_list.get_and_step();
if (adj_facet->tool_id() == tool_id)
nfacets++;
}
return nfacets;
}
| virtual int CubitFacetEdge::number_faces | ( | ) | [inline, virtual] |
Definition at line 129 of file CubitFacetEdge.hpp.
{ return 0; }
| virtual int CubitFacetEdge::number_tris | ( | ) | [inline, virtual] |
Reimplemented in CubitFacetEdgeData.
Definition at line 128 of file CubitFacetEdge.hpp.
{ return num_adj_facets(); }
| CubitStatus CubitFacetEdge::order_edge_list | ( | DLIList< CubitFacetEdge * > & | edge_list, |
| CubitPoint * | start_point, | ||
| CubitPoint *& | end_point | ||
| ) | [static] |
Definition at line 1143 of file CubitFacetEdge.cpp.
{
int i;
assert(start_point);
end_point = NULL;
// invalid input
if (0 == edge_list.size())
return CUBIT_FAILURE;
// simple case of a single edge - endpoitn
if (1 == edge_list.size())
{
end_point = edge_list.get()->other_point(start_point);
return end_point ? CUBIT_SUCCESS : CUBIT_FAILURE;
}
edge_list.reset();
// note that a periodic/closed curve will fail
// we could handle that case here if needed, but we may need more information
// to know where to start and end the curve
if (NULL == start_point)
return CUBIT_FAILURE;
// put edges in a set for faster searching
std::set<CubitFacetEdge *> edge_set;
for (i=0; i<edge_list.size(); i++)
edge_set.insert(dynamic_cast<CubitFacetEdge*> (edge_list.step_and_get()));
// a vector for the ordered list
std::vector<CubitFacetEdge*> ordered_edges;
// find connected edges from the start point
CubitPoint *cur_pt = start_point;
do
{
// get edges connected to the current point and find the next edge
DLIList<CubitFacetEdge *> pt_edges;
cur_pt->edges(pt_edges);
std::set<CubitFacetEdge *>::iterator iter_found;
CubitFacetEdge *cur_edge = NULL;
for (i=0; i<pt_edges.size() && !cur_edge; i++)
{
CubitFacetEdge *tmp_edge = pt_edges.get_and_step();
iter_found = edge_set.find(tmp_edge);
if ( iter_found != edge_set.end() )
cur_edge = tmp_edge;
}
// if we don't find a connection before we empty the set
// then not all the edges are connected -- return failure
if (NULL == cur_edge)
return CUBIT_FAILURE;
// add the edge to the ordered list
ordered_edges.push_back( cur_edge );
edge_set.erase(iter_found);
cur_pt = cur_edge->other_point(cur_pt);
}
while ( edge_set.size());
if (ordered_edges.size() != (size_t)edge_list.size())
return CUBIT_FAILURE;
// store the edges in the correct order
edge_list.clean_out();
std::vector<CubitFacetEdge*>::iterator iter;
for (iter=ordered_edges.begin(); iter!=ordered_edges.end(); iter++)
edge_list.append(*iter);
// get the end point
CubitFacetEdge *edge1 = edge_list[edge_list.size() - 1];
CubitFacetEdge *edge2 = edge_list[edge_list.size() - 2];
end_point = edge1->other_point( edge1->shared_point(edge2) );
return CUBIT_SUCCESS;
}
| CubitFacet * CubitFacetEdge::other_facet | ( | CubitFacet * | facet_ptr | ) |
Definition at line 773 of file CubitFacetEdge.cpp.
{
DLIList<CubitFacet *> cf_list;
facets( cf_list );
assert(cf_list.size() < 3);
CubitFacet *adj_facet = NULL;
if (cf_list.size() > 0)
{
adj_facet = cf_list.get_and_step();
if (adj_facet == facet_ptr)
{
if (cf_list.size() == 2)
{
adj_facet = cf_list.get();
}
}
}
return adj_facet;
}
| CubitFacet * CubitFacetEdge::other_facet_on_surf | ( | CubitFacet * | facet_ptr | ) |
Definition at line 802 of file CubitFacetEdge.cpp.
{
assert(facet_ptr != 0);
int tool_id = facet_ptr->tool_id();
DLIList<CubitFacet *> cf_list;
facets( cf_list );
CubitFacet *adj_facet = NULL;
int found = 0;
for (int ii=0; ii<cf_list.size() && !found; ii++)
{
adj_facet = cf_list.get_and_step();
if (adj_facet != facet_ptr)
{
if (adj_facet->tool_id() == tool_id)
found = 1;
}
}
if (!found)
adj_facet = NULL;
return adj_facet;
}
| CubitPoint * CubitFacetEdge::other_point | ( | CubitPoint * | point_ptr | ) |
| virtual CubitPoint* CubitFacetEdge::point | ( | int | index | ) | [pure virtual] |
Implemented in CubitFacetEdgeData.
| virtual void CubitFacetEdge::points | ( | DLIList< CubitPoint * > & | point_list | ) | [pure virtual] |
Implements FacetEntity.
Implemented in CubitFacetEdgeData.
| CubitVector CubitFacetEdge::position_from_fraction | ( | double | zero_to_one | ) |
Definition at line 731 of file CubitFacetEdge.cpp.
{
return (1.0 - f) * point(0)->coordinates() +
f * point(1)->coordinates();
}
| CubitStatus CubitFacetEdge::proj_to_line | ( | const CubitVector & | this_point, |
| CubitVector & | proj_point | ||
| ) |
Definition at line 620 of file CubitFacetEdge.cpp.
{
CubitStatus stat = CUBIT_SUCCESS;
CubitVector p0 = point(0)->coordinates();
CubitVector p1 = point(1)->coordinates();
CubitVector edge_vec( p0,p1 );
CubitVector point_vec( p0, this_point );
edge_vec.normalize();
double dist_on_edge = edge_vec % point_vec;
proj_point = p0 + (edge_vec * dist_on_edge);
return stat;
}
| virtual CubitStatus CubitFacetEdge::remove_facet | ( | CubitFacet * | ) | [pure virtual] |
Implemented in CubitFacetEdgeData.
| void CubitFacetEdge::set_as_feature | ( | ) | [inline] |
Definition at line 211 of file CubitFacetEdge.hpp.
{ isFeature = 1; }
| void CubitFacetEdge::set_control_points | ( | CubitPoint * | point_ptr, |
| CubitVector | ctrl_pts[3] | ||
| ) | [inline, virtual] |
Definition at line 304 of file CubitFacetEdge.hpp.
{
DLIList<CubitPoint*> my_points;
points(my_points);
if (point_ptr == my_points.get())
{
controlPoints[0] = ctrl_pts[0];
controlPoints[1] = ctrl_pts[1];
controlPoints[2] = ctrl_pts[2];
}
else if(point_ptr == my_points.next())
{
controlPoints[0] = ctrl_pts[2];
controlPoints[1] = ctrl_pts[1];
controlPoints[2] = ctrl_pts[0];
}
else
{
assert(0); // point_ptr does not match either point
}
}
| void CubitFacetEdge::set_control_points | ( | const double * | ctrl_pt_array | ) |
Definition at line 51 of file CubitFacetEdge.cpp.
{
int ii;
for (ii=0; ii<3; ii++)
{
controlPoints[ii].x( ctrl_pt_array[ii*3] );
controlPoints[ii].y( ctrl_pt_array[ii*3+1] );
controlPoints[ii].z( ctrl_pt_array[ii*3+2] );
}
}
| virtual void CubitFacetEdge::set_flag | ( | int | my_flag | ) | [inline, virtual] |
Definition at line 109 of file CubitFacetEdge.hpp.
{markedFlag = my_flag;};
| virtual void CubitFacetEdge::set_id | ( | int | ) | [inline, virtual] |
| CubitPoint * CubitFacetEdge::shared_point | ( | CubitFacetEdge * | edge_ptr | ) |
Definition at line 909 of file CubitFacetEdge.cpp.
{
CubitPoint *pA = this->point(0);
CubitPoint *pB = this->point(1);
CubitPoint *pC = edge_ptr->point(0);
CubitPoint *pD = edge_ptr->point(1);
CubitPoint *pShared = NULL;
if (pA == pC || pA == pD)
{
pShared = pA;
}
else if (pB == pC || pB == pD)
{
pShared = pB;
}
return pShared;
}
| virtual CubitPoint* CubitFacetEdge::start_node | ( | ) | [pure virtual] |
Implemented in CubitFacetEdgeData.
| void CubitFacetEdge::toggle_is_flipped | ( | ) | [inline] |
Definition at line 80 of file CubitFacetEdge.hpp.
| void CubitFacetEdge::tris | ( | DLIList< CubitFacet * > & | facet_list | ) | [inline] |
Definition at line 115 of file CubitFacetEdge.hpp.
{ facets(facet_list); }
| void CubitFacetEdge::tris | ( | int * | , |
| DLIList< CubitFacet * > & | facet_list | ||
| ) | [inline] |
Definition at line 116 of file CubitFacetEdge.hpp.
{ facets(facet_list); }
int CubitFacetEdge::bezierOrder [protected] |
Definition at line 47 of file CubitFacetEdge.hpp.
CubitVector CubitFacetEdge::controlPoints[3] [protected] |
Definition at line 44 of file CubitFacetEdge.hpp.
IttyBit CubitFacetEdge::isFeature [protected] |
Definition at line 53 of file CubitFacetEdge.hpp.
CubitBoolean CubitFacetEdge::isFlipped [protected] |
Definition at line 56 of file CubitFacetEdge.hpp.
int CubitFacetEdge::markedFlag [protected] |
Definition at line 50 of file CubitFacetEdge.hpp.