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.

140 lines
4.5 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkDynamic2DLabelMapper.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.
=========================================================================*/
/*-------------------------------------------------------------------------
Copyright 2008 Sandia Corporation.
Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
the U.S. Government retains certain rights in this software.
-------------------------------------------------------------------------*/
/**
* @class vtkDynamic2DLabelMapper
* @brief draw text labels at 2D dataset points
*
* vtkDynamic2DLabelMapper is a mapper that renders text at dataset
* points such that the labels do not overlap.
* Various items can be labeled including point ids, scalars,
* vectors, normals, texture coordinates, tensors, and field data components.
* This mapper assumes that the points are located on the x-y plane
* and that the camera remains perpendicular to that plane with a y-up
* axis (this can be constrained using vtkImageInteractor).
* On the first render, the mapper computes the visiblility of all labels
* at all scales, and queries this information on successive renders.
* This causes the first render to be much slower. The visibility algorithm
* is a greedy approach based on the point id, so the label for a point
* will be drawn unless the label for a point with lower id overlaps it.
*
* @warning
* Use this filter in combination with vtkSelectVisiblePoints if you want
* to label only points that are visible. If you want to label cells rather
* than points, use the filter vtkCellCenters to generate points at the
* center of the cells. Also, you can use the class vtkIdFilter to
* generate ids as scalars or field data, which can then be labeled.
*
* @sa
* vtkLabeledDataMapper
*
* @par Thanks:
* This algorithm was developed in the paper
* Ken Been and Chee Yap. Dynamic Map Labeling. IEEE Transactions on
* Visualization and Computer Graphics, Vol. 12, No. 5, 2006. pp. 773-780.
*/
#ifndef vtkDynamic2DLabelMapper_h
#define vtkDynamic2DLabelMapper_h
#include "vtkLabeledDataMapper.h"
#include "vtkRenderingLabelModule.h" // For export macro
class VTKRENDERINGLABEL_EXPORT vtkDynamic2DLabelMapper : public vtkLabeledDataMapper
{
public:
//@{
/**
* Instantiate object with %%-#6.3g label format. By default, point ids
* are labeled.
*/
static vtkDynamic2DLabelMapper* New();
vtkTypeMacro(vtkDynamic2DLabelMapper, vtkLabeledDataMapper);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@}
/**
* Set the points array name to use to give priority to labels.
* Defaults to "priority".
*/
void SetPriorityArrayName(const char* name);
//@{
/**
* Whether to reverse the priority order (i.e. low values have high priority).
* Default is off.
*/
vtkSetMacro(ReversePriority, bool);
vtkGetMacro(ReversePriority, bool);
vtkBooleanMacro(ReversePriority, bool);
//@}
//@{
/**
* Set the label height padding as a percentage. The percentage
* is a percentage of your label height.
* Default is 50%.
*/
vtkSetMacro(LabelHeightPadding, float);
vtkGetMacro(LabelHeightPadding, float);
//@}
//@{
/**
* Set the label width padding as a percentage. The percentage
* is a percentage of your label ^height^ (yes, not a typo).
* Default is 50%.
*/
vtkSetMacro(LabelWidthPadding, float);
vtkGetMacro(LabelWidthPadding, float);
//@}
//@{
/**
* Draw non-overlapping labels to the screen.
*/
void RenderOpaqueGeometry(vtkViewport* viewport, vtkActor2D* actor) override;
void RenderOverlay(vtkViewport* viewport, vtkActor2D* actor) override;
//@}
protected:
vtkDynamic2DLabelMapper();
~vtkDynamic2DLabelMapper() override;
/**
* Calculate the current zoom scale of the viewport.
*/
double GetCurrentScale(vtkViewport* viewport);
float* LabelWidth;
float* LabelHeight;
float* Cutoff;
float ReferenceScale;
float LabelHeightPadding;
float LabelWidthPadding;
bool ReversePriority;
private:
vtkDynamic2DLabelMapper(const vtkDynamic2DLabelMapper&) = delete;
void operator=(const vtkDynamic2DLabelMapper&) = delete;
};
#endif