// Copyright 2023 Google LLC // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. #ifndef EventQueueInterface_DEFINED #define EventQueueInterface_DEFINED #include "modules/bentleyottmann/include/Point.h" #include "modules/bentleyottmann/include/Segment.h" #include // The EventQueueInterface and the SweepLineInterface allow the EventQueue and the SweepLine // to be tested independently of each other. This allows very specific scenarios to be setup and // tested in isolation. namespace bentleyottmann { // -- EventQueueInterface -------------------------------------------------------------------------- // An EventQueueInterface implementation must be able to add crossing events into the event queue. class EventQueueInterface { public: EventQueueInterface() = default; EventQueueInterface(const EventQueueInterface&) = default; EventQueueInterface(EventQueueInterface&&) = default; EventQueueInterface& operator=(const EventQueueInterface&) = default; EventQueueInterface& operator=(EventQueueInterface&&) = default; virtual ~EventQueueInterface() = default; virtual void addCrossing(Point crossingPoint, const Segment& s0, const Segment& s1) = 0; }; using DeletionSegmentSet = std::set; struct OrderBySlope { bool operator()(const Segment& s0, const Segment& s1) const; }; // The set of insertion segments is ordered by slope. Since all the lines pass through the same // point, then the slope of each line must be ordered from smallest to largest to keep the // segment order correct in the sweep line. using InsertionSegmentSet = std::set; // The EventQueue uses an object of SweepLineInterface to find new crossings when manipulating // the sweep line. class SweepLineInterface { public: virtual ~SweepLineInterface() = default; // These are the segments to remove from the sweep line. virtual void handleDeletions(Point eventPoint, const DeletionSegmentSet& removing) = 0; // Insert inserting into the sweep line. Check the inserting segments against the existing // sweep line segments and report any crossings using the addCrossing from the // EventQueueInterface. virtual void handleInsertionsAndCheckForNewCrossings( Point eventPoint, const InsertionSegmentSet& inserting, EventQueueInterface* queue) = 0; }; } // namespace bentleyottmann #endif // EventQueueInterface_DEFINED