16 #include <vtkCellArray.h> 17 #include <vtkCellData.h> 18 #include <vtkCutter.h> 19 #include <vtkDataArray.h> 20 #include <vtkDataObject.h> 21 #include <vtkDataSetWriter.h> 22 #include <vtkFloatArray.h> 23 #include <vtkGlyph2D.h> 24 #include <vtkGlyphSource2D.h> 25 #include <vtkImageData.h> 26 #include <vtkImageReslice.h> 27 #include <vtkIndent.h> 28 #include <vtkLinearTransform.h> 29 #include <vtkLookupTable.h> 30 #include <vtkLookupTable.h> 34 #include <vtkMatrix4x4.h> 35 #include <vtkMatrixToLinearTransform.h> 38 #include <vtkPointData.h> 39 #include <vtkPoints.h> 40 #include <vtkPolyData.h> 41 #include <vtkPolyData.h> 42 #include <vtkPolyDataMapper.h> 43 #include <vtkScalarsToColors.h> 44 #include <vtkScalarsToColors.h> 45 #include <vtkTransform.h> 80 vtkImageData *vtkImage = input->GetVtkImageData(this->
GetCurrentTimeStep(input, renderer));
90 if (worldPlaneGeometry.IsNotNull())
93 point = worldPlaneGeometry->GetOrigin();
94 normal = worldPlaneGeometry->GetNormal();
96 m_Plane->SetTransform((vtkAbstractTransform *)
nullptr);
100 itkWarningMacro(<<
"worldPlaneGeometry is nullptr!");
104 double vp[3], vp_slice[3], vnormal[3];
105 vnl2vtk(point.GetVnlVector(), vp);
106 vnl2vtk(normal.GetVnlVector(), vnormal);
116 vtkTransform *world2vtk = vtkTransform::New();
117 world2vtk->Identity();
118 world2vtk->Concatenate(vtktransform->GetLinearInverse());
120 world2vtk->GetScale(myscale);
121 world2vtk->PostMultiply();
122 world2vtk->Scale(1 / myscale[0], 1 / myscale[1], 1 / myscale[2]);
123 world2vtk->TransformPoint(vp, vp);
124 world2vtk->TransformNormalAtPoint(vp, vnormal, vnormal);
135 vtkImage->GetDimensions(dims);
137 vtkImage->GetSpacing(spac);
141 if (fabs(vnormal[0]) > fabs(vnormal[1]) && fabs(vnormal[0]) > fabs(vnormal[2]))
143 if (fabs(vp_slice[0] / spac[0]) < 0.4)
144 vp_slice[0] = 0.4 * spac[0];
145 if (fabs(vp_slice[0] / spac[0]) > (dims[0] - 1) - 0.4)
146 vp_slice[0] = ((dims[0] - 1) - 0.4) * spac[0];
151 if (fabs(vnormal[1]) > fabs(vnormal[0]) && fabs(vnormal[1]) > fabs(vnormal[2]))
153 if (fabs(vp_slice[1] / spac[1]) < 0.4)
154 vp_slice[1] = 0.4 * spac[1];
155 if (fabs(vp_slice[1] / spac[1]) > (dims[1] - 1) - 0.4)
156 vp_slice[1] = ((dims[1] - 1) - 0.4) * spac[1];
161 if (fabs(vnormal[2]) > fabs(vnormal[1]) && fabs(vnormal[2]) > fabs(vnormal[0]))
163 if (fabs(vp_slice[2] / spac[2]) < 0.4)
164 vp_slice[2] = 0.4 * spac[2];
165 if (fabs(vp_slice[2] / spac[2]) > (dims[2] - 1) - 0.4)
166 vp_slice[2] = ((dims[2] - 1) - 0.4) * spac[2];
174 vtkPolyData *cuttedPlane;
175 if (!((dims[0] == 1 && vnormal[0] != 0) || (dims[1] == 1 && vnormal[1] != 0) || (dims[2] == 1 && vnormal[2] != 0)))
181 cuttedPlane =
m_Cutter->GetOutput();
187 cuttedPlane = vtkPolyData::New();
188 vtkPoints *points = vtkPoints::New();
189 points->SetNumberOfPoints(vtkImage->GetNumberOfPoints());
190 for (
int i = 0; i < vtkImage->GetNumberOfPoints(); i++)
191 points->SetPoint(i, vtkImage->GetPoint(i));
192 cuttedPlane->SetPoints(points);
193 vtkFloatArray *pointdata = vtkFloatArray::New();
194 int comps = vtkImage->GetPointData()->GetScalars()->GetNumberOfComponents();
195 pointdata->SetNumberOfComponents(comps);
196 int tuples = vtkImage->GetPointData()->GetScalars()->GetNumberOfTuples();
197 pointdata->SetNumberOfTuples(tuples);
198 for (
int i = 0; i < tuples; i++)
199 pointdata->SetTuple(i, vtkImage->GetPointData()->GetScalars()->GetTuple(i));
200 pointdata->SetName(
"vector");
201 cuttedPlane->GetPointData()->AddArray(pointdata);
204 if (cuttedPlane->GetNumberOfPoints() != 0)
209 vtkPointData *pointData = cuttedPlane->GetPointData();
210 if (pointData ==
nullptr)
212 itkWarningMacro(<<
"no point data associated with cutters result!");
215 if (pointData->GetNumberOfArrays() == 0)
217 itkWarningMacro(<<
"point data returned by cutter doesn't have any arrays associated!");
220 else if (pointData->GetArray(0)->GetNumberOfComponents() <= 1)
222 itkWarningMacro(<<
"number of components <= 1!");
225 else if (pointData->GetArrayName(0) ==
nullptr)
227 pointData->GetArray(0)->SetName(
"vector");
236 vtkIdType numPoints, pointId;
237 numPoints = cuttedPlane->GetNumberOfPoints();
238 vtkDataArray *inVectors = cuttedPlane->GetPointData()->GetVectors(
"vector");
239 assert(inVectors !=
nullptr);
240 vtkFloatArray *vectorMagnitudes = vtkFloatArray::New();
241 vectorMagnitudes->SetName(
"vectorMagnitudes");
242 vectorMagnitudes->SetNumberOfComponents(1);
243 vectorMagnitudes->SetNumberOfValues(numPoints);
244 vectorMagnitudes->SetNumberOfTuples(numPoints);
245 double inVector[3], outVector[3], wnormal[3];
247 vnl2vtk(normal.GetVnlVector(), wnormal);
251 for (pointId = 0; pointId < numPoints; ++pointId)
253 inVectors->GetTuple(pointId, inVector);
256 vnl_vector<double> tmp(3);
261 k = vtkMath::Dot(wnormal, inVector);
263 outVector[0] = inVector[0] - (wnormal[0] *
k);
264 outVector[1] = inVector[1] - (wnormal[1] *
k);
265 outVector[2] = inVector[2] - (wnormal[2] *
k);
266 inVectors->SetTuple(pointId, outVector);
269 vectorMagnitudes->SetValue(pointId, vtkMath::Norm(outVector));
274 pointData->AddArray(vectorMagnitudes);
275 pointData->CopyAllOn();
283 vtkGlyphSource2D *glyphSource = vtkGlyphSource2D::New();
285 glyphSource->DashOn();
289 glyphSource->CrossOff();
294 vtkImage->GetSpacing(spacing);
295 double min = spacing[0];
296 min = min > spacing[1] ? spacing[1] :
min;
297 min = min > spacing[2] ? spacing[2] :
min;
302 if (mitkScaleProp.IsNotNull())
304 scale = mitkScaleProp->GetValue();
308 glyphGenerator->SetSourceData(glyphSource->GetOutput());
309 glyphGenerator->
SetInput(cuttedPlane);
310 glyphGenerator->SetInputArrayToProcess(1, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS,
"vector");
311 glyphGenerator->SetVectorModeToUseVector();
312 glyphGenerator->OrientOn();
313 glyphGenerator->SetScaleFactor(min * scale);
314 glyphGenerator->SetUseMaskPoints(
true);
316 glyphGenerator->SetMaximumNumberOfPoints(128 * 128);
318 glyphGenerator->Update();
333 if (mitkColorProp.IsNotNull())
335 color = mitkColorProp->GetColor();
347 if (mitkLWidthProp.IsNotNull())
349 lwidth = mitkLWidthProp->GetValue();
352 vtkTransform *trafo = vtkTransform::New();
354 trafo->Concatenate(vtktransform);
355 trafo->PreMultiply();
357 trafo->GetScale(myscale);
358 trafo->Scale(1 / myscale[0], 1 / myscale[1], 1 / myscale[2]);
369 vectorMagnitudes->Delete();
370 glyphSource->Delete();
371 glyphGenerator->Delete();
376 std::cout <<
" no points cutted!" << std::endl;
383 vtkLinearTransform *vtktransform,
385 vtkScalarsToColors *lut,
390 vtkPoints *points = glyphs->GetPoints();
391 vtkPointData *vpointdata = glyphs->GetPointData();
392 vtkDataArray *vpointscalars = vpointdata->GetArray(
"vectorMagnitudes");
394 assert(vpointscalars !=
nullptr);
404 for (
auto &elem : offset)
409 vtkIdType numCells = glyphs->GetNumberOfCells();
410 for (vtkIdType cellId = 0; cellId < numCells; ++cellId)
414 cell = glyphs->GetCell(cellId);
415 idList = cell->GetPointIds();
417 int numPoints = idList->GetNumberOfIds();
422 double pos[3], vp_raster[3];
423 points->GetPoint(idList->GetId(0), vp);
424 vp_raster[0] = vtkMath::Round(vp[0] / spacing[0]) * spacing[0];
425 vp_raster[1] = vtkMath::Round(vp[1] / spacing[1]) * spacing[1];
426 vp_raster[2] = vtkMath::Round(vp[2] / spacing[2]) * spacing[2];
427 vtktransform->TransformPoint(vp_raster, pos);
428 offset[0] = pos[0] - vp[0];
429 offset[1] = pos[1] - vp[1];
430 offset[2] = pos[2] - vp[2];
435 glBegin(GL_LINE_LOOP);
437 for (
int pointNr = 0; pointNr < numPoints; ++pointNr)
439 points->GetPoint(idList->GetId(pointNr), vp);
441 vp[0] = vp[0] + offset[0];
442 vp[1] = vp[1] + offset[1];
443 vp[2] = vp[2] + offset[2];
446 vtktransform->TransformPoint(vp, tmp);
458 if (vpointscalars !=
nullptr)
460 vpointscalars->GetComponent(pointNr, 0);
461 color = lut->GetColor(vpointscalars->GetComponent(idList->GetId(pointNr), 0));
462 glColor3f(color[0], color[1], color[2]);
467 glColor3f(color.GetRed(), color.GetGreen(), color.GetBlue());
472 glVertex2f(p2d[0], p2d[1]);
491 if (
m_LUT !=
nullptr)
505 if ((dataTimeGeometry ==
nullptr) || (dataTimeGeometry->
CountTimeSteps() == 0))
507 itkWarningMacro(<<
"The given object is missing a mitk::TimeGeometry, or the number of time steps is 0!");
519 if (time > itk::NumericTraits<mitk::ScalarType>::NonpositiveMin())
523 itkWarningMacro(<< timestep <<
" is not a valid time of the given data object!");
mitk::BaseProperty * GetProperty(const char *propertyKey, const mitk::BaseRenderer *renderer=nullptr, bool fallBackOnDataProperties=true) const
Get the property (instance of BaseProperty) with key propertyKey from the PropertyList of the rendere...
ScalarType GetTime() const
Get the time in ms of the currently displayed content.
virtual TimeStepType CountTimeSteps() const =0
Returns the number of time steps.
Base of all data objects.
virtual DataNode * GetDataNode() const
Get the DataNode containing the data to map. Method only returns valid DataNode Pointer if the mapper...
mitk::Image::ConstPointer m_Image
Organizes the rendering process.
void vtk2vnl(const Tin *in, vnl_vector< Tout > &out)
static vtkMaskedGlyph3D * New()
virtual void PaintCells(vtkPolyData *contour, const PlaneGeometry *, vtkLinearTransform *vtktransform, BaseRenderer *renderer, vtkScalarsToColors *lut, mitk::Color color, float lwidth, double *spacing)
virtual const PlaneGeometry * GetCurrentWorldPlaneGeometry()
Get the current 2D-worldgeometry (m_CurrentWorldPlaneGeometry) used for 2D-rendering.
void Paint(mitk::BaseRenderer *renderer) override
Do the painting into the renderer.
bool GetBoolProperty(const char *propertyKey, bool &boolValue, const mitk::BaseRenderer *renderer=nullptr) const
Convenience access method for bool properties (instances of BoolProperty)
void WorldToDisplay(const Point3D &worldIndex, Point2D &displayPoint) const
This method converts a 3D world index to the display point using the geometry of the renderWindow...
~VectorImageMapper2D() override
The ColorProperty class RGB color property.
void SetRandomMode(int mode)
BaseData * GetData() const
Get the data object (instance of BaseData, e.g., an Image) managed by this DataNode.
virtual void SetInput(vtkDataSet *input)
void vnl2vtk(const vnl_vector< Tin > &in, Tout *out)
const mitk::Image * GetInput(void)
virtual TimeStepType TimePointToTimeStep(TimePointType timePoint) const =0
Converts a time point to the corresponding time step.
mitk::DataNode * m_DataNode
Image class for storing images.
bool GetVisibility(bool &visible, const mitk::BaseRenderer *renderer, const char *propertyKey="visible") const
Convenience access method for visibility properties (instances of BoolProperty with property-key "vis...
void vtk2itk(const Tin &in, Tout &out)
vtkLinearTransform * GetVtkTransform(int t=0) const
Get the transformation applied prior to displaying the data as a vtkTransform.
itk::RGBPixel< float > Color
Color Standard RGB color typedef (float)
void Normalize(itk::Image< TPixel, VImageDimension > *itkImage, mitk::Image::Pointer im2, mitk::Image::Pointer mask1, std::string output)
const mitk::TimeGeometry * GetUpdatedTimeGeometry()
Return the TimeGeometry of the data.
int GetCurrentTimeStep(mitk::BaseData *data, mitk::BaseRenderer *renderer)
Describes a two-dimensional, rectangular plane.
virtual bool IsValidTimeStep(TimeStepType timeStep) const =0
Test for the given time step if a geometry is availible.