/* $NoKeywords: $ */ /* // // Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved. // OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert // McNeel & Associates. // // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. // ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF // MERCHANTABILITY ARE HEREBY DISCLAIMED. // // For complete openNURBS copyright information see . // //////////////////////////////////////////////////////////////// */ #if !defined(ON_PLANE_INC_) #define ON_PLANE_INC_ class ON_CLASS ON_Plane { public: /* Description: The default constructor creates a plane with orgin=(0,0,0), xaxis=(1,0,0), yaxis=(0,1,0) zaxis=(0,0,1), and equation=(0,0,1,0). */ ON_Plane(); /* Description: Construct a plane from a point and normal vector. Parameters: origin - [in] point on the plane normal - [in] non-zero normal to the plane Remarks: origin = point, zaxis = unitized normal, xaxis xaxis set with xaxis.PerpindicularTo(zaxis). See Also: ON_Plane::CreateFromNormal */ ON_Plane( const ON_3dPoint& origin, const ON_3dVector& normal ); /* Description: Construct a plane from a point, and two vectors in the plane. Parameters: origin - [in] point on the plane x_dir - [in] non-zero vector in the plane that determines the xaxis direction. y_dir - [in] non-zero vector not parallel to x_dir that is used to determine the yaxis direction. y_dir does not have to be perpendicular to x_dir. */ ON_Plane( const ON_3dPoint& origin, const ON_3dVector& x_dir, const ON_3dVector& y_dir ); /* Description: Construct a plane from three non-colinear points. Parameters: origin - [in] point on the plane x_point - [in] second point in the plane. The xaxis will be parallel to x_point-origin. y_point - [in] third point on the plane that is not colinear with the first two points. yaxis*(y_point-origin) will be > 0. */ ON_Plane( const ON_3dPoint& origin, const ON_3dPoint& x_point, const ON_3dPoint& y_point ); /* Description: Construct a plane from an equation. Parameters: equation - [in] an array of 4 doubles with one of equation[0], equation[1], or equation[2] being non-zero. */ ON_Plane( const double equation[4] ); ~ON_Plane(); bool operator==(const ON_Plane&) const; bool operator!=(const ON_Plane&) const; /* Description: Create a plane from a point and normal vector. Parameters: origin - [in] point on the plane normal - [in] non-zero normal to the plane Remarks: origin = point, zaxis = unitized normal, xaxis xaxis set with xaxis.PerpindicularTo(zaxis). Returns: true if valid plane is created. */ bool CreateFromNormal( const ON_3dPoint& origin, const ON_3dVector& normal ); /* Description: Construct a plane from a point, and two vectors in the plane. Parameters: origin - [in] point on the plane x_dir - [in] non-zero vector in the plane that determines the xaxis direction. y_dir - [in] non-zero vector not parallel to x_dir that is used to determine the yaxis direction. y_dir does not have to be perpendicular to x_dir. Returns: true if valid plane is created. */ bool CreateFromFrame( const ON_3dPoint& origin, const ON_3dVector& x_dir, const ON_3dVector& y_dir ); /* Description: Construct a plane from three non-colinear points. Parameters: origin - [in] point on the plane point_on_x - [in] second point in the plane. The xaxis will be parallel to x_point-origin. point_on - [in] third point on the plane that is not colinear with the first two points. yaxis*(y_point-origin) will be > 0. Returns: true if valid plane is created. */ bool CreateFromPoints( const ON_3dPoint& origin, const ON_3dPoint& point_on_x, const ON_3dPoint& point_on ); /* Description: Construct a plane from an equation. Parameters: equation - [in] an array of 4 doubles with one of equation[0], equation[1], or equation[2] being non-zero. Remarks: points on the plane will satisfy x*equation[0] +y*equation[1] + z*equation[2] + equation[3] = 0 Returns: true if valid plane is created. */ bool CreateFromEquation( const double equation[4] ); /* Description: Test plane to see if it is valid. Returns: true if all fields contain reasonable information and equation jibes with point and zaxis. */ bool IsValid() const; /* Returns: Plane origin. */ const ON_3dPoint& Origin() const; /* Returns: Plane unit x-axis. */ const ON_3dVector& Xaxis() const; /* Returns: Plane unit y-axis. */ const ON_3dVector& Yaxis() const; /* Returns: Plane unit normal. */ const ON_3dVector& Normal() const; /* Description: Set the origin and update the plane equation Parameters: origin - [in] the new origin */ void SetOrigin( const ON_3dPoint& origin ); /* Description: Evaluate a point on the plane Parameters: u - [in] v - [in] evaulation parameters Returns: plane.origin + u*plane.xaxis + v*plane.yaxis */ ON_3dPoint PointAt( double u, double v ) const; /* Description: Evaluate a point on the plane Parameters: u - [in] v - [in] evaluation parameters w - [in] elevation parameter Returns: plane.origin + u*plane.xaxis + v*plane.yaxis + z*plane.zaxis */ ON_3dPoint PointAt( double u, double v, double w ) const; /* Description: Get an isoparameteric line on the plane. Parameters: dir - [in] direction of iso-parametric line 0: first parameter varies and second parameter is constant e.g., line(t) = plane(t,c) 1: first parameter is constant and second parameter varies e.g., line(t) = plane(c,t) c - [in] value of constant parameter Returns: iso-parametric line */ ON_Line IsoLine( int dir, double c ) const; /* Description: Get signed distance from the plane to a point. Parameters: point - [in] Returns: Signed distance from a point to a plane. Remarks: If the point is on the plane, the distance is 0. If the point is above the plane, the distance is > 0. If the point is below the plane the distance is < 0. The zaxis determines the plane's orientation. */ double DistanceTo( const ON_3dPoint& point ) const; bool GetDistanceToBoundingBox( //returns false if plane has zero length normal const ON_BoundingBox&, // Box //output double* min, // min signed dist from plane to box double* max //max signed dist from plane to box ) const; /* Description: Update the plane equation based on the current values of the origin and zaxis. Returns: true if successful. false if zaxis is zero. Remarks: If you modify a plane's origin or zaxis, call UpdateEquation() to set equation[]. */ bool UpdateEquation(); /* Description: Get point on plane that is closest to a given point. Parameters: world_point - [in] 3d point u - [out] v - [out] The point ON_Plane::PointAt(*u,*v) is the point on the plane that is closest to world_point. Returns: true if successful. */ bool ClosestPointTo( ON_3dPoint world_point, double* u, double* v ) const; /* Description: Get point on plane that is closest to a given point. Parameters: point - [in] Returns: A 3d point on the plane that is closest to world_point. */ ON_3dPoint ClosestPointTo( ON_3dPoint point ) const; // For intersections see ON_Intersect(); /* Description: Transform plane. Parameters: xform - [in] transformation to apply to plane Returns: true if successful */ bool Transform( const ON_Xform& xform ); /* Description: Transform a plane by swapping coordinates. Parameters: i - [in] j - [in] indices of coordinates to swap. 0 = x coordinate, 1 = y coordinate, 2 = z coordinate. Returns: true if successful. */ bool SwapCoordinates( int i, int j ); /* Description: Rotate a plane about its origin. Parameters: sin_angle - [in] sine of rotation angle cos_angle - [in] cosine of rotation angle axis - [in] axis of rotation Returns: true if successful */ bool Rotate( double sin_angle, double cos_angle, const ON_3dVector& axis ); /* Description: Rotate a plane about its origin. Parameters: angle - [in] rotation angle in radians axis - [in] axis of rotation Returns: true if successful */ bool Rotate( double angle, const ON_3dVector& axis ); /* Description: Rotate a plane about a point. Parameters: sin_angle - [in] sine of rotation angle cos_angle - [in] cosine of rotation angle axis - [in] axis of rotation center - [in] center of rotation Returns: true if successful */ bool Rotate( double sin_angle, double cos_angle, const ON_3dVector& axis, const ON_3dPoint& center ); /* Description: Rotate a plane about a point. Parameters: angle - [in] rotation angle in radians axis - [in] axis of rotation center - [in] center of rotation Returns: true if successful */ bool Rotate( double angle, const ON_3dVector& axis, const ON_3dPoint& center ); /* Description: Translate a plane. Parameters: delta - [in] translation vector Returns: true if successful */ bool Translate( const ON_3dVector& delta ); /* Description: Flip plane orientation by swapping x and y axes, reversing the zaxis, and updating the equation. Returns: true if successful */ bool Flip(); // world plane coordinate system ON_Plane(ON_origin, ON_xaxis, ON_yaxis); const static ON_Plane World_xy; public: // origin of plane ON_3dPoint origin; // unit X axis of plane ON_3dVector xaxis; // unit Y axis of plane ON_3dVector yaxis; // unit Z axis of plane ON_3dVector zaxis; // equation of plane ON_PlaneEquation plane_equation; //double equation[4]; }; class ON_CLASS ON_ClippingPlaneInfo { public: // C++ defaults for construction, destruction, copy construction // and operator= work fine. // A point is visible if m_plane_equation.ValueAt(point) <= 0. // (This is the opposite convention from what OpenGL uses.) ON_PlaneEquation m_plane_equation; ON_UUID m_plane_id; bool m_bEnabled; void Default(); bool Write( ON_BinaryArchive& ) const; bool Read( ON_BinaryArchive& ); }; class ON_CLASS ON_ClippingPlane { public: ON_ClippingPlane(); ~ON_ClippingPlane(); void Default(); ON_Plane m_plane; ON_UuidList m_viewport_ids; //ids of viewports that this clipping plane "clips" ON_UUID m_plane_id; bool m_bEnabled; // true if this clipping plane is active ON_ClippingPlaneInfo ClippingPlaneInfo() const; bool Read( class ON_BinaryArchive& ); bool Write( class ON_BinaryArchive& ) const; }; #if defined(ON_DLL_TEMPLATE) // This stuff is here because of a limitation in the way Microsoft // handles templates and DLLs. See Microsoft's knowledge base // article ID Q168958 for details. #pragma warning( push ) #pragma warning( disable : 4231 ) ON_DLL_TEMPLATE template class ON_CLASS ON_SimpleArray; ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray; ON_DLL_TEMPLATE template class ON_CLASS ON_SimpleArray; #pragma warning( pop ) #endif extern ON_EXTERN_DECL const ON_Plane ON_xy_plane; extern ON_EXTERN_DECL const ON_Plane ON_yz_plane; extern ON_EXTERN_DECL const ON_Plane ON_zx_plane; /* Description: Get a convex hull of a set of 3d points. Parameters: points - [in] List of points. This function can handle tens of points but is too slow for hundreds of points. hull -[out] Equations of the sides of the convex hull are appended to this list. A point P is inside the hull if hull[i].ValueAt(P) <= 0 for every plane equation. Returns: Number of equations appended to hull[] array. If 0, then the points are coincident or colinear. If 2, then the points are coplanar and the returned planes are parallel. If >= 4, then the points are in a 3d convex hull. */ ON_DECL int ON_Get3dConvexHull( const ON_SimpleArray & points, ON_SimpleArray & hull ); #endif