15#ifndef O2_MCH_CONTOUR_CONTOURCREATOR_H
16#define O2_MCH_CONTOUR_CONTOURCREATOR_H
37 if (polygons.empty()) {
42 throw std::invalid_argument(
"polygons should be oriented counterclockwise");
46 if (polygons.size() == 1) {
49 return trivialContour;
54 sortVerticalEdges(polygonVerticalEdges);
60 std::vector<impl::VerticalEdge<T>> contourVerticalEdges{
impl::sweep(segmentTree.get(), polygonVerticalEdges)};
72 std::vector<o2::mch::contour::Polygon<T>> polygons;
73 for (
const auto&
c :
list) {
74 for (
auto j = 0;
j <
c.size(); ++
j) {
75 polygons.push_back(
c[
j]);
Contour< T > & addPolygon(const Polygon< T > &polygon)
std::vector< VerticalEdge< T > > sweep(Node< T > *segmentTree, const std::vector< VerticalEdge< T > > &polygonVerticalEdges)
std::vector< VerticalEdge< T > > getVerticalEdges(const Polygon< T > &polygon)
std::vector< HorizontalEdge< T > > verticalsToHorizontals(const std::vector< VerticalEdge< T > > &verticals)
Contour< T > finalizeContour(const std::vector< VerticalEdge< T > > &verticals, const std::vector< HorizontalEdge< T > > &horizontals)
std::vector< T > getYPositions(const std::vector< Polygon< T > > &polygons)
Node< T > * createSegmentTree(std::vector< T > values)
Contour< T > createContour(const std::vector< Polygon< T > > &polygons)
Contour< T > getEnvelop(const std::vector< Contour< T > > &list)
bool isCounterClockwiseOriented(const std::vector< T > &polygons)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...