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.

218 lines
7.0 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) override;
//@}
//@{
/**
* 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]) override;
/**
* 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.
*/
int ComputeWorldPosition(vtkRenderer* ren, double displayPos[2], double refWorldPos[3],
double worldPos[3], double worldOrient[9]) override;
/**
* 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]) override;
// Descrption:
// Orientationation is ignored, and the above method
// is called instead.
int ValidateWorldPosition(double worldPos[3], double worldOrient[9]) override;
/**
* 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.
*/
int UpdateWorldPosition(vtkRenderer* ren, double worldPos[3], double worldOrient[9]) override;
protected:
vtkBoundedPlanePointPlacer();
~vtkBoundedPlanePointPlacer() override;
// 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&) = delete;
void operator=(const vtkBoundedPlanePointPlacer&) = delete;
};
#endif