You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
7.4 KiB
C++
223 lines
7.4 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkBoundedPlanePointPlacer.h
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
/**
|
|
* @class vtkBoundedPlanePointPlacer
|
|
* @brief a placer that constrains a handle to a finite plane
|
|
*
|
|
* vtkBoundedPlanePointPlacer is a type of point placer that constrains its
|
|
* points to a finite (i.e., bounded) plance.
|
|
*
|
|
* @sa
|
|
* vtkPointPlacer vtkHandleWidget vtkHandleRepresentation
|
|
*/
|
|
|
|
#ifndef vtkBoundedPlanePointPlacer_h
|
|
#define vtkBoundedPlanePointPlacer_h
|
|
|
|
#include "vtkInteractionWidgetsModule.h" // For export macro
|
|
#include "vtkPointPlacer.h"
|
|
|
|
class vtkPlane;
|
|
class vtkPlaneCollection;
|
|
class vtkPlanes;
|
|
class vtkRenderer;
|
|
|
|
|
|
class VTKINTERACTIONWIDGETS_EXPORT vtkBoundedPlanePointPlacer : public vtkPointPlacer
|
|
{
|
|
public:
|
|
/**
|
|
* Instantiate this class.
|
|
*/
|
|
static vtkBoundedPlanePointPlacer *New();
|
|
|
|
//@{
|
|
/**
|
|
* Standard methods for instances of this class.
|
|
*/
|
|
vtkTypeMacro(vtkBoundedPlanePointPlacer,vtkPointPlacer);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set the projection normal to lie along the x, y, or z axis,
|
|
* or to be oblique. If it is oblique, then the plane is
|
|
* defined in the ObliquePlane ivar.
|
|
*/
|
|
vtkSetClampMacro(ProjectionNormal,int,
|
|
vtkBoundedPlanePointPlacer::XAxis,
|
|
vtkBoundedPlanePointPlacer::Oblique);
|
|
vtkGetMacro(ProjectionNormal,int);
|
|
void SetProjectionNormalToXAxis()
|
|
{ this->SetProjectionNormal(vtkBoundedPlanePointPlacer::XAxis); }
|
|
void SetProjectionNormalToYAxis()
|
|
{ this->SetProjectionNormal(vtkBoundedPlanePointPlacer::YAxis); }
|
|
void SetProjectionNormalToZAxis()
|
|
{ this->SetProjectionNormal(vtkBoundedPlanePointPlacer::ZAxis); }
|
|
void SetProjectionNormalToOblique()
|
|
{ this->SetProjectionNormal(vtkBoundedPlanePointPlacer::Oblique); }
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* If the ProjectionNormal is set to Oblique, then this is the
|
|
* oblique plane used to constrain the handle position.
|
|
*/
|
|
void SetObliquePlane(vtkPlane *);
|
|
vtkGetObjectMacro( ObliquePlane, vtkPlane );
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* The position of the bounding plane from the origin along the
|
|
* normal. The origin and normal are defined in the oblique plane
|
|
* when the ProjectionNormal is oblique. For the X, Y, and Z
|
|
* axes projection normals, the normal is the axis direction, and
|
|
* the origin is (0,0,0).
|
|
*/
|
|
void SetProjectionPosition(double position);
|
|
vtkGetMacro(ProjectionPosition, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* A collection of plane equations used to bound the position of the point.
|
|
* This is in addition to confining the point to a plane - these constraints
|
|
* are meant to, for example, keep a point within the extent of an image.
|
|
* Using a set of plane equations allows for more complex bounds (such as
|
|
* bounding a point to an oblique reliced image that has hexagonal shape)
|
|
* than a simple extent.
|
|
*/
|
|
void AddBoundingPlane(vtkPlane *plane);
|
|
void RemoveBoundingPlane(vtkPlane *plane);
|
|
void RemoveAllBoundingPlanes();
|
|
virtual void SetBoundingPlanes(vtkPlaneCollection*);
|
|
vtkGetObjectMacro(BoundingPlanes,vtkPlaneCollection);
|
|
void SetBoundingPlanes(vtkPlanes *planes);
|
|
//@}
|
|
|
|
enum
|
|
{
|
|
XAxis=0,
|
|
YAxis,
|
|
ZAxis,
|
|
Oblique
|
|
};
|
|
|
|
/**
|
|
* Given a renderer and a display position, compute the
|
|
* world position and world orientation for this point.
|
|
* A plane is defined by a combination of the
|
|
* ProjectionNormal, ProjectionOrigin, and ObliquePlane
|
|
* ivars. The display position is projected onto this
|
|
* plane to determine a world position, and the
|
|
* orientation is set to the normal of the plane. If
|
|
* the point cannot project onto the plane or if it
|
|
* falls outside the bounds imposed by the
|
|
* BoundingPlanes, then 0 is returned, otherwise 1 is
|
|
* returned to indicate a valid return position and
|
|
* orientation.
|
|
*/
|
|
int ComputeWorldPosition( vtkRenderer *ren,
|
|
double displayPos[2],
|
|
double worldPos[3],
|
|
double worldOrient[9] );
|
|
|
|
/**
|
|
* Given a renderer, a display position, and a reference world
|
|
* position, compute the new world position and orientation
|
|
* of this point. This method is typically used by the
|
|
* representation to move the point.
|
|
*/
|
|
virtual int ComputeWorldPosition( vtkRenderer *ren,
|
|
double displayPos[2],
|
|
double refWorldPos[3],
|
|
double worldPos[3],
|
|
double worldOrient[9] );
|
|
|
|
/**
|
|
* Give a world position check if it is valid - does
|
|
* it lie on the plane and within the bounds? Returns
|
|
* 1 if it is valid, 0 otherwise.
|
|
*/
|
|
int ValidateWorldPosition( double worldPos[3] );
|
|
|
|
// Descrption:
|
|
// Orientationation is ignored, and the above method
|
|
// is called instead.
|
|
int ValidateWorldPosition( double worldPos[3],
|
|
double worldOrient[9]);
|
|
|
|
/**
|
|
* If the constraints on this placer are changed, then
|
|
* this method will be called by the representation on
|
|
* each of its points. For this placer, the world
|
|
* position will be converted to a display position, then
|
|
* ComputeWorldPosition will be used to update the
|
|
* point.
|
|
*/
|
|
virtual int UpdateWorldPosition( vtkRenderer *ren,
|
|
double worldPos[3],
|
|
double worldOrient[9] );
|
|
|
|
|
|
protected:
|
|
vtkBoundedPlanePointPlacer();
|
|
~vtkBoundedPlanePointPlacer();
|
|
|
|
// Indicates the projection normal as laying along the
|
|
// XAxis, YAxis, ZAxis, or Oblique. For X, Y, and Z axes,
|
|
// the projection normal is assumed to be anchored at
|
|
// (0,0,0)
|
|
int ProjectionNormal;
|
|
|
|
// Indicates a distance from the origin of the projection
|
|
// normal where the project plane will be placed
|
|
double ProjectionPosition;
|
|
|
|
// If the ProjectionNormal is oblique, this is the oblique
|
|
// plane
|
|
vtkPlane *ObliquePlane;
|
|
|
|
// A collection of planes used to bound the projection
|
|
// plane
|
|
vtkPlaneCollection *BoundingPlanes;
|
|
|
|
// Internal method for getting the project normal as a vector
|
|
void GetProjectionNormal( double normal[3] );
|
|
|
|
// Internal method for getting the origin of the
|
|
// constraining plane as a 3-tuple
|
|
void GetProjectionOrigin( double origin[3] );
|
|
|
|
// Internal method for getting the orientation of
|
|
// the projection plane
|
|
void GetCurrentOrientation( double worldOrient[9] );
|
|
|
|
// Calculate the distance of a point from the Object. Negative
|
|
// values imply that the point is outside. Positive values imply that it is
|
|
// inside. The closest point to the object is returned in closestPt.
|
|
static double GetDistanceFromObject( double pos[3],
|
|
vtkPlaneCollection * pc,
|
|
double closestPt[3]);
|
|
|
|
private:
|
|
vtkBoundedPlanePointPlacer(const vtkBoundedPlanePointPlacer&) VTK_DELETE_FUNCTION;
|
|
void operator=(const vtkBoundedPlanePointPlacer&) VTK_DELETE_FUNCTION;
|
|
};
|
|
|
|
#endif
|