| // 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 <set> | |
| // 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<Segment>; | |
| 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<Segment, OrderBySlope>; | |
| // 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 |