Changeset View
Changeset View
Standalone View
Standalone View
extern/opennurbs/opennurbs_xform.h
- This file was added.
| /* $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 <http://www.opennurbs.org>. | |||||
| // | |||||
| //////////////////////////////////////////////////////////////// | |||||
| */ | |||||
| //////////////////////////////////////////////////////////////// | |||||
| // | |||||
| // defines ON_Xform (4 x 4 transformation matrix) | |||||
| // | |||||
| //////////////////////////////////////////////////////////////// | |||||
| #if !defined(ON_XFORM_INC_) | |||||
| #define ON_XFORM_INC_ | |||||
| class ON_Matrix; | |||||
| class ON_CLASS ON_Xform | |||||
| { | |||||
| public: | |||||
| double m_xform[4][4]; // [i][j] = row i, column j. I.e., | |||||
| // | |||||
| // [0][0] [0][1] [0][2] [0][3] | |||||
| // [1][0] [1][1] [1][2] [1][3] | |||||
| // [2][0] [2][1] [2][2] [2][3] | |||||
| // [3][0] [3][1] [3][2] [3][3] | |||||
| // use implicit destructor, copy constructor | |||||
| ON_Xform(); // zero matrix | |||||
| ON_Xform( int ); // diagonal matrix (d,d,d,1) | |||||
| ON_Xform( double ); // diagonal matrix (d,d,d,1) | |||||
| #if defined(ON_COMPILER_MSC) | |||||
| // Microsoft's compiler won't pass double m[4][4] as a const double[4][4] arg. | |||||
| // Gnu's compiler handles this. | |||||
| ON_Xform( double[4][4] ); // from standard double m[4][4] | |||||
| ON_Xform( float[4][4] ); // from standard float m[4][4] | |||||
| #endif | |||||
| ON_Xform( const double[4][4] ); // from standard double m[4][4] | |||||
| ON_Xform( const float[4][4] ); // from standard float m[4][4] | |||||
| ON_Xform( const double* ); // from array of 16 doubles (row0,row1,row2,row3) | |||||
| ON_Xform( const float* ); // from array of 16 floats (row0,row1,row2,row3) | |||||
| ON_Xform( const ON_Matrix& ); // from upper left 4x4 of an | |||||
| // arbitrary matrix. Any missing | |||||
| // rows/columns are set to identity. | |||||
| ON_Xform(const ON_3dPoint& P, // as a frame. | |||||
| const ON_3dVector& X, | |||||
| const ON_3dVector& Y, | |||||
| const ON_3dVector& Z); | |||||
| // use implicit operator=(const ON_3dVector&), operator== | |||||
| double* operator[](int); | |||||
| const double* operator[](int) const; | |||||
| // xform = scalar results in a diagonal 3x3 with bottom row = 0,0,0,1 | |||||
| ON_Xform& operator=( int ); | |||||
| ON_Xform& operator=( float ); | |||||
| ON_Xform& operator=( double ); | |||||
| ON_Xform& operator=( const ON_Matrix& ); // from upper left 4x4 of an | |||||
| // arbitrary matrix. Any missing | |||||
| // rows/columns are set to identity. | |||||
| // All non-commutative operations have "this" as left hand side and | |||||
| // argument as right hand side. | |||||
| ON_2dPoint operator*( const ON_2dPoint& ) const; | |||||
| ON_3dPoint operator*( const ON_3dPoint& ) const; | |||||
| ON_4dPoint operator*( const ON_4dPoint& ) const; | |||||
| ON_2dVector operator*( const ON_2dVector& ) const; | |||||
| ON_3dVector operator*( const ON_3dVector& ) const; | |||||
| ON_Xform operator*( const ON_Xform& /*rhs*/ ) const; | |||||
| ON_Xform operator+( const ON_Xform& ) const; | |||||
| ON_Xform operator-( const ON_Xform& /*rhs*/ ) const; | |||||
| /* | |||||
| Description: | |||||
| Test the entries of the transformation matrix | |||||
| to see if they are valid number. | |||||
| Returns: | |||||
| True if ON_IsValid() is true for every number | |||||
| in the transformation matrix. | |||||
| */ | |||||
| bool IsValid() const; | |||||
| /* | |||||
| Returns: | |||||
| true if matrix is the identity transformation | |||||
| 1 0 0 0 | |||||
| 0 1 0 0 | |||||
| 0 0 1 0 | |||||
| 0 0 0 1 | |||||
| Remarks: | |||||
| An element of the matrix is "zero" if fabs(x) <= zero_tolerance. | |||||
| An element of the matrix is "one" if fabs(1.0-x) <= zero_tolerance. | |||||
| If the matrix contains a nan, false is returned. | |||||
| */ | |||||
| bool IsIdentity( double zero_tolerance = 0.0) const; | |||||
| /* | |||||
| Returns: | |||||
| true if the matrix is valid and is not the identity transformation | |||||
| Remarks: | |||||
| An element of the matrix is "zero" if fabs(x) <= zero_tolerance. | |||||
| An element of the matrix is "one" if fabs(1.0-x) <= zero_tolerance. | |||||
| If the matrix contains a nan, false is returned. | |||||
| */ | |||||
| bool IsNotIdentity( double zero_tolerance = 0.0) const; | |||||
| /* | |||||
| Returns: | |||||
| true if matrix is a pure translation | |||||
| 1 0 0 dx | |||||
| 0 1 0 dy | |||||
| 0 0 1 dz | |||||
| 0 0 0 1 | |||||
| Remarks: | |||||
| The test for zero is fabs(x) <= zero_tolerance. | |||||
| The test for one is fabs(x-1) <= zero_tolerance. | |||||
| */ | |||||
| bool IsTranslation( double zero_tolerance = 0.0) const; | |||||
| /* | |||||
| Returns: | |||||
| true if matrix is the zero transformation | |||||
| 0 0 0 0 | |||||
| 0 0 0 0 | |||||
| 0 0 0 0 | |||||
| 0 0 0 * | |||||
| */ | |||||
| bool IsZero() const; | |||||
| /* | |||||
| Description: | |||||
| A similarity transformation can be broken into a sequence | |||||
| of dialations, translations, rotations, and reflections. | |||||
| Returns: | |||||
| +1: This transformation is an orientation preserving similarity. | |||||
| -1: This transformation is an orientation reversing similarity. | |||||
| 0: This transformation is not a similarity. | |||||
| */ | |||||
| int IsSimilarity() const; | |||||
| int Compare( const ON_Xform& other ) const; | |||||
| // matrix operations | |||||
| void Transpose(); // transposes 4x4 matrix | |||||
| int | |||||
| Rank( // returns 0 to 4 | |||||
| double* = NULL // If not NULL, returns minimum pivot | |||||
| ) const; | |||||
| double | |||||
| Determinant( // returns determinant of 4x4 matrix | |||||
| double* = NULL // If not NULL, returns minimum pivot | |||||
| ) const; | |||||
| bool | |||||
| Invert( // If matrix is non-singular, returns true, | |||||
| // otherwise returns false and sets matrix to | |||||
| // pseudo inverse. | |||||
| double* = NULL // If not NULL, returns minimum pivot | |||||
| ); | |||||
| ON_Xform | |||||
| Inverse( // If matrix is non-singular, returns inverse, | |||||
| // otherwise returns pseudo inverse. | |||||
| double* = NULL // If not NULL, returns minimum pivot | |||||
| ) const; | |||||
| /* | |||||
| Description: | |||||
| When transforming 3d point and surface or mesh normals | |||||
| two different transforms must be used. | |||||
| If P_xform transforms the point, then the inverse | |||||
| transpose of P_xform must be used to tranform normal | |||||
| vectors. | |||||
| Parameters: | |||||
| N_xform - [out] | |||||
| Returns: | |||||
| The determinant of the transformation. | |||||
| If non-zero, "this" is invertable and N_xform can be calculated. | |||||
| False if "this" is not invertable, in which case | |||||
| the returned N_xform = this with the right hand column | |||||
| and bottom row zeroed out. | |||||
| */ | |||||
| double GetSurfaceNormalXform( ON_Xform& N_xform ) const; | |||||
| /* | |||||
| Description: | |||||
| If a texture mapping is applied to an object, the object | |||||
| is subsequently transformed by T, and the texture mapping | |||||
| needs to be recalculated, then two transforms are required | |||||
| to recalcalculate the texture mapping. | |||||
| Parameters: | |||||
| P_xform - [out] | |||||
| Transform to apply to points before applying the | |||||
| texture mapping transformation. | |||||
| N_xform - [out] | |||||
| Transform to apply to surface normals before applying | |||||
| the texture mapping transformation. | |||||
| Returns: | |||||
| The determinant of the "this" transformation. | |||||
| If non-zero, "this" is invertable and P_xform and N_xform | |||||
| were calculated. | |||||
| False if "this" is not invertable, in which case | |||||
| the returned P_xform and N_xform are the identity. | |||||
| */ | |||||
| double GetMappingXforms( ON_Xform& P_xform, ON_Xform& N_xform ) const; | |||||
| // Description: | |||||
| // Computes matrix * transpose([x,y,z,w]). | |||||
| // | |||||
| // Parameters: | |||||
| // x - [in] | |||||
| // y - [in] | |||||
| // z - [in] | |||||
| // z - [in] | |||||
| // ans - [out] = matrix * transpose([x,y,z,w]) | |||||
| void ActOnLeft( | |||||
| double, // x | |||||
| double, // y | |||||
| double, // z | |||||
| double, // w | |||||
| double[4] // ans | |||||
| ) const; | |||||
| // Description: | |||||
| // Computes [x,y,z,w] * matrix. | |||||
| // | |||||
| // Parameters: | |||||
| // x - [in] | |||||
| // y - [in] | |||||
| // z - [in] | |||||
| // z - [in] | |||||
| // ans - [out] = [x,y,z,w] * matrix | |||||
| void ActOnRight( | |||||
| double, // x | |||||
| double, // y | |||||
| double, // z | |||||
| double, // w | |||||
| double[4] // ans | |||||
| ) const; | |||||
| //////////////////////////////////////////////////////////////// | |||||
| // standard transformations | |||||
| // All zeros including the bottom row. | |||||
| void Zero(); | |||||
| // diagonal is (1,1,1,1) | |||||
| void Identity(); | |||||
| // diagonal 3x3 with bottom row = 0,0,0,1 | |||||
| void Diagonal(double); | |||||
| /* | |||||
| Description: | |||||
| Create non-uniform scale transformation with the origin as | |||||
| a fixed point. | |||||
| Parameters: | |||||
| fixed_point - [in] | |||||
| x_scale_factor - [in] | |||||
| y_scale_factor - [in] | |||||
| z_scale_factor - [in] | |||||
| Remarks: | |||||
| The diagonal is (x_scale_factor, y_scale_factor, z_scale_factor, 1) | |||||
| */ | |||||
| void Scale( | |||||
| double x_scale_factor, | |||||
| double y_scale_factor, | |||||
| double z_scale_factor | |||||
| ); | |||||
| /* | |||||
| Description: | |||||
| Create non-uniform scale transformation with the origin as | |||||
| a fixed point. | |||||
| Parameters: | |||||
| fixed_point - [in] | |||||
| scale_vector - [in] | |||||
| Remarks: | |||||
| The diagonal is (scale_vector.x, scale_vector.y, scale_vector.z, 1) | |||||
| */ | |||||
| void Scale( | |||||
| const ON_3dVector& scale_vector | |||||
| ); | |||||
| /* | |||||
| Description: | |||||
| Create uniform scale transformation with a specified | |||||
| fixed point. | |||||
| Parameters: | |||||
| fixed_point - [in] | |||||
| scale_factor - [in] | |||||
| */ | |||||
| void Scale | |||||
| ( | |||||
| ON_3dPoint fixed_point, | |||||
| double scale_factor | |||||
| ); | |||||
| /* | |||||
| Description: | |||||
| Create non-uniform scale transformation with a specified | |||||
| fixed point. | |||||
| Parameters: | |||||
| plane - [in] plane.origin is the fixed point | |||||
| x_scale_factor - [in] plane.xaxis scale factor | |||||
| y_scale_factor - [in] plane.yaxis scale factor | |||||
| z_scale_factor - [in] plane.zaxis scale factor | |||||
| */ | |||||
| void Scale | |||||
| ( | |||||
| const ON_Plane& plane, | |||||
| double x_scale_factor, | |||||
| double y_scale_factor, | |||||
| double z_scale_factor | |||||
| ); | |||||
| /* | |||||
| Description: | |||||
| Create shear transformation. | |||||
| Parameters: | |||||
| plane - [in] plane.origin is the fixed point | |||||
| x1 - [in] plane.xaxis scale factor | |||||
| y1 - [in] plane.yaxis scale factor | |||||
| z1 - [in] plane.zaxis scale factor | |||||
| */ | |||||
| void Shear | |||||
| ( | |||||
| const ON_Plane& plane, | |||||
| const ON_3dVector& x1, | |||||
| const ON_3dVector& y1, | |||||
| const ON_3dVector& z1 | |||||
| ); | |||||
| // Right column is (d.x, d.y,d.z, 1). | |||||
| void Translation( | |||||
| const ON_3dVector& // d | |||||
| ); | |||||
| // Right column is (dx, dy, dz, 1). | |||||
| void Translation( | |||||
| double, // dx | |||||
| double, // dy | |||||
| double // dz | |||||
| ); | |||||
| // Description: | |||||
| // Get transformation that projects to a plane | |||||
| // Parameters: | |||||
| // plane - [in] plane to project to | |||||
| // Remarks: | |||||
| // This transformaton maps a 3d point P to the | |||||
| // point plane.ClosestPointTo(Q). | |||||
| void PlanarProjection( | |||||
| const ON_Plane& plane | |||||
| ); | |||||
| // Description: | |||||
| // The Rotation() function is overloaded and provides several | |||||
| // ways to compute a rotation transformation. A positive | |||||
| // rotation angle indicates a counter-clockwise (right hand rule) | |||||
| // rotation about the axis of rotation. | |||||
| // | |||||
| // Parameters: | |||||
| // sin_angle - sin(rotation angle) | |||||
| // cos_angle - cos(rotation angle) | |||||
| // rotation_axis - 3d unit axis of rotation | |||||
| // rotation_center - 3d center of rotation | |||||
| // | |||||
| // Remarks: | |||||
| // In the overloads that take frames, the frames should | |||||
| // be right hand orthonormal frames | |||||
| // (unit vectors with Z = X x Y). | |||||
| // The resulting rotation fixes | |||||
| // the origin (0,0,0), maps initial X to | |||||
| // final X, initial Y to final Y, and initial Z to final Z. | |||||
| // | |||||
| // In the overload that takes frames with center points, | |||||
| // if the initial and final center are equal, then that | |||||
| // center point is the fixed point of the rotation. If | |||||
| // the initial and final point differ, then the resulting | |||||
| // transform is the composition of a rotation fixing P0 | |||||
| // and translation from P0 to P1. The resulting | |||||
| // transformation maps P0 to P1, P0+X0 to P1+X1, ... | |||||
| // | |||||
| // The rotation transformations that map frames to frames | |||||
| // are not the same as the change of basis transformations | |||||
| // for those frames. See ON_Xform::ChangeBasis(). | |||||
| // | |||||
| void Rotation( | |||||
| double sin_angle, | |||||
| double cos_angle, | |||||
| ON_3dVector rotation_axis, | |||||
| ON_3dPoint rotation_center | |||||
| ); | |||||
| // Parameters: | |||||
| // angle - rotation angle in radians | |||||
| // rotation_axis - 3d unit axis of rotation | |||||
| // rotation_center - 3d center of rotation | |||||
| void Rotation( | |||||
| double angle_radians, | |||||
| ON_3dVector rotation_axis, | |||||
| ON_3dPoint rotation_center | |||||
| ); | |||||
| /* | |||||
| Description: | |||||
| Calculate the minimal transformation that rotates | |||||
| start_dir to end_dir while fixing rotation_center. | |||||
| */ | |||||
| void Rotation( | |||||
| ON_3dVector start_dir, | |||||
| ON_3dVector end_dir, | |||||
| ON_3dPoint rotation_center | |||||
| ); | |||||
| // Parameters: | |||||
| // X0 - initial frame X | |||||
| // Y0 - initial frame Y | |||||
| // Z0 - initial frame Z | |||||
| // X1 - final frame X | |||||
| // Y1 - final frame Y | |||||
| // Z1 - final frame Z | |||||
| // | |||||
| void Rotation( | |||||
| const ON_3dVector& X0, | |||||
| const ON_3dVector& Y0, | |||||
| const ON_3dVector& Z0, | |||||
| const ON_3dVector& X1, | |||||
| const ON_3dVector& Y1, | |||||
| const ON_3dVector& Z1 | |||||
| ); | |||||
| // Parameters: | |||||
| // P0 - initial frame center | |||||
| // X0 - initial frame X | |||||
| // Y0 - initial frame Y | |||||
| // Z0 - initial frame Z | |||||
| // P1 - initial frame center | |||||
| // X1 - final frame X | |||||
| // Y1 - final frame Y | |||||
| // Z1 - final frame Z | |||||
| void Rotation( | |||||
| const ON_3dPoint& P0, | |||||
| const ON_3dVector& X0, | |||||
| const ON_3dVector& Y0, | |||||
| const ON_3dVector& Z0, | |||||
| const ON_3dPoint& P1, | |||||
| const ON_3dVector& X1, | |||||
| const ON_3dVector& Y1, | |||||
| const ON_3dVector& Z1 | |||||
| ); | |||||
| /* | |||||
| Description: | |||||
| Create rotation transformation that maps plane0 to plane1. | |||||
| Parameters: | |||||
| plane0 - [in] | |||||
| plane1 - [in] | |||||
| */ | |||||
| void Rotation( | |||||
| const ON_Plane& plane0, | |||||
| const ON_Plane& plane1 | |||||
| ); | |||||
| /* | |||||
| Description: | |||||
| Create mirror transformation matrix. | |||||
| Parameters: | |||||
| point_on_mirror_plane - [in] point on mirror plane | |||||
| normal_to_mirror_plane - [in] normal to mirror plane | |||||
| Remarks: | |||||
| The mirror transform maps a point Q to | |||||
| Q - (2*(Q-P)oN)*N, where | |||||
| P = point_on_mirror_plane and N = normal_to_mirror_plane. | |||||
| */ | |||||
| void Mirror( | |||||
| ON_3dPoint point_on_mirror_plane, | |||||
| ON_3dVector normal_to_mirror_plane | |||||
| ); | |||||
| // Description: The ChangeBasis() function is overloaded | |||||
| // and provides several | |||||
| // ways to compute a change of basis transformation. | |||||
| // | |||||
| // Parameters: | |||||
| // plane0 - inital plane | |||||
| // plane1 - final plane | |||||
| // | |||||
| // Returns: | |||||
| // @untitled table | |||||
| // true success | |||||
| // false vectors for initial frame are not a basis | |||||
| // | |||||
| // Remarks: | |||||
| // If you have points defined with respect to planes, the | |||||
| // version of ChangeBasis() that takes two planes computes | |||||
| // the transformation to change coordinates from one plane to | |||||
| // another. The predefined world plane ON_world_plane can | |||||
| // be used as an argument. | |||||
| // | |||||
| // If P = plane0.Evaluate( a0,b0,c0 ) and | |||||
| // | |||||
| // (a1,b1,c1) = ChangeBasis(plane0,plane1)*ON_3dPoint(a0,b0,c0), | |||||
| // | |||||
| // then P = plane1.Evaluate( a1, b1, c1 ) | |||||
| // | |||||
| // The version of ChangeBasis() that takes six vectors | |||||
| // maps (a0,b0,c0) to (a1,b1,c1) where | |||||
| // a0*X0 + b0*Y0 + c0*Z0 = a1*X1 + b1*Y1 + c1*Z1 | |||||
| // | |||||
| // The version of ChangeBasis() that takes six vectors | |||||
| // with center points | |||||
| // maps (a0,b0,c0) to (a1,b1,c1) where | |||||
| // P0 + a0*X0 + b0*Y0 + c0*Z0 = P1 + a1*X1 + b1*Y1 + c1*Z1 | |||||
| // | |||||
| // The change of basis transformation is not the same as | |||||
| // the rotation transformation that rotates one orthonormal | |||||
| // frame to another. See ON_Xform::Rotation(). | |||||
| bool ChangeBasis( | |||||
| const ON_Plane& plane0, | |||||
| const ON_Plane& plane1 | |||||
| ); | |||||
| // Description: | |||||
| // Get a change of basis transformation. | |||||
| // Parameters: | |||||
| // X0 - initial basis X (X0,Y0,Z0 can be any 3d basis) | |||||
| // Y0 - initial basis Y | |||||
| // Z0 - initial basis Z | |||||
| // X1 - final basis X (X1,Y1,Z1 can be any 3d basis) | |||||
| // Y1 - final basis Y | |||||
| // Z1 - final basis Z | |||||
| // Remarks: | |||||
| // Change of basis transformations and rotation transformations | |||||
| // are often confused. This is a change of basis transformation. | |||||
| // If Q = a0*X0 + b0*Y0 + c0*Z0 = a1*X1 + b1*Y1 + c1*Z1 | |||||
| // then this transform will map the point (a0,b0,c0) to (a1,b1,c1) | |||||
| bool ChangeBasis( | |||||
| const ON_3dVector& X0, | |||||
| const ON_3dVector& Y0, | |||||
| const ON_3dVector& Z0, | |||||
| const ON_3dVector& X1, | |||||
| const ON_3dVector& Y1, | |||||
| const ON_3dVector& Z1 | |||||
| ); | |||||
| // Parameters: | |||||
| // P0 - initial center | |||||
| // X0 - initial basis X (X0,Y0,Z0 can be any 3d basis) | |||||
| // Y0 - initial basis Y | |||||
| // Z0 - initial basis Z | |||||
| // P1 - final center | |||||
| // X1 - final basis X (X1,Y1,Z1 can be any 3d basis) | |||||
| // Y1 - final basis Y | |||||
| // Z1 - final basis Z | |||||
| // Remarks: | |||||
| // Change of basis transformations and rotation transformations | |||||
| // are often confused. This is a change of basis transformation. | |||||
| // If Q = P0 + a0*X0 + b0*Y0 + c0*Z0 = P1 + a1*X1 + b1*Y1 + c1*Z1 | |||||
| // then this transform will map the point (a0,b0,c0) to (a1,b1,c1) | |||||
| bool ChangeBasis( | |||||
| const ON_3dPoint& P0, | |||||
| const ON_3dVector& X0, | |||||
| const ON_3dVector& Y0, | |||||
| const ON_3dVector& Z0, | |||||
| const ON_3dPoint& P1, | |||||
| const ON_3dVector& X1, | |||||
| const ON_3dVector& Y1, | |||||
| const ON_3dVector& Z1 | |||||
| ); | |||||
| // standard viewing transformations | |||||
| void WorldToCamera( | |||||
| const ON_3dPoint&, // CameraLocation | |||||
| const ON_3dVector&, // unit CameraX vector (right) | |||||
| const ON_3dVector&, // unit CameraY vector (up) | |||||
| const ON_3dVector& // unit CameraZ vector (from screen to camera) | |||||
| ); | |||||
| void CameraToWorld( | |||||
| const ON_3dPoint&, // CameraLocation | |||||
| const ON_3dVector&, // unit CameraX vector (right) | |||||
| const ON_3dVector&, // unit CameraY vector (up) | |||||
| const ON_3dVector& // unit CameraZ vector (from screen to camera) | |||||
| ); | |||||
| bool CameraToClip( // maps viewport frustum to -1 <= x,y,z <= 1 box | |||||
| ON_BOOL32, // true for perspective, false for orthographic | |||||
| double, double, // left != right (usually left < right ) | |||||
| double, double, // bottom != top (usually bottom < top ) | |||||
| double, double // near != far (usually 0 < near < far ) | |||||
| ); | |||||
| // maps -1 <= x,y,z <= 1 box to viewport frustum | |||||
| bool ClipToCamera( | |||||
| int, // true for perspective, false for orthographic | |||||
| double, double, // left != right (usually left < right ) | |||||
| double, double, // bottom != top (usually bottom < top ) | |||||
| double, double // near != far an bot are non-zero (usually 0 < near < far ) | |||||
| ); | |||||
| // Computes transform that maps the clipping box | |||||
| // | |||||
| // -1<x<1,-1<y<1,-1<z<1 | |||||
| // | |||||
| // to the screen box | |||||
| // | |||||
| // (left,right) X (bottom,top) X (near,far) | |||||
| bool ClipToScreen( | |||||
| double, // left | |||||
| double, // right | |||||
| double, // bottom | |||||
| double, // top | |||||
| double, // near_z | |||||
| double // far_z | |||||
| ); | |||||
| // Computes transform that maps the screen box | |||||
| // | |||||
| // (left,right) X (bottom,top) X (near,far) | |||||
| // | |||||
| // to the clipping box | |||||
| // | |||||
| // -1<x<1,-1<y<1,-1<z<1 | |||||
| bool ScreenToClip( | |||||
| double, // left | |||||
| double, // right | |||||
| double, // bottom | |||||
| double, // top | |||||
| double, // near_z | |||||
| double // far_z | |||||
| ); | |||||
| // Description: Computes homogeneous point clipping flags and | |||||
| // returns an int with bits set to indicate if the point | |||||
| // is outside of the clipping box. | |||||
| // | |||||
| // Parameters: | |||||
| // point - [in] 4d homogeneous clipping coordinate point | |||||
| // | |||||
| // Returns: | |||||
| // @table | |||||
| // bit point location | |||||
| // 1 x/w < -1 | |||||
| // 2 x/w > +1 | |||||
| // 4 y/w < -1 | |||||
| // 8 y/w > +1 | |||||
| // 16 z/w < -1 | |||||
| // 32 z/w > +1 | |||||
| // | |||||
| int ClipFlag4d( | |||||
| const double* // point | |||||
| ) const; | |||||
| // Parameters: | |||||
| // count - [in] number of 4d points | |||||
| // stride - [in] (>=4) | |||||
| // points - [in] 4d clipping coordinate points | |||||
| // (array of stride*count doubles) | |||||
| // bTestZ - [in] (default=true) if false, do not test "z" coordinate | |||||
| // | |||||
| int ClipFlag4d( | |||||
| int, // count | |||||
| int, // stride | |||||
| const double*, // points | |||||
| ON_BOOL32 = true // bTeztZ | |||||
| ) const; | |||||
| // Description: | |||||
| // Computes 3d point clipping flags and | |||||
| // returns an int with bits set to indicate if the point | |||||
| // is outside of the clipping box. | |||||
| // | |||||
| // Parameters: | |||||
| // point - [in] 3d clipping coordinate point | |||||
| // | |||||
| // Returns: | |||||
| // @table | |||||
| // bit point location | |||||
| // 1 x < -1 | |||||
| // 2 x > +1 | |||||
| // 4 y < -1 | |||||
| // 8 y > +1 | |||||
| // 16 z < -1 | |||||
| // 32 z > +1 | |||||
| int ClipFlag3d( | |||||
| const double* // point | |||||
| ) const; | |||||
| // Parameters: | |||||
| // count - [in] number of 3d points | |||||
| // stride - [in] (>=3) | |||||
| // points - [in] 3d clipping coordinate points (array of stride*count doubles) | |||||
| // bTestZ - [in] (default=true) if false, do not test "z" coordinate | |||||
| // | |||||
| int ClipFlag3d( | |||||
| int, // count | |||||
| int, // stride | |||||
| const double*, // points | |||||
| ON_BOOL32 = true // bTestZ | |||||
| ) const; | |||||
| // Description: Computes 3d clipping flags for a 3d bounding | |||||
| // box and returns an int with bits set to indicate if | |||||
| // the bounding box is outside of the clipping box. | |||||
| // | |||||
| // Parameters: | |||||
| // boxmin - [in] 3d boxmin corner | |||||
| // boxmax - [in] 3d boxmax corner | |||||
| // | |||||
| // Returns: | |||||
| // @table | |||||
| // bit box location | |||||
| // 1 boxmax x < -1 | |||||
| // 2 boxmin x > +1 | |||||
| // 4 boxmax y < -1 | |||||
| // 8 boxmin y > +1 | |||||
| // 16 boxmax z < -1 | |||||
| // 32 boxmin z > +1 | |||||
| int ClipFlag3dBox( | |||||
| const double*, // boxmin | |||||
| const double* // boxmax | |||||
| ) const; | |||||
| /* | |||||
| Description: | |||||
| Calculates the transformation that linearly maps | |||||
| old_interval to new_interval. | |||||
| Parameters: | |||||
| dir - [in] 0 = x, 1 = y, 2= z; | |||||
| old_interval - [in] | |||||
| new_interval - [in] | |||||
| */ | |||||
| bool IntervalChange( | |||||
| int dir, | |||||
| ON_Interval old_interval, | |||||
| ON_Interval new_interval | |||||
| ); | |||||
| }; | |||||
| class ON_CLASS ON_ClippingRegion | |||||
| { | |||||
| public: | |||||
| ON_ClippingRegion(); | |||||
| // The transformation m_xform transforms the view frustum, | |||||
| // in object coordinates to the (-1,+1)^3 clipping | |||||
| // coordinate box. | |||||
| ON_Xform m_xform; | |||||
| /* | |||||
| Parameters: | |||||
| clip_plane_tolerance - [in] | |||||
| 3d world coordinates tolerance to use when testing | |||||
| objects to see if the planes in m_clip_plane[] hide | |||||
| the objects. | |||||
| Remarks: | |||||
| The constructor sets this value to zero. Rhino uses | |||||
| values around 1e-5. | |||||
| */ | |||||
| void SetClipPlaneTolerance( double clip_plane_tolerance ); | |||||
| /* | |||||
| Returns: | |||||
| 3d world coordinates tolerance to use when testing | |||||
| objects to see if the planes in m_clip_plane[] hide | |||||
| the objects. | |||||
| Remarks: | |||||
| The constructor sets this value to zero. Rhino uses | |||||
| values around 1e-5. | |||||
| */ | |||||
| double ClipPlaneTolerance() const; | |||||
| enum | |||||
| { | |||||
| max_clip_plane_count = 16, // must be <= 25 | |||||
| frustum_bitmask = 0x0000003F, | |||||
| near_plane_bitmask = 0x00000020, | |||||
| far_plane_bitmask = 0x00000010, | |||||
| clip_plane_bitmask = 0x7FFFFFC0, | |||||
| negw_bitmask = 0x80000000 | |||||
| }; | |||||
| // Up to 25 additional clipping planes in object coordinates. | |||||
| // The convex region that is the intersection of the positive | |||||
| // side of these planes is the active region. | |||||
| int m_clip_plane_count; // (0 <= m_clip_plane_count <= max_clip_plane_count) | |||||
| private: | |||||
| // The "float" should be a double, but that can't happen | |||||
| // until V6 because it will brake the SDK. Use the | |||||
| // SetClipPlaneTolerance() and ClipPlaneTolerance() | |||||
| // functions to set and get this value. | |||||
| float m_clip_plane_tolerance; | |||||
| public: | |||||
| ON_PlaneEquation m_clip_plane[max_clip_plane_count]; | |||||
| /* | |||||
| Description: | |||||
| The "view frustum" is the frustum the m_xform transformation | |||||
| maps to clipping coordinate box (-1,+1)^3. These functions | |||||
| determine if some portion of the convex hull of the test points | |||||
| is inside the view frustum. | |||||
| Parameters: | |||||
| P - [in] point | |||||
| box - [in] bounding box | |||||
| count - [in] number of points | |||||
| p - [in] array of points | |||||
| bEnableClippingPlanes - [in] | |||||
| If true, then the additional clipping planes are tested. | |||||
| If false, then the additional clipping planes are ignored. | |||||
| Returns: | |||||
| 0 = No part of the of the convex hull of the tested points | |||||
| is in the view frustum. | |||||
| 1 = A portion of the convex hull of the otested points may | |||||
| be in the view frustum. | |||||
| 2 = The entire convex hull of the tested points is in the | |||||
| view frustum. | |||||
| */ | |||||
| int InViewFrustum( | |||||
| ON_3dPoint P | |||||
| ) const; | |||||
| int InViewFrustum( | |||||
| const ON_BoundingBox& bbox | |||||
| ) const; | |||||
| int InViewFrustum( | |||||
| int count, | |||||
| const ON_3fPoint* p | |||||
| ) const; | |||||
| int InViewFrustum( | |||||
| int count, | |||||
| const ON_3dPoint* p | |||||
| ) const; | |||||
| int InViewFrustum( | |||||
| int count, | |||||
| const ON_4dPoint* p | |||||
| ) const; | |||||
| /* | |||||
| Description: | |||||
| The "clip plane region" is the convex hull of the planes in | |||||
| the m_clip_plane[] array. These functions determine if | |||||
| some portion of the convex hull of the test points is inside | |||||
| the clip plane region. | |||||
| Parameters: | |||||
| P - [in] point | |||||
| box - [in] bounding box | |||||
| count - [in] number of points | |||||
| p - [in] array of points | |||||
| bEnableClippingPlanes - [in] | |||||
| If true, then the additional clipping planes are tested. | |||||
| If false, then the additional clipping planes are ignored. | |||||
| Returns: | |||||
| 0 = No part of the of the convex hull of the tested points | |||||
| is in the clip plane region. | |||||
| 1 = A portion of the convex hull of the tested points may | |||||
| be in the clip plane region. | |||||
| 2 = The entire convex hull of the tested points is in the | |||||
| clip plane region. | |||||
| */ | |||||
| int InClipPlaneRegion( | |||||
| ON_3dPoint P | |||||
| ) const; | |||||
| int InClipPlaneRegion( | |||||
| const ON_BoundingBox& bbox | |||||
| ) const; | |||||
| int InClipPlaneRegion( | |||||
| int count, | |||||
| const ON_3fPoint* p | |||||
| ) const; | |||||
| int InClipPlaneRegion( | |||||
| int count, | |||||
| const ON_3dPoint* p | |||||
| ) const; | |||||
| int InClipPlaneRegion( | |||||
| int count, | |||||
| const ON_4dPoint* p | |||||
| ) const; | |||||
| /* | |||||
| Description: | |||||
| The "visible area" is the intersection of the view frustum, | |||||
| defined by m_xform, and the clipping region, defined by the | |||||
| m_clip_plane[] array. These functions determing if some | |||||
| portion of the convex hull of the test points is visible. | |||||
| Parameters: | |||||
| P - [in] point | |||||
| box - [in] bounding box | |||||
| count - [in] number of points | |||||
| p - [in] array of points | |||||
| Returns: | |||||
| 0 = no part of the object is in the region. | |||||
| 1 = a portion of the object is in the region | |||||
| 2 = entire object is in clipping region | |||||
| */ | |||||
| int IsVisible( | |||||
| ON_3dPoint P | |||||
| ) const; | |||||
| int IsVisible( | |||||
| const ON_BoundingBox& bbox | |||||
| ) const; | |||||
| int IsVisible( | |||||
| int count, | |||||
| const ON_3fPoint* p | |||||
| ) const; | |||||
| int IsVisible( | |||||
| int count, | |||||
| const ON_3dPoint* p | |||||
| ) const; | |||||
| int IsVisible( | |||||
| int count, | |||||
| const ON_4dPoint* p | |||||
| ) const; | |||||
| /* | |||||
| Description: | |||||
| Transform a list of 4d homogenous points while testing | |||||
| for visibility. | |||||
| Parameters: | |||||
| count - [in] number of points | |||||
| p - [in/out] array of points to test and transform | |||||
| If 0 is returned, some of the points may not | |||||
| be transformed. In all other cases, the output | |||||
| points are transformed by m_xform. | |||||
| pflags - [out] | |||||
| 0 when the point is in the visible region. | |||||
| Otherwise the bits are set to indicate which planes clip the | |||||
| intput point. | |||||
| 0x01 left of the view frusturm | |||||
| 0x02 right of the view frustum | |||||
| 0x04 below the view frustum | |||||
| 0x08 above the view frustum | |||||
| 0x10 behind the view frustum (too far) | |||||
| 0x20 in front of the view frustum (too near) | |||||
| 0x10 below m_clip_plane[0] | |||||
| 0x20 below m_clip_plane[1] | |||||
| ... | |||||
| 0x40000000 below m_clip_plane[24] | |||||
| 0x80000000 transformation created a non-positive weight | |||||
| Returns: | |||||
| 0 = convex hull of the points is not in the region. | |||||
| The m_cull_bits field reports which plane or planes | |||||
| culled the point set. | |||||
| 1 = a portion of the convex hull is in the region. | |||||
| The m_cull_bits field reports which plane or planes | |||||
| culled the point set. | |||||
| 2 = all points are in the region. | |||||
| The m_cull_bits field will be zero. | |||||
| */ | |||||
| int TransformPoints( int count, ON_4dPoint* p ) const; | |||||
| int TransformPoints( int count, ON_4dPoint* p, unsigned int* pflags ) const; | |||||
| /* | |||||
| Description: | |||||
| Transform a pont and return the clipping information. | |||||
| Parameters: | |||||
| P - [in] point ot transform | |||||
| Q - [out] transformed point | |||||
| Returns: | |||||
| 0 when the point is in the visible region. | |||||
| Otherwise the bits are set to indicate which planes clip the | |||||
| intput point. | |||||
| 0x01 left of the view frusturm | |||||
| 0x02 right of the view frustum | |||||
| 0x04 below the view frustum | |||||
| 0x08 above the view frustum | |||||
| 0x10 behind the view frustum (too far) | |||||
| 0x20 in front of the view frustum (too near) | |||||
| 0x10 below m_clip_plane[0] | |||||
| 0x20 below m_clip_plane[1] | |||||
| ... | |||||
| 0x40000000 below m_clip_plane[24] | |||||
| 0x80000000 transformation created a non-positive weight | |||||
| */ | |||||
| unsigned int TransformPoint( | |||||
| const ON_4dPoint& P, | |||||
| ON_4dPoint& Q | |||||
| ) const; | |||||
| unsigned int TransformPoint( | |||||
| const ON_3dPoint& P, | |||||
| ON_3dPoint& Q | |||||
| ) const; | |||||
| unsigned int TransformPoint( | |||||
| const ON_3fPoint& P, | |||||
| ON_3dPoint& Q | |||||
| ) const; | |||||
| /* | |||||
| Description: | |||||
| Calculate the interval for the segment of a line that | |||||
| is in the clip plane region. | |||||
| Parameters: | |||||
| P0 - [in] start point | |||||
| P1 - [in] end point | |||||
| t0 - [out] start parameter | |||||
| t1 - [out] end parameter | |||||
| Returns: | |||||
| True if some portion of the line is visible and | |||||
| 0.0 <= *t0 <= *t1 <= 1.0. | |||||
| */ | |||||
| bool GetLineClipPlaneParamters( | |||||
| ON_4dPoint P0, | |||||
| ON_4dPoint P1, | |||||
| double* t0, | |||||
| double* t1 | |||||
| ) const; | |||||
| }; | |||||
| class ON_CLASS ON_Localizer | |||||
| { | |||||
| public: | |||||
| ON_Localizer(); | |||||
| ~ON_Localizer(); | |||||
| ON_Localizer(const ON_Localizer&); | |||||
| ON_Localizer& operator=(const ON_Localizer&); | |||||
| void Destroy(); | |||||
| bool Read(ON_BinaryArchive&); | |||||
| bool Write(ON_BinaryArchive&) const; | |||||
| /* | |||||
| Descrption: | |||||
| Creates a cylindrical localizer. | |||||
| If d = distance from the point to the line, | |||||
| then the localizer has the following behavior: | |||||
| point distance localizer value | |||||
| d <= r0 < r1 or d >= r0 > r1 0 | |||||
| d >= r1 > r0 or d <= r1 < r0 1 | |||||
| For values of d between r0 and r1, the localizer | |||||
| smoothly transitions between 0 to 1. | |||||
| Parameters: | |||||
| P - [in] cylinder axis point | |||||
| D - [in] cylinder axis direction | |||||
| r0 - [in] | |||||
| r1 - [in] | |||||
| r0 and r1 are radii that control where the localizer is nonzero. | |||||
| Both r0 and r1 must be postive and the cannot be equal. | |||||
| If 0 < r0 < r1, then the localizer is zero for points | |||||
| inside the cylinder of radius r0 and one for points outside | |||||
| the cylinder of radius r1. | |||||
| If 0 < r1 < r0, then the localizer is one for points | |||||
| inside the cylinder of radius r1 and zero for points outside | |||||
| the cylinder of radius r0. | |||||
| Returns: | |||||
| True if the input is value and the localizer is initialized. | |||||
| */ | |||||
| bool CreateCylinderLocalizer( ON_3dPoint P, ON_3dVector D, double r0, double r1 ); | |||||
| /* | |||||
| Descrption: | |||||
| Creates a planar localizer. | |||||
| If d = signed distance from the point to the plane, | |||||
| then the localizer has the following behavior: | |||||
| point distance localizer value | |||||
| d <= h0 < h1 or d >= h0 > h1 0 | |||||
| d >= h1 > h0 or d <= h1 < h0 1 | |||||
| For values of d between h0 and h1, the localizer | |||||
| smoothly transitions between 0 to 1. | |||||
| Parameters: | |||||
| P - [in] point on plane | |||||
| N - [in] normal to plane | |||||
| h0 - [in] | |||||
| h1 - [in] | |||||
| h0 and h1 are signed distances that control where the | |||||
| localizer is nonzero. | |||||
| Returns: | |||||
| True if the input is value and the localizer is initialized. | |||||
| */ | |||||
| bool CreatePlaneLocalizer( ON_3dPoint P, ON_3dVector N, double h0, double h1 ); | |||||
| /* | |||||
| Descrption: | |||||
| Creates a spherical localizer. | |||||
| If d = distance from the point to the center of the sphere, | |||||
| then the localizer has the following behavior: | |||||
| point distance localizer value | |||||
| d <= r0 < r1 or d >= r0 > r1 0 | |||||
| d >= r1 > r0 or d <= r1 < r0 1 | |||||
| For values of d between r0 and r1, the localizer | |||||
| smoothly transitions between 0 to 1. | |||||
| Parameters: | |||||
| P - [in] center of sphere | |||||
| r0 - [in] | |||||
| r1 - [in] | |||||
| r0 and r1 are radii that control where the localizer is nonzero. | |||||
| Both r0 and r1 must be postive and the cannot be equal. | |||||
| If 0 < r0 < r1, then the localizer is zero for points | |||||
| inside the cylinder of radius r0 and one for points outside | |||||
| the cylinder of radius r1. | |||||
| If 0 < r1 < r0, then the localizer is one for points | |||||
| inside the cylinder of radius r1 and zero for points outside | |||||
| the cylinder of radius r0. | |||||
| Returns: | |||||
| True if the input is value and the localizer is initialized. | |||||
| */ | |||||
| bool CreateSphereLocalizer( ON_3dPoint P, double r0, double r1 ); | |||||
| /* | |||||
| Description: | |||||
| Evaluators. | |||||
| Parameters: | |||||
| P - [in] | |||||
| Evaluation point | |||||
| distance - [in] | |||||
| Evaluation distance | |||||
| Returns: | |||||
| Value of the localizer. | |||||
| */ | |||||
| double Value(ON_3dPoint P) const; | |||||
| double Value(double distance) const; | |||||
| /* | |||||
| Parameters: | |||||
| bbox - [in] | |||||
| Returns: | |||||
| True if localizer is identically zero inside bbox. | |||||
| */ | |||||
| bool IsZero( const ON_BoundingBox& bbox ) const; | |||||
| enum TYPE | |||||
| { | |||||
| no_type = 0, | |||||
| sphere_type = 1, | |||||
| plane_type = 2, | |||||
| cylinder_type = 3, | |||||
| curve_type = 4, | |||||
| surface_type = 5, | |||||
| distance_type = 6, | |||||
| force_32bit_localizer_type = 0xFFFFFFFF | |||||
| }; | |||||
| TYPE m_type; | |||||
| ON_Interval m_d; | |||||
| ON_3dPoint m_P; | |||||
| ON_3dVector m_V; | |||||
| class ON_NurbsCurve* m_nurbs_curve; | |||||
| class ON_NurbsSurface* m_nurbs_surface; | |||||
| }; | |||||
| class ON_CLASS ON_SpaceMorph | |||||
| { | |||||
| public: | |||||
| ON_SpaceMorph(); | |||||
| virtual ~ON_SpaceMorph(); | |||||
| /* | |||||
| Description: | |||||
| Provides a quick way to determine if a morph function | |||||
| is the identity (doesn't move the points) on a region | |||||
| of space. | |||||
| Parameters: | |||||
| bbox - [in] region of space to test. | |||||
| Returns: | |||||
| The default always returns false. If you override | |||||
| this function, then return true when every point | |||||
| in the bounding box is fixed by the morph. | |||||
| */ | |||||
| virtual | |||||
| bool IsIdentity( const ON_BoundingBox& bbox ) const; | |||||
| /* | |||||
| Description: | |||||
| Returns the desired accuracy of the morph. | |||||
| This value is primarily used for deforming | |||||
| surfaces and breps. | |||||
| Returns: | |||||
| 3d fitting tolerance. | |||||
| Remarks: | |||||
| The default is 0.0 and any value <= 0.0 is | |||||
| ignored by morphing functions. | |||||
| The value returned by Tolerance() does not | |||||
| affect the way meshes and points are morphed. | |||||
| */ | |||||
| double Tolerance() const; | |||||
| /* | |||||
| Description: | |||||
| Set the 3d fitting tolerance used when morphing | |||||
| surfaces and breps. | |||||
| Parameters: | |||||
| tolerance - [in] values < 0.0 are treated as 0.0. | |||||
| */ | |||||
| void SetTolerance( | |||||
| double tolerance | |||||
| ); | |||||
| /* | |||||
| Returns: | |||||
| True if the morph should be done as quickly as | |||||
| possible because the result is being used for | |||||
| some type of dynamic preview. If QuickPreview | |||||
| is true, the tolerance may be ignored. | |||||
| Remarks: | |||||
| The value returned by QuickPreview() does not | |||||
| affect the way meshes and points are morphed. | |||||
| The default is false. | |||||
| */ | |||||
| bool QuickPreview() const; | |||||
| /* | |||||
| Description: | |||||
| Set the quick preview value. | |||||
| Parameters: | |||||
| bQuickPreview - [in] | |||||
| */ | |||||
| void SetQuickPreview( | |||||
| bool bQuickPreview | |||||
| ); | |||||
| /* | |||||
| Returns: | |||||
| True if the morph should be done in a way that | |||||
| preserves the structure of the geometry. | |||||
| In particular, for NURBS objects, true | |||||
| means that only the control points are moved. | |||||
| Remarks: | |||||
| The value returned by PreserveStructure() does not | |||||
| affect the way meshes and points are morphed. | |||||
| The default is false. | |||||
| */ | |||||
| bool PreserveStructure() const; | |||||
| /* | |||||
| Description: | |||||
| Set the preserve structure value. | |||||
| Parameters: | |||||
| bPreserveStructure - [in] | |||||
| */ | |||||
| void SetPreserveStructure( | |||||
| bool bPreserveStructure | |||||
| ); | |||||
| private: | |||||
| double m_tolerance; | |||||
| bool m_bQuickPreview; | |||||
| bool m_bPreserveStructure; | |||||
| }; | |||||
| #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_Xform>; | |||||
| ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ON_Localizer>; | |||||
| #pragma warning( pop ) | |||||
| #endif | |||||
| #endif | |||||