7 #ifndef Navigation_SweepLinePolylineSimplifier_H
8 #define Navigation_SweepLinePolylineSimplifier_H
21 class ChannelComputerConfig;
22 class ScopedDisplayList;
24 class PolylineExtremityContext
27 PolylineExtremityContext() : m_useStartAsInput(false), m_useEndAsInput(false), m_startCanBeMoved(false), m_endCanBeMoved(false) {}
30 bool m_useStartAsInput;
32 bool m_startCanBeMoved;
41 class ChannelBorderSimplifier
44 ChannelBorderSimplifier();
45 ~ChannelBorderSimplifier();
48 void Initialize(Database* database,
const Vec3f& edgeStartPos,
const Vec2f& pathEdgeDir2d,
KyFloat32 pathEdgeLength);
49 void SetSmoothingAngle(
KyFloat32 angleInDegrees);
51 KyResult SimplifyOnLeft(
const SharedPoolList<PolylineCastIntersector::BorderEdge>& leftBorders, PolylineExtremityContext& extremityContext);
52 KyResult SimplifyOnRight(
const SharedPoolList<PolylineCastIntersector::BorderEdge>& rightBorders, PolylineExtremityContext& extremityContext);
53 KyResult Simplify(
const SharedPoolList<PolylineCastIntersector::BorderEdge>& borders,
bool onLeft, PolylineExtremityContext& extremityContext);
54 void ProcessExtremity(SharedPoolList<Vec2f>& polyline, PolylineExtremityContext& extremityContext);
56 Vec3f GetGlobalPosFromLocalPos(
const Vec2f& localPos)
58 return m_edgeStartPos + Vec3f(localPos.x * m_edgeDir2d + localPos.y * m_edgeDir2d.PerpCCW());
63 return GetGlobalPosFromLocalPos(Vec2f(x, y));
67 void RemoveNoiseInPolyline(SharedPoolList<Vec2f>& polyline);
69 void CreatePolylineFromBorder(
const SharedPoolList<PolylineCastIntersector::BorderEdge>& borderEdgeList,
70 SharedPoolList<Vec2f>& borderPolyline);
72 KyResult SwapXAndYCoordinatesToEdgeLocal(SharedPoolList<Vec2f>& polyline);
74 void FixXCoordinatesOrder(SharedPoolList<Vec2f>& polyline);
75 void MoveYPositionOfAllPoints(SharedPoolList<Vec2f>& polyline);
77 void FixPolylineAroundStartPoint(SharedPoolList<Vec2f>& polyline,
KyFloat32& xCoordinate,
KyFloat32& yCoordinate,
bool canMovePoint);
78 void FixPolylineAroundEndPoint(SharedPoolList<Vec2f>& polyline,
KyFloat32& xCoordinate,
KyFloat32& yCoordinate,
bool canMovePoint);
82 class PolylineDisplayConfig
85 PolylineDisplayConfig() { SetDefaults(); }
93 VisualShapeColor m_arrowColor;
96 void RenderBorderEdges(
const char* listName, VisualColor visualColor,
const SharedPoolList<PolylineCastIntersector::BorderEdge>& leftBorders);
97 void RenderPolyline(
const char* listName, VisualColor visualColor, SharedPoolList<Vec2f>& polyline,
bool hideByDefault =
true);
100 void EraseCurrentPoint(SharedPoolList<Vec2f>& polyline,
101 SharedPoolList<Vec2f>::Iterator& previous,
102 SharedPoolList<Vec2f>::Iterator& current,
103 SharedPoolList<Vec2f>::Iterator& next);
106 Database* m_database;
108 SharedPoolList<Vec2f> m_leftPolyline;
109 SharedPoolList<Vec2f> m_rightPolyline;
110 SharedPoolList<Vec2f>::NodePool m_positionPool;
113 Vec3f m_edgeStartPos;
122 bool m_advancedVisualDebuggingEnabled;
126 class SweepLinePolylineSimplifier
130 ~SweepLinePolylineSimplifier() { Clear(); }
134 KyResult Simplify(SharedPoolList<Vec2f>& polyline);
136 static bool CompVec2fY(
const Vec2f& p0,
const Vec2f& p1) {
return (p0.y < p1.y) || (p0.y == p1.y && p0.x < p1.x); }
137 static bool IsSlope1StrictlyGreaterThanSlope2(
const Vec2f& slope1,
const Vec2f& slope2)
139 return (fabsf(slope1.y * slope2.x) > fabsf(slope1.x * slope2.y));
142 KyResult ConsumeInputPolyline(
const SharedPoolList<Vec2f>& inPolyline);
144 KyResult BuildOutput(SharedPoolList<Vec2f>& polyline);
146 SharedPoolList<Vec2f>::Iterator GetAndPopPointToProcess();
148 KyResult SimplifyAfterPolylinePoint(SharedPoolList<Vec2f>::Iterator pointIt);
149 KyResult SimplifyBeforePolylinePoint(SharedPoolList<Vec2f>::Iterator pointIt);
151 Vec2f GetMaxSlopeForPoint(
const Vec2f &point);
153 SharedPoolList<Vec2f>::Iterator ComputeFirstPointIteratorAfterLine(SharedPoolList<Vec2f>::Iterator firstPointItToCheck,
154 const Vec2f& lineStartPoint,
const Vec2f& lineSlope);
155 SharedPoolList<Vec2f>::Iterator ComputeFirstPointIteratorBeforeLine(SharedPoolList<Vec2f>::Iterator firstPointItToCheck,
156 const Vec2f& lineStartPoint,
const Vec2f& lineSlope);
158 SharedPoolList<Vec2f>::Iterator GetMoreConstraintSlopeForward(
const Vec2f& point, SharedPoolList<Vec2f>::Iterator currentIt);
159 SharedPoolList<Vec2f>::Iterator GetMoreConstraintSlopeBackward(
const Vec2f& point, SharedPoolList<Vec2f>::Iterator currentIt);
161 void RemoveFromWorkingPolyline(SharedPoolList<Vec2f>::Iterator firstIteratorToRemove, SharedPoolList<Vec2f>::Iterator stopAtThis);
164 SharedPoolList<Vec2f> m_workingPolyline;
165 SharedPoolList<Vec2f>::NodePool m_pointPool;
167 KyArrayCPP<SharedPoolList<Vec2f>::Iterator> m_openNodes;
181 KY_INLINE
KyResult ChannelBorderSimplifier::SimplifyOnLeft(
const SharedPoolList<PolylineCastIntersector::BorderEdge>& leftBorders, PolylineExtremityContext& extremityContext)
183 return Simplify(leftBorders,
true, extremityContext);
185 KY_INLINE
KyResult ChannelBorderSimplifier::SimplifyOnRight(
const SharedPoolList<PolylineCastIntersector::BorderEdge>& rightBorders, PolylineExtremityContext& extremityContext)
187 return Simplify(rightBorders,
false, extremityContext);
192 #endif // Navigation_SweepLinePolylineSimplifier_H
KyInt32 KyResult
Defines a type that can be returned by methods or functions in the Gameware Navigation SDK to indicat...
Definition: types.h:254
static const VisualColor Yellow
Represents the color with RGBA values (255, 255, 0, 255).
Definition: visualcolor.h:236
Definition: gamekitcrowddispersion.h:20
float KyFloat32
Type used internally to represent a 32-bit floating-point number.
Definition: types.h:43