123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- #ifndef SWEEP_H
- #define SWEEP_H
- #include <vector>
- namespace p2t {
- class SweepContext;
- struct Node;
- struct Point;
- struct Edge;
- class Triangle;
- class Sweep
- {
- public:
-
- void Triangulate(SweepContext& tcx);
-
- ~Sweep();
- private:
-
- void SweepPoints(SweepContext& tcx);
-
- Node& PointEvent(SweepContext& tcx, Point& point);
-
- void EdgeEvent(SweepContext& tcx, Edge* edge, Node* node);
- void EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point);
-
- Node& NewFrontTriangle(SweepContext& tcx, Point& point, Node& node);
-
- void Fill(SweepContext& tcx, Node& node);
-
- bool Legalize(SweepContext& tcx, Triangle& t);
-
- bool Incircle(const Point& pa, const Point& pb, const Point& pc, const Point& pd) const;
-
- void RotateTrianglePair(Triangle& t, Point& p, Triangle& ot, Point& op) const;
-
- void FillAdvancingFront(SweepContext& tcx, Node& n);
-
-
- bool LargeHole_DontFill(const Node* node) const;
- bool AngleExceeds90Degrees(const Point* origin, const Point* pa, const Point* pb) const;
- bool AngleExceedsPlus90DegreesOrIsNegative(const Point* origin, const Point* pa, const Point* pb) const;
- double Angle(const Point* origin, const Point* pa, const Point* pb) const;
-
- double HoleAngle(const Node& node) const;
-
- double BasinAngle(const Node& node) const;
-
- void FillBasin(SweepContext& tcx, Node& node);
-
- void FillBasinReq(SweepContext& tcx, Node* node);
- bool IsShallow(SweepContext& tcx, Node& node);
- bool IsEdgeSideOfTriangle(Triangle& triangle, Point& ep, Point& eq);
- void FillEdgeEvent(SweepContext& tcx, Edge* edge, Node* node);
- void FillRightAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node);
- void FillRightBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
- void FillRightConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
- void FillRightConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
- void FillLeftAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node);
- void FillLeftBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
- void FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
- void FillLeftConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node);
- void FlipEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* t, Point& p);
-
- Triangle& NextFlipTriangle(SweepContext& tcx, int o, Triangle& t, Triangle& ot, Point& p, Point& op);
-
- Point& NextFlipPoint(Point& ep, Point& eq, Triangle& ot, Point& op);
-
- void FlipScanEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle& flip_triangle, Triangle& t, Point& p);
- void FinalizationPolygon(SweepContext& tcx);
- std::vector<Node*> nodes_;
- };
- }
- #endif
|