Page MenuHomePhabricator

0001-Plane-geometry-data-mapper-crash-and-correctness-fix.patch

Authored By
khlebnikov
Aug 19 2015, 6:50 PM
Size
4 KB
Referenced Files
None
Subscribers
None

0001-Plane-geometry-data-mapper-crash-and-correctness-fix.patch

From 0c83dd214e7211782917bd1caed232af53094499 Mon Sep 17 00:00:00 2001
From: Rostislav Khlebnikov <r.khlebnikov@gmail.com>
Date: Mon, 10 Aug 2015 18:18:58 +0100
Subject: [PATCH 1/2] Plane geometry data mapper crash and correctness fix
---
.../Rendering/mitkPlaneGeometryDataMapper2D.cpp | 52 +++++++++++-----------
1 file changed, 27 insertions(+), 25 deletions(-)
diff --git a/Modules/Core/src/Rendering/mitkPlaneGeometryDataMapper2D.cpp b/Modules/Core/src/Rendering/mitkPlaneGeometryDataMapper2D.cpp
index 47e5192..3b8c128 100644
--- a/Modules/Core/src/Rendering/mitkPlaneGeometryDataMapper2D.cpp
+++ b/Modules/Core/src/Rendering/mitkPlaneGeometryDataMapper2D.cpp
@@ -40,6 +40,10 @@ See LICENSE.txt or http://www.mitk.org for details.
#include <vtkPolyData.h>
#include <vtkPolyDataMapper2D.h>
+#include <boost/icl/interval.hpp>
+#include <boost/icl/interval_set.hpp>
+
+
mitk::PlaneGeometryDataMapper2D::AllInstancesContainer mitk::PlaneGeometryDataMapper2D::s_AllInstances;
// input for this mapper ( = PlaneGeometryData)
@@ -178,12 +182,16 @@ void mitk::PlaneGeometryDataMapper2D::CreateVtkCrosshair(mitk::BaseRenderer *ren
// Then, clip this line with the (transformed) bounding box of the
// reference geometry.
- Line3D::BoxLineIntersection(
+ int nIntersections = Line3D::BoxLineIntersection(
boundingBoxMin[0], boundingBoxMin[1], boundingBoxMin[2],
boundingBoxMax[0], boundingBoxMax[1], boundingBoxMax[2],
indexLinePoint, indexLineDirection,
point1, point2 );
+ if (nIntersections < 2) {
+ return;
+ }
+
referenceGeometry->IndexToWorld(point1,point1);
referenceGeometry->IndexToWorld(point2,point2);
crossLine.SetPoints(point1,point2);
@@ -200,14 +208,13 @@ void mitk::PlaneGeometryDataMapper2D::CreateVtkCrosshair(mitk::BaseRenderer *ren
NodesVectorType::iterator otherPlanesIt = m_OtherPlaneGeometries.begin();
NodesVectorType::iterator otherPlanesEnd = m_OtherPlaneGeometries.end();
- std::vector<Point3D> intersections;
-
- intersections.push_back(point1);
-
otherPlanesIt = m_OtherPlaneGeometries.begin();
int gapsize = 32;
- this->GetDataNode()->GetPropertyValue( "Crosshair.Gap Size",gapsize, NULL );
+ this->GetDataNode()->GetPropertyValue("Crosshair.Gap Size", gapsize, NULL);
+
+ boost::icl::interval_set<double> intervals;
+ intervals += boost::icl::interval<double>::closed(0, 1);
ScalarType lineLength = point1.EuclideanDistanceTo(point2);
DisplayGeometry *displayGeometry = renderer->GetDisplayGeometry();
@@ -218,35 +225,30 @@ void mitk::PlaneGeometryDataMapper2D::CreateVtkCrosshair(mitk::BaseRenderer *ren
while ( otherPlanesIt != otherPlanesEnd )
{
+ bool ignorePlane = false;
+ (*otherPlanesIt)->GetPropertyValue("Crosshair.Ignore", ignorePlane);
+ if (ignorePlane)
+ {
+ ++otherPlanesIt;
+ continue;
+ }
+
PlaneGeometry *otherPlane = static_cast< PlaneGeometry * >(
static_cast< PlaneGeometryData * >((*otherPlanesIt)->GetData() )->GetPlaneGeometry() );
if (otherPlane != inputPlaneGeometry && otherPlane != worldPlaneGeometry)
{
- Point3D planeIntersection;
- otherPlane->IntersectionPoint(crossLine,planeIntersection);
- ScalarType sectionLength = point1.EuclideanDistanceTo(planeIntersection);
- ScalarType lineValue = sectionLength/lineLength;
- if(lineValue-gapSizeParam > 0.0)
- intersections.push_back(crossLine.GetPoint(lineValue-gapSizeParam));
- else intersections.pop_back();
- if(lineValue+gapSizeParam < 1.0)
- intersections.push_back(crossLine.GetPoint(lineValue+gapSizeParam));
+ double intersectionParam;
+ if (otherPlane->IntersectionPointParam(crossLine, intersectionParam) && intersectionParam > 0 && intersectionParam < 1) {
+ intervals -= boost::icl::interval<double>::open(intersectionParam - gapSizeParam, intersectionParam + gapSizeParam);
+ }
}
++otherPlanesIt;
}
- if(intersections.size()%2 == 1)
- intersections.push_back(point2);
- if(intersections.empty())
- {
- this->DrawLine(point1,point2,lines,points);
+ for (const auto& interval : intervals) {
+ this->DrawLine(crossLine.GetPoint(interval.lower()), crossLine.GetPoint(interval.upper()), lines, points);
}
- else
- for(unsigned int i = 0 ; i< intersections.size()-1 ; i+=2)
- {
- this->DrawLine(intersections[i],intersections[i+1],lines,points);
- }
// Add the points to the dataset
linesPolyData->SetPoints(points);
--
1.8.4.msysgit.0

File Metadata

Mime Type
text/plain
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1214
Default Alt Text
0001-Plane-geometry-data-mapper-crash-and-correctness-fix.patch (4 KB)