1
0
forked from 0ad/0ad
0ad/source/dcdt/se/FunnelDeque.h

110 lines
3.6 KiB
C
Raw Normal View History

//FunnelDeque.h
//DJD: definition of FunnelNode class {
#ifndef FUNNELDEQUE_H
#define FUNNELDEQUE_H
#include "sr_vec2.h"
#include "sr_polygon.h"
//define a floating point value for pi
#ifndef PI
#define PI 3.1415926535897932384626433832795f
#endif
//a node in the funnel deque
class FunnelNode
{
protected:
//left and right pointers (doubly-connected)
FunnelNode *m_CLeft;
FunnelNode *m_CRight;
//the vertex represented by this funnel node
SrPnt2 m_CPoint;
public:
//default constructor
FunnelNode();
//constructor - initializes the vertex coordinates
FunnelNode(float x, float y);
//constructor - initializes the vertex
FunnelNode(const SrPnt2& point);
//mutator for the left pointer
void Left(FunnelNode *left);
//mutator for the right pointer
void Right(FunnelNode *right);
//accessor for the left pointer
FunnelNode *Left();
//accessor for the right pointer
FunnelNode *Right();
//mutator for the vertex
void Point(const SrPnt2& point);
//accessor for the vertex
SrPnt2 Point();
//mutator for the vertex coordinates
void Point(float x, float y);
//accessor for the vertex x coordinate
float X();
//accessor for the vertex y coordinate
float Y();
};
//definition of FunnelNode class }
//DJD: definition of FunnelDeque class {
//the funnel deque used in the funnel algorithm
class FunnelDeque
{
public:
//different kinds of corners - point, left and right tangent
//(tangent to a circle around the corner, running along the side specified)
enum CornerType {Point, LeftTangent, RightTangent};
protected:
//left end, right end, and apex pointers for the deque
FunnelNode *m_CLeft;
FunnelNode *m_CRight;
FunnelNode *m_CApex;
//the corner type of the node at the apex
//(ones on the left side are all right tangent, ones on the right are all left tangent)
CornerType m_tApexType;
//radius of the unit for which we are finding the path
float m_dRadius;
//angle between the first and second points given their corner types
float Angle(float x_1, float y_1, CornerType type_1, float x_2, float y_2, CornerType type_2);
//constrains an angfle to the range (-PI, PI]
float AngleRange(float theta);
//returns the (Euclidean) distance between two points
float Distance(float x_1, float y_1, float x_2, float y_2);
//returns the angle between the given points
//(same as the angle to their tangents if they're the same type)
float ToTangent(float x_1, float y_1, float x_2, float y_2);
//returns the angle between tangents of the given points
//given whether the first is left tangent type, assuming the second is the opposite
float ToTangentAlt(float x_1, float y_1, float x_2, float y_2, bool LeftRight);
//returns the angle between the first point and a tangent to the second
//(the type of the second is specified)
float PointToTangent(float x_1, float y_1, float x_2, float y_2, bool Right);
//adds a given point to the path
void AddPoint(float x, float y, CornerType type, float angle, SrPolygon &path);
public:
//creates the funnel deque based on a starting point and radius
FunnelDeque(float x, float y, float r);
//copy constructor
FunnelDeque(const SrPnt2& point, float r);
//destructor
~FunnelDeque();
//adds a given point of a given type to the funnel deque, adding to the path if necessary
void Add(const SrPnt2& p, CornerType type, SrPolygon& path);
//prints the contents of the funnel deque
void Print();
//prints the contents of the path
void Print(SrPolygon path);
//calculates the length of the path for a unit of given radius
float Length(SrPolygon path);
};
#endif
//definition of FunnelDeque class }