本文整理汇总了C++中ON_Curve::IsLinear方法的典型用法代码示例。如果您正苦于以下问题:C++ ON_Curve::IsLinear方法的具体用法?C++ ON_Curve::IsLinear怎么用?C++ ON_Curve::IsLinear使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ON_Curve
的用法示例。
在下文中一共展示了ON_Curve::IsLinear方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: pout
void
subbrep_planar_init(struct subbrep_object_data *data)
{
if (!data) return;
if (data->planar_obj) return;
BU_GET(data->planar_obj, struct subbrep_object_data);
subbrep_object_init(data->planar_obj, data->brep);
bu_vls_sprintf(data->planar_obj->key, "%s", bu_vls_addr(data->key));
data->planar_obj->obj_cnt = data->obj_cnt;
(*data->obj_cnt)++;
bu_vls_sprintf(data->planar_obj->name_root, "%s_%d", bu_vls_addr(data->name_root), *(data->obj_cnt));
data->planar_obj->type = PLANAR_VOLUME;
data->planar_obj->local_brep = ON_Brep::New();
std::map<int, int> face_map;
std::map<int, int> surface_map;
std::map<int, int> edge_map;
std::map<int, int> vertex_map;
std::map<int, int> loop_map;
std::map<int, int> c3_map;
std::map<int, int> c2_map;
std::map<int, int> trim_map;
std::set<int> faces;
std::set<int> fil;
std::set<int> loops;
std::set<int> skip_verts;
std::set<int> skip_edges;
std::set<int> keep_verts;
std::set<int> partial_edges;
std::set<int> isolated_trims; // collect 2D trims whose parent loops aren't fully included here
array_to_set(&faces, data->faces, data->faces_cnt);
array_to_set(&fil, data->fil, data->fil_cnt);
array_to_set(&loops, data->loops, data->loops_cnt);
std::map<int, std::set<int> > face_loops;
std::map<int, std::set<int> >::iterator fl_it;
std::set<int>::iterator l_it;
for (int i = 0; i < data->edges_cnt; i++) {
int c3i;
int new_edge_curve = 0;
const ON_BrepEdge *old_edge = &(data->brep->m_E[data->edges[i]]);
//std::cout << "old edge: " << old_edge->Vertex(0)->m_vertex_index << "," << old_edge->Vertex(1)->m_vertex_index << "\n";
// See if the vertices from this edge play a role in the planar volume
int use_edge = 2;
for (int vi = 0; vi < 2; vi++) {
int vert_test = -1;
int vert_ind = old_edge->Vertex(vi)->m_vertex_index;
if (skip_verts.find(vert_ind) != skip_verts.end()) {
vert_test = 1;
}
if (vert_test == -1 && keep_verts.find(vert_ind) != keep_verts.end()) {
vert_test = 0;
}
if (vert_test == -1) {
vert_test = characterize_vert(data, old_edge->Vertex(vi));
if (vert_test) {
skip_verts.insert(vert_ind);
ON_3dPoint vp = old_edge->Vertex(vi)->Point();
bu_log("vert %d (%f %f %f): %d\n", vert_ind, vp.x, vp.y, vp.z, vert_test);
} else {
keep_verts.insert(vert_ind);
}
}
if (vert_test == 1) {
use_edge--;
}
}
if (use_edge == 0) {
bu_log("skipping edge %d - both verts are skips\n", old_edge->m_edge_index);
skip_edges.insert(old_edge->m_edge_index);
continue;
}
if (use_edge == 1) {
bu_log("One of the verts for edge %d is a skip.\n", old_edge->m_edge_index);
partial_edges.insert(old_edge->m_edge_index);
continue;
}
// Get the 3D curves from the edges
if (c3_map.find(old_edge->EdgeCurveIndexOf()) == c3_map.end()) {
ON_Curve *nc = old_edge->EdgeCurveOf()->Duplicate();
ON_Curve *tc = old_edge->EdgeCurveOf()->Duplicate();
if (tc->IsLinear()) {
c3i = data->planar_obj->local_brep->AddEdgeCurve(nc);
c3_map[old_edge->EdgeCurveIndexOf()] = c3i;
} else {
ON_Curve *c3 = new ON_LineCurve(old_edge->Vertex(0)->Point(), old_edge->Vertex(1)->Point());
c3i = data->planar_obj->local_brep->AddEdgeCurve(c3);
c3_map[old_edge->EdgeCurveIndexOf()] = c3i;
new_edge_curve = 1;
}
} else {
c3i = c3_map[old_edge->EdgeCurveIndexOf()];
}
// Get the vertices from the edges
//.........这里部分代码省略.........
示例2: IsIsoparametric
ON_Surface::ISO
ON_Surface::IsIsoparametric( const ON_Curve& curve, const ON_Interval* subdomain ) const
{
ISO iso = not_iso;
if ( subdomain )
{
ON_Interval cdom = curve.Domain();
double t0 = cdom.NormalizedParameterAt(subdomain->Min());
double t1 = cdom.NormalizedParameterAt(subdomain->Max());
if ( t0 < t1-ON_SQRT_EPSILON )
{
if ( (t0 > ON_SQRT_EPSILON && t0 < 1.0-ON_SQRT_EPSILON) || (t1 > ON_SQRT_EPSILON && t1 < 1.0-ON_SQRT_EPSILON) )
{
cdom.Intersection(*subdomain);
if ( cdom.IsIncreasing() )
{
ON_NurbsCurve nurbs_curve;
if ( curve.GetNurbForm( nurbs_curve, 0.0,&cdom) )
{
return IsIsoparametric( nurbs_curve, 0 );
}
}
}
}
}
ON_BoundingBox bbox;
double tolerance = 0.0;
const int dim = curve.Dimension();
if ( (dim == 2 || dim==3) && curve.GetBoundingBox(bbox) )
{
iso = IsIsoparametric( bbox );
switch (iso) {
case x_iso:
case W_iso:
case E_iso:
// make sure curve is a (nearly) vertical line
// and weed out vertical scribbles
tolerance = bbox.m_max.x - bbox.m_min.x;
if ( tolerance < ON_ZERO_TOLERANCE && ON_ZERO_TOLERANCE*1024.0 <= (bbox.m_max.y-bbox.m_min.y) )
{
// 26 March 2007 Dale Lear
// If tolerance is tiny, then use ON_ZERO_TOLERANCE
// This fixes cases where iso curves where not getting
// the correct flag because tol=1e-16 and the closest
// point to line had calculation errors of 1e-15.
tolerance = ON_ZERO_TOLERANCE;
}
if ( !curve.IsLinear( tolerance ) )
iso = not_iso;
break;
case y_iso:
case S_iso:
case N_iso:
// make sure curve is a (nearly) horizontal line
// and weed out horizontal scribbles
tolerance = bbox.m_max.y - bbox.m_min.y;
if ( tolerance < ON_ZERO_TOLERANCE && ON_ZERO_TOLERANCE*1024.0 <= (bbox.m_max.x-bbox.m_min.x) )
{
// 26 March 2007 Dale Lear
// If tolerance is tiny, then use ON_ZERO_TOLERANCE
// This fixes cases where iso curves where not getting
// the correct flag because tol=1e-16 and the closest
// point to line had calculation errors of 1e-15.
tolerance = ON_ZERO_TOLERANCE;
}
if ( !curve.IsLinear( tolerance ) )
iso = not_iso;
break;
default:
// nothing here
break;
}
}
return iso;
}
示例3: GetSurfaceType
// Criteria:
//
// 1. A linear edge associated with a planar face == 0
// 2. All linear edges associated with non-planar faces are part
// of the same CSG shape AND all non-linear edges' non-planar faces
// are also part of that same CSG shape = 1
// 3. If not 2, 0
int
characterize_vert(struct subbrep_object_data *data, const ON_BrepVertex *v)
{
std::set<int> non_planar_faces;
std::set<int>::iterator f_it;
std::set<struct filter_obj *> fobjs;
std::set<struct filter_obj *>::iterator fo_it;
struct filter_obj *control = NULL;
for (int i = 0; i < v->m_ei.Count(); i++) {
std::set<int> efaces;
const ON_BrepEdge *edge = &(data->brep->m_E[v->m_ei[i]]);
ON_Curve *tc = edge->EdgeCurveOf()->Duplicate();
int is_linear = tc->IsLinear();
delete tc;
// Get the faces associated with the edge
for (int j = 0; j < edge->TrimCount(); j++) {
ON_BrepTrim *trim = edge->Trim(j);
efaces.insert(trim->Face()->m_face_index);
}
for(f_it = efaces.begin(); f_it != efaces.end(); f_it++) {
struct filter_obj *new_obj;
BU_GET(new_obj, struct filter_obj);
surface_t stype = GetSurfaceType(data->brep->m_F[*f_it].SurfaceOf(), new_obj);
if (stype == SURFACE_PLANE) {
filter_obj_free(new_obj);
BU_PUT(new_obj, struct filter_obj);
if (is_linear) {
for (fo_it = fobjs.begin(); fo_it != fobjs.end(); fo_it++) {
struct filter_obj *obj = (struct filter_obj *)(*fo_it);
filter_obj_free(obj);
BU_PUT(obj, struct filter_obj);
}
return 0;
}
} else {
if (!control) {
control = new_obj;
} else {
fobjs.insert(new_obj);
}
}
}
}
// Can this happen?
if (fobjs.size() == 0) {
if (control) {
filter_obj_free(control);
BU_PUT(control, struct filter_obj);
}
return 0;
}
int equal = 1;
for(fo_it = fobjs.begin(); fo_it != fobjs.end(); fo_it++) {
if (equal && !filter_objs_equal(*fo_it, control)) equal = 0;
struct filter_obj *obj = (struct filter_obj *)(*fo_it);
filter_obj_free(obj);
BU_PUT(obj, struct filter_obj);
}
filter_obj_free(control);
BU_PUT(control, struct filter_obj);
return equal;
}