void cone::grow_extent( extent& e) { if (degenerate()) return; e.add_circle( pos, axis.norm(), radius ); e.add_point( pos + axis); e.add_body(); }
void cylinder::grow_extent( extent& e) { if (degenerate()) return; vector a = axis.norm(); e.add_circle(pos, a, radius); e.add_circle(pos+axis, a, radius); e.add_body(); }
void faces::grow_extent( extent& world) { const double* pos_i = pos.data(); const double* pos_end = pos.data( count - count%3 ); while (pos_i < pos_end) { world.add_point( vector(pos_i)); pos_i += 3; // 3 doubles per vector point } world.add_body(); }
void ellipsoid::grow_extent( extent& world) { if (degenerate()) return; //world.add_sphere( pos, std::max( width, std::max( height, axis.mag()))); // TODO: not accurate (overestimates extent) vector s = vector(axis.mag(),height,width)*0.5; world.add_box( model_world_transform(1.0), -s, s ); world.add_body(); }
void arrow::grow_extent( extent& world) { if (degenerate()) return; double hl, hw, len, sw; effective_geometry( hw, sw, len, hl, 1.0); vector x = axis.cross(up).norm() * 0.5; vector y = axis.cross(x).norm() * 0.5; vector base = pos + axis.norm()*(len-hl); for(int i=-1; i<=+1; i+=2) for(int j=-1; j<=+1; j+=2) { world.add_point( pos + x*(i*sw) + y*(j*sw) ); world.add_point( base + x*(i*hw) + y*(j*hw) ); } world.add_point( pos + axis); world.add_body(); }
void convex::grow_extent( extent& world) { if (degenerate()) return; long check = checksum(); if (check != last_checksum) { recalc(); } assert( hull.size() != 0); for (std::vector<face>::const_iterator f = hull.begin(); f != hull.end(); ++f) { world.add_point( f->corner[0]); world.add_point( f->corner[1]); world.add_point( f->corner[2]); } world.add_body(); }
void sphere::grow_extent( extent& e) { e.add_sphere( pos, radius); e.add_body(); }