Mercurial > hg > orthanc-stone
diff OrthancStone/Sources/Toolbox/DicomStructureSet.cpp @ 1908:affde38b84de
moved tentative bgo reimplementation of rt-struct into graveyard
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 01 Feb 2022 08:38:32 +0100 |
parents | e318b524ad3f |
children | 782ba9eb6f22 |
line wrap: on
line diff
--- a/OrthancStone/Sources/Toolbox/DicomStructureSet.cpp Tue Feb 01 07:19:15 2022 +0100 +++ b/OrthancStone/Sources/Toolbox/DicomStructureSet.cpp Tue Feb 01 08:38:32 2022 +0100 @@ -57,7 +57,6 @@ # include <boost/geometry/geometries/polygon.hpp> # include <boost/geometry/multi/geometries/multi_polygon.hpp> #else -# include "DicomStructureSetUtils.h" // TODO REMOVE # include "UnionOfRectangles.h" #endif @@ -117,38 +116,8 @@ return r; } -#else - -namespace OrthancStone -{ - static RtStructRectangleInSlab CreateRectangle(float x1, float y1, - float x2, float y2) - { - RtStructRectangleInSlab rect; - rect.xmin = std::min(x1, x2); - rect.xmax = std::max(x1, x2); - rect.ymin = std::min(y1, y2); - rect.ymax = std::max(y1, y2); - return rect; - } +#endif - bool CompareRectanglesForProjection(const std::pair<RtStructRectangleInSlab,double>& r1, - const std::pair<RtStructRectangleInSlab, double>& r2) - { - return r1.second < r2.second; - } - - bool CompareSlabsY(const RtStructRectanglesInSlab& r1, - const RtStructRectanglesInSlab& r2) - { - if ((r1.size() == 0) || (r2.size() == 0)) - return false; - - return r1[0].ymax < r2[0].ymax; - } -} - -#endif namespace OrthancStone { @@ -921,7 +890,7 @@ } } -#elif 1 +#else std::list<Extent2D> rectangles; @@ -948,91 +917,8 @@ chains.push_back(*it); } -#else - // this will contain the intersection of the polygon slab with - // the cutting plane, projected on the cutting plane coord system - // (that yields a rectangle) + the Z coordinate of the polygon - // (this is required to group polygons with the same Z later) - std::vector<std::pair<RtStructRectangleInSlab, double> > projected; - - for (Polygons::const_iterator polygon = structure.polygons_.begin(); - polygon != structure.polygons_.end(); ++polygon) - { - double x1, y1, x2, y2; - - if (polygon->Project(x1, y1, x2, y2, slice, GetEstimatedNormal(), GetEstimatedSliceThickness())) - { - double curZ = polygon->GetGeometryOrigin()[2]; - - // x1,y1 and x2,y2 are in "slice" coordinates (the cutting plane - // geometry) - projected.push_back(std::make_pair(CreateRectangle( - static_cast<float>(x1), - static_cast<float>(y1), - static_cast<float>(x2), - static_cast<float>(y2)),curZ)); - } - } - - // projected contains a set of rectangles specified by two opposite - // corners (x1,y1,x2,y2) - // we need to merge them - // each slab yields ONE polygon! - - // we need to sorted all the rectangles that originate from the same Z - // into lanes. To make sure they are grouped together in the array, we - // sort it. - std::sort(projected.begin(), projected.end(), CompareRectanglesForProjection); - - std::vector<RtStructRectanglesInSlab> rectanglesForEachSlab; - rectanglesForEachSlab.reserve(projected.size()); - - double curZ = 0; - for (size_t i = 0; i < projected.size(); ++i) - { -#if 0 - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); -#else - if (i == 0) - { - curZ = projected[i].second; - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); - } - else - { - // this check is needed to prevent creating a new slab if - // the new polygon is at the same Z coord than last one - if (!LinearAlgebra::IsNear(curZ, projected[i].second)) - { - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); - curZ = projected[i].second; - } - } #endif - rectanglesForEachSlab.back().push_back(projected[i].first); - - // as long as they have the same y, we should put them into the same lane - // BUT in Sebastien's code, there is only one polygon per lane. - - //std::cout << "rect: xmin = " << rect.xmin << " xmax = " << rect.xmax << " ymin = " << rect.ymin << " ymax = " << rect.ymax << std::endl; - } - - // now we need to sort the slabs in increasing Y order (see ConvertListOfSlabsToSegments) - std::sort(rectanglesForEachSlab.begin(), rectanglesForEachSlab.end(), CompareSlabsY); - - std::vector< std::pair<ScenePoint2D, ScenePoint2D> > segments; - ConvertListOfSlabsToSegments(segments, rectanglesForEachSlab, projected.size()); - - chains.resize(segments.size()); - for (size_t i = 0; i < segments.size(); i++) - { - chains[i].resize(2); - chains[i][0] = segments[i].first; - chains[i][1] = segments[i].second; - } -#endif - return true; } else