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.
121 lines
4.0 KiB
C
121 lines
4.0 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkInteractorStyleRubberBandZoom.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 vtkInteractorStyleRubberBandZoom
|
||
|
* @brief zoom in by amount indicated by rubber band box
|
||
|
*
|
||
|
* This interactor style allows the user to draw a rectangle in the render
|
||
|
* window using the left mouse button. When the mouse button is released,
|
||
|
* the current camera zooms by an amount determined from the shorter side of
|
||
|
* the drawn rectangle.
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkInteractorStyleRubberBandZoom_h
|
||
|
#define vtkInteractorStyleRubberBandZoom_h
|
||
|
|
||
|
#include "vtkInteractionStyleModule.h" // For export macro
|
||
|
#include "vtkInteractorStyle.h"
|
||
|
#include "vtkRect.h" // for vtkRecti
|
||
|
|
||
|
class vtkUnsignedCharArray;
|
||
|
|
||
|
class VTKINTERACTIONSTYLE_EXPORT vtkInteractorStyleRubberBandZoom : public vtkInteractorStyle
|
||
|
{
|
||
|
public:
|
||
|
static vtkInteractorStyleRubberBandZoom* New();
|
||
|
vtkTypeMacro(vtkInteractorStyleRubberBandZoom, vtkInteractorStyle);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* When set to true (default, false), the interactor will lock the rendered box to the
|
||
|
* viewport's aspect ratio.
|
||
|
*/
|
||
|
vtkSetMacro(LockAspectToViewport, bool);
|
||
|
vtkGetMacro(LockAspectToViewport, bool);
|
||
|
vtkBooleanMacro(LockAspectToViewport, bool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* When set to true (default, false), the position where the user starts the
|
||
|
* interaction is treated as the center of the box rather that one of the
|
||
|
* corners of the box.
|
||
|
*
|
||
|
* During interaction, modifier keys `Shift` or `Control` can be used to toggle
|
||
|
* this flag temporarily. In other words, if `Shift` or `Control` key is pressed,
|
||
|
* this class will act as if CenterAtStartPosition was opposite of what it is
|
||
|
* set to.
|
||
|
*/
|
||
|
vtkSetMacro(CenterAtStartPosition, bool);
|
||
|
vtkGetMacro(CenterAtStartPosition, bool);
|
||
|
vtkBooleanMacro(CenterAtStartPosition, bool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* If camera is in perspective projection mode, this interactor style uses
|
||
|
* vtkCamera::Dolly to dolly the camera ahead for zooming. However, that can
|
||
|
* have unintended consequences such as the camera entering into the data.
|
||
|
* Another option is to use vtkCamera::Zoom instead. In that case, the camera
|
||
|
* position is left unchanged, instead the focal point is changed to the
|
||
|
* center of the target box and then the view angle is changed to zoom in.
|
||
|
* To use this approach, set this parameter to false (default, true).
|
||
|
*/
|
||
|
vtkSetMacro(UseDollyForPerspectiveProjection, bool);
|
||
|
vtkGetMacro(UseDollyForPerspectiveProjection, bool);
|
||
|
vtkBooleanMacro(UseDollyForPerspectiveProjection, bool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Event bindings
|
||
|
*/
|
||
|
void OnMouseMove() override;
|
||
|
void OnLeftButtonDown() override;
|
||
|
void OnLeftButtonUp() override;
|
||
|
//@}
|
||
|
|
||
|
protected:
|
||
|
vtkInteractorStyleRubberBandZoom();
|
||
|
~vtkInteractorStyleRubberBandZoom() override;
|
||
|
|
||
|
void Zoom() override;
|
||
|
|
||
|
int StartPosition[2];
|
||
|
int EndPosition[2];
|
||
|
int Moving;
|
||
|
bool LockAspectToViewport;
|
||
|
bool CenterAtStartPosition;
|
||
|
bool UseDollyForPerspectiveProjection;
|
||
|
vtkUnsignedCharArray* PixelArray;
|
||
|
|
||
|
private:
|
||
|
vtkInteractorStyleRubberBandZoom(const vtkInteractorStyleRubberBandZoom&) = delete;
|
||
|
void operator=(const vtkInteractorStyleRubberBandZoom&) = delete;
|
||
|
|
||
|
/**
|
||
|
* Adjust the box based on this->LockAspectToViewport and
|
||
|
* this->CenterAtStartPosition state. This may modify startPosition,
|
||
|
* endPosition or both.
|
||
|
*/
|
||
|
void AdjustBox(int startPosition[2], int endPosition[2]) const;
|
||
|
|
||
|
void ZoomTraditional(const vtkRecti& box);
|
||
|
void ZoomPerspectiveProjectionUsingViewAngle(const vtkRecti& box);
|
||
|
};
|
||
|
|
||
|
#endif
|