本文整理汇总了C++中ON_Plane类的典型用法代码示例。如果您正苦于以下问题:C++ ON_Plane类的具体用法?C++ ON_Plane怎么用?C++ ON_Plane使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了ON_Plane类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ON_Curve_AreaMassProperties
RH_C_FUNCTION ON_MassProperties* ON_Curve_AreaMassProperties(const ON_Curve* pCurve, double rel_tol, double abs_tol, double curve_planar_tol)
{
ON_MassProperties* rc = NULL;
if( pCurve )
{
ON_Plane plane;
if( pCurve->IsPlanar(&plane, curve_planar_tol) && pCurve->IsClosed() )
{
ON_BoundingBox bbox = pCurve->BoundingBox();
ON_3dPoint basepoint = bbox.Center();
basepoint = plane.ClosestPointTo(basepoint);
rc = new ON_MassProperties();
bool getresult = pCurve->AreaMassProperties(basepoint, plane.Normal(), *rc, true, true, true, true, rel_tol, abs_tol);
if( getresult )
{
rc->m_mass = fabs(rc->m_mass);
}
else
{
delete rc;
rc = NULL;
}
}
}
return rc;
}
示例2: Create
bool ON_Circle::Create( const ON_3dPoint& C, double r )
{
ON_Plane p = ON_xy_plane;
p.origin = C;
p.UpdateEquation();
return Create( p, r );
}
示例3: Create
bool ON_Arc::Create( // arc is parallel to XY plane
const ON_3dPoint& center, // center
double r, // radius
double angle_radians // angle in radians
)
{
ON_Plane p;
p.CreateFromNormal( center, ON_zaxis );
return Create( ON_Circle(p,r), ON_Interval( 0.0, angle_radians ) );
}
示例4: CreatePseudoInfinitePlane
bool ON_PlaneSurface::CreatePseudoInfinitePlane(
const ON_Plane& plane,
int point_count,
const ON_3dPoint* point_list,
double padding
)
{
if ( !plane.IsValid() )
return false;
if ( point_count < 1 )
return false;
if ( 0 == point_list )
return false;
if ( !ON_IsValid(padding) || padding < 0.0 )
return false;
ON_Interval plane_domain[2];
double s, t;
s = ON_UNSET_VALUE;
t = ON_UNSET_VALUE;
if ( !plane.ClosestPointTo( point_list[0], &s, &t ) || !ON_IsValid(s) || !ON_IsValid(t) )
return 0;
plane_domain[0].m_t[1] = plane_domain[0].m_t[0] = s;
plane_domain[1].m_t[1] = plane_domain[1].m_t[0] = t;
for ( int i = 1; i < point_count; i++ )
{
s = ON_UNSET_VALUE;
t = ON_UNSET_VALUE;
if ( !plane.ClosestPointTo( point_list[i], &s, &t ) || !ON_IsValid(s) || !ON_IsValid(t) )
return 0;
if ( s < plane_domain[0].m_t[0] ) plane_domain[0].m_t[0] = s; else if ( s > plane_domain[0].m_t[1] ) plane_domain[0].m_t[1] = s;
if ( t < plane_domain[1].m_t[0] ) plane_domain[1].m_t[0] = t; else if ( t > plane_domain[1].m_t[1] ) plane_domain[1].m_t[1] = t;
}
s = padding*plane_domain[0].Length() + padding;
if ( !(s > 0.0) && !plane_domain[0].IsIncreasing() )
s = 1.0;
plane_domain[0].m_t[0] -= s;
plane_domain[0].m_t[1] += s;
t = padding*plane_domain[1].Length() + padding;
if ( !(t > 0.0) && !plane_domain[1].IsIncreasing() )
t = 1.0;
plane_domain[1].m_t[0] -= t;
plane_domain[1].m_t[1] += t;
m_plane = plane;
m_domain[0] = plane_domain[0];
m_domain[1] = plane_domain[1];
m_extents[0] = plane_domain[0];
m_extents[1] = plane_domain[1];
return IsValid()?true:false;
}
示例5: ON_Geometry_AreaMassProperties
RH_C_FUNCTION ON_MassProperties* ON_Geometry_AreaMassProperties(const ON_SimpleArray<const ON_Geometry*>* pConstGeometryArray, double relativeTolerance, double absoluteTolerance)
{
ON_MassProperties* rc = NULL;
if( pConstGeometryArray && pConstGeometryArray->Count() > 0 )
{
ON_BoundingBox bbox;
for( int i = 0; i < pConstGeometryArray->Count(); i++ )
{
const ON_Geometry* geo = (*pConstGeometryArray)[i];
if( NULL==geo )
continue;
geo->GetBoundingBox(bbox,TRUE);
}
ON_3dPoint basepoint = bbox.Center();
// Aggregate all mass properties
for( int i = 0; i < pConstGeometryArray->Count(); i++ )
{
const ON_Geometry* geo = (*pConstGeometryArray)[i];
if( NULL==geo )
continue;
bool success = false;
ON_MassProperties mp;
const ON_Brep* pBrep = ON_Brep::Cast(geo);
if( pBrep )
success = pBrep->AreaMassProperties(mp, true, true, true, true, relativeTolerance, absoluteTolerance);
const ON_Surface* pSurface = success?0:ON_Surface::Cast(geo);
if( pSurface )
success = pSurface->AreaMassProperties(mp, true, true, true, true, relativeTolerance, absoluteTolerance);
const ON_Mesh* pMesh = success?0:ON_Mesh::Cast(geo);
if( pMesh )
success = pMesh->AreaMassProperties(mp, true, true, true, true);
const ON_Curve* pCurve = success?0:ON_Curve::Cast(geo);
ON_Plane plane;
if( pCurve && pCurve->IsPlanar(&plane, absoluteTolerance) && pCurve->IsClosed() )
success = pCurve->AreaMassProperties(basepoint, plane.Normal(), mp, true, true, true, true, relativeTolerance, absoluteTolerance);
if( success )
{
if( NULL==rc )
rc = new ON_MassProperties(mp);
else
rc->Sum(1, &mp, true);
}
}
}
return rc;
}
示例6: fabs
ON_BOOL32
ON_LineCurve::IsInPlane(
const ON_Plane& plane, // plane to test
double tolerance // tolerance to use when checking linearity
) const
{
ON_BOOL32 rc = false;
double d = fabs( plane.DistanceTo( PointAtStart() ));
if ( d <= tolerance ) {
d = fabs( plane.DistanceTo( PointAtEnd() ));
if ( d <= tolerance )
rc = true;
}
return rc;
}
示例7: FrameAt
ON_BOOL32 ON_Surface::FrameAt( double u, double v, ON_Plane& frame) const
{
ON_BOOL32 rc = false;
ON_3dPoint origin;
ON_3dVector udir, vdir, normal;
if( EvNormal( u, v, origin, udir, vdir, normal))
{
if ( udir.Unitize() )
vdir = ON_CrossProduct( normal, udir);
else if ( vdir.Unitize() )
udir = ON_CrossProduct( vdir, normal);
frame.CreateFromFrame( origin, udir, vdir);
rc = frame.IsValid();
}
return rc;
}
示例8: MakeNormalPlane
void COrientOnCrvXform::MakeNormalPlane( const ON_3dPoint origin, const ON_3dVector& normal, ON_Plane& plane )
{
plane.origin = origin;
ON_3dVector up( normal.x, normal.y, normal.z + 1.0 );
plane.xaxis = ON_CrossProduct( up, normal );
if( plane.xaxis.IsTiny() )
{
if( normal.z < 0.0 )
{
plane.xaxis = ON_3dVector( 1.0, 0.0, 0.0 );
plane.yaxis = ON_3dVector( 0.0, -1.0, 0.0 );
}
else
{
plane.xaxis = ON_3dVector( 1.0, 0.0, 0.0 );
plane.yaxis = ON_3dVector( 0.0, 1.0, 0.0 );
}
}
else
{
plane.xaxis.Unitize();
plane.yaxis = ON_CrossProduct( normal, plane.xaxis );
plane.yaxis.Unitize();
}
plane.UpdateEquation();
}
示例9: GetBasePlane
CRhinoCommand::result CCommandSampleOrientOnCrv::GetBasePlane( ON_Plane& base_plane )
{
CRhinoGetPoint get;
get.SetCommandPrompt( L"Base point" );
get.AcceptNothing();
get.GetPoint();
CRhinoCommand::result rc = get.CommandResult();
if( rc == CRhinoCommand::success )
{
base_plane = get.View()->Viewport().ConstructionPlane().m_plane;
base_plane.origin = get.Point();
base_plane.UpdateEquation();
if( !base_plane.IsValid() )
rc = CRhinoCommand::cancel;
}
return rc;
}
示例10: GetRotation
bool ON_Quaternion::GetRotation(ON_Plane& plane) const
{
plane.xaxis.x = a*a + b*b - c*c - d*d;
plane.xaxis.y = 2.0*(a*d + b*c);
plane.xaxis.z = 2.0*(b*d - a*c);
plane.yaxis.x = 2.0*(b*c - a*d);
plane.yaxis.y = a*a - b*b + c*c - d*d;
plane.yaxis.z = 2.0*(a*b + c*d);
plane.zaxis.x = 2.0*(a*c + b*d);
plane.zaxis.y = 2.0*(c*d - a*b);
plane.zaxis.z = a*a - b*b - c*c + d*d;
plane.xaxis.Unitize();
plane.yaxis.Unitize();
plane.zaxis.Unitize();
plane.origin.Set(0.0,0.0,0.0);
plane.UpdateEquation();
return plane.IsValid();
}
示例11: UpdateData
void CTestPreviewDialog::OnBnClickedPreview()
{
UpdateData( TRUE );
ON_3dPoint point( m_center_x, m_center_y, m_center_z );
ON_Plane plane = ON_xy_plane;
plane.SetOrigin( point );
ON_Circle circle( plane, m_radius );
if( circle.IsValid() )
{
m_preview.m_circle = circle;
if( !m_preview.IsEnabled() )
m_preview.Enable();
CRhinoDoc* doc = RhinoApp().ActiveDoc();
if( doc )
doc->Regen();
}
}
示例12: ON_Intersect
int ON_Intersect( // returns 0 = no intersections,
// 1 = intersection = single point,
// 2 = intersection = circle
// If 0 is returned, returned circle has radius=0
// and center = point on sphere closest to plane.
// If 1 is returned, intersection is a single
// point and returned circle has radius=0
// and center = intersection point on sphere.
const ON_Plane& plane, const ON_Sphere& sphere, ON_Circle& circle
)
{
int rc = 0;
const ON_3dPoint sphere_center = sphere.plane.origin;
const double sphere_radius = fabs(sphere.radius);
double tol = sphere_radius*ON_SQRT_EPSILON;
if ( tol < ON_ZERO_TOLERANCE )
tol = ON_ZERO_TOLERANCE;
circle.plane = plane;
ON_3dPoint plane_center = plane.ClosestPointTo(sphere_center);
double d = plane_center.DistanceTo(sphere_center);
if ( d >= sphere_radius-tol ) {
rc = ( d <= sphere_radius-tol ) ? 1 : 0;
circle.plane.origin = sphere.ClosestPointTo(plane_center);
circle.plane.UpdateEquation();
circle.radius = 0.0;
}
else {
d /= sphere_radius;
circle.radius = sphere_radius*sqrt(1.0 - d*d);
if ( circle.radius <= ON_ZERO_TOLERANCE ) {
circle.radius = 0.0;
rc = 1;
}
else
rc = 2;
}
//circle.UpdatePoints();
return rc;
}
示例13: InPlane
bool ON_Line::InPlane( ON_Plane& plane, double tolerance ) const
{
const ON_3dVector v = to-from;
const bool bTinyX = fabs(v.x) <= tolerance;
const bool bTinyY = fabs(v.y) <= tolerance;
const bool bTinyZ = fabs(v.z) <= tolerance;
bool rc = true;
ON_3dVector X;
ON_3dVector Y;
if ( bTinyZ && ( !bTinyX || !bTinyY ) )
{
X = ON_xaxis;
Y = ON_yaxis;
}
else if ( bTinyX && ( !bTinyY || !bTinyZ ) )
{
X = ON_yaxis;
Y = ON_zaxis;
}
else if ( bTinyY && ( !bTinyZ || !bTinyX ) )
{
X = ON_zaxis;
Y = ON_xaxis;
}
else
{
X = v;
X.Unitize();
Y.PerpendicularTo(X);
if ( bTinyX && bTinyY && bTinyZ )
{
rc = false;
if ( X.IsZero() )
{
X = ON_xaxis;
Y = ON_yaxis;
}
}
}
plane.CreateFromFrame( from, X, Y );
return rc;
}
示例14: Morph
bool ON_Plane::Morph( const ON_SpaceMorph& morph )
{
ON_Plane mp;
double s = sqrt( fabs(origin.MaximumCoordinate())*ON_SQRT_EPSILON + ON_ZERO_TOLERANCE );
mp.xaxis = morph.MorphVector(origin,s*xaxis);
mp.yaxis = morph.MorphVector(origin,s*yaxis);
mp.zaxis = morph.MorphVector(origin,s*zaxis);
origin = morph.MorphPoint(origin);
UpdateEquation();
bool bx = mp.xaxis.Unitize();
bool by = mp.yaxis.Unitize();
bool bz = mp.zaxis.Unitize();
if (!bx)
{
mp.xaxis = ON_CrossProduct(mp.yaxis,mp.zaxis);
bx = mp.xaxis.Unitize();
}
if (!by)
{
mp.yaxis = ON_CrossProduct(mp.zaxis,mp.xaxis);
by = mp.yaxis.Unitize();
}
if (!bz)
{
mp.zaxis = ON_CrossProduct(mp.xaxis,mp.yaxis);
bz = mp.zaxis.Unitize();
}
mp.origin.Set(0.0,0.0,0.0);
mp.UpdateEquation();
bool rc = mp.IsValid();
ON_3dVector x, y, z;
if ( rc )
{
x = mp.xaxis;
y = mp.yaxis;
z = mp.zaxis;
}
else
{
x = ON_CrossProduct(mp.yaxis,mp.zaxis);
y = ON_CrossProduct(mp.zaxis,mp.xaxis);
z = ON_CrossProduct(mp.xaxis,mp.yaxis);
x.Unitize();
y.Unitize();
z.Unitize();
x = mp.xaxis + x;
y = mp.yaxis + y;
z = mp.zaxis + z;
x.Unitize();
y.Unitize();
z.Unitize();
rc = mp.CreateFromFrame(ON_origin,x,y);
if (rc)
{
x = mp.xaxis;
y = mp.yaxis;
z = mp.zaxis;
}
else
{
rc = mp.CreateFromFrame(ON_origin,y,z);
if ( rc )
{
y = mp.xaxis;
z = mp.yaxis;
x = mp.zaxis;
}
else
{
rc = mp.CreateFromFrame(ON_origin,z,x);
if (rc)
{
z = mp.xaxis;
x = mp.yaxis;
y = mp.zaxis;
}
else
{
rc = mp.CreateFromNormal(ON_origin,z);
if (rc)
{
x = mp.xaxis;
y = mp.yaxis;
z = mp.zaxis;
}
}
}
}
}
if (rc)
{
xaxis = x;
yaxis = y;
zaxis = z;
UpdateEquation();
}
return rc;
//.........这里部分代码省略.........
示例15: ON_ArePointsOnPlane
int ON_ArePointsOnPlane( // returns 0=no, 1 = yes, 2 = pointset is (to tolerance) a single point on the line
int dim, // 2 or 3
int is_rat,
int count,
int stride, const double* point,
const ON_BoundingBox& bbox, // if needed, use ON_GetBoundingBox(dim,is_rat,count,stride,point)
const ON_Plane& plane, // line to test
double tolerance
)
{
double w;
int i, j, k;
if ( count < 1 )
return 0;
if ( !plane.IsValid() )
{
ON_ERROR("plane parameter is not valid");
return 0;
}
if ( !bbox.IsValid() )
{
ON_ERROR("bbox parameter is not valid");
return 0;
}
if ( !ON_IsValid(tolerance) || tolerance < 0.0 )
{
ON_ERROR("tolerance must be >= 0.0");
return 0;
}
if ( dim < 2 || dim > 3 )
{
ON_ERROR("dim must be 2 or 3");
return 0;
}
if ( stride < (is_rat?(dim+1):dim) )
{
ON_ERROR("stride parameter is too small");
return 0;
}
if ( 0 == point )
{
ON_ERROR("point parameter is null");
return 0;
}
int rc = 0;
if ( tolerance == 0.0 ) {
tolerance = bbox.Tolerance();
}
ON_3dPoint Q;
// test bounding box to quickly detect the common coordinate axis cases
rc = (count == 1 || bbox.Diagonal().Length() <= tolerance) ? 2 : 1;
for ( i = 0; rc && i < 2; i++ ) {
Q.x = bbox[i].x;
for ( j = 0; rc && j < 2; j++) {
Q.y = bbox[j].y;
for ( k = 0; rc && k < 2; k++) {
Q.z = bbox[k].z;
if ( Q.DistanceTo( plane.ClosestPointTo( Q ) ) > tolerance )
rc = 0;
}
}
}
if ( !rc ) {
// test points one by one
Q.Zero();
rc = (count == 1 || bbox.Diagonal().Length() <= tolerance) ? 2 : 1;
if ( is_rat ) {
for ( i = 0; i < count; i++ ) {
w = point[dim];
if ( w == 0.0 ) {
ON_ERROR("rational point has zero weight");
return 0;
}
ON_ArrayScale( dim, 1.0/w, point, &Q.x );
if ( Q.DistanceTo( plane.ClosestPointTo( Q ) ) > tolerance ) {
rc = 0;
break;
}
point += stride;
}
}
else {
for ( i = 0; i < count; i++ ) {
memcpy( &Q.x, point, dim*sizeof(Q.x) );
if ( Q.DistanceTo( plane.ClosestPointTo( Q ) ) > tolerance ) {
rc = 0;
break;
}
point += stride;
}
}
}
return rc;
//.........这里部分代码省略.........