50 return "x: " + std::to_string(
x) +
"\ty: " 51 + std::to_string(
y) +
"\n";
66 using namespace Utils;
73 if (( c1 = w.ScalarProduct(v)) <= 0.0f)
77 if ((c2 = v.ScalarProduct(v)) <= c1 )
79 return (P - L2).SquaredEuclideanNorm();
83 Point Pb = L1 + v * b;
89 bool directionOpt,
Vector &result)
91 float dotProduct = lines[curr].liesOn.ScalarProduct(lines[curr].dir);
92 float discriminant = dotProduct * dotProduct + radius * radius - lines[curr].liesOn.SquaredEuclideanNorm();
94 if(discriminant < 0.0f)
100 float sqrtDiscriminant = std::sqrt(discriminant);
101 float tLeft = -dotProduct - sqrtDiscriminant;
102 float tRight = -dotProduct + sqrtDiscriminant;
104 for(
int i = 0; i < curr; ++i)
107 const float denominator = lines[curr].dir.Det(lines[i].dir);
108 const float numerator = lines[i].dir.Det(lines[curr].liesOn - lines[i].liesOn);
110 if(std::fabs(denominator) <=
CN_EPS)
123 const float t = numerator / denominator;
125 if(denominator >= 0.0f)
128 tRight = std::min(tRight, t);
133 tLeft = std::max(tLeft, t);
145 if(optVelocity.ScalarProduct(lines[curr].dir) > 0.0f)
148 result = lines[curr].liesOn + lines[curr].dir * tRight;
153 result = lines[curr].liesOn + lines[curr].dir * tLeft;
159 const float t = lines[curr].dir.ScalarProduct(optVelocity - lines[curr].liesOn);
163 result = lines[curr].liesOn + lines[curr].dir * tLeft;
167 result = lines[curr].liesOn + lines[curr].dir * tRight;
171 result = lines[curr].liesOn + lines[curr].dir * t;
184 result = optVelocity * radius;
186 else if(optVelocity.SquaredEuclideanNorm() > radius * radius)
188 result = (optVelocity / optVelocity.EuclideanNorm()) * radius;
192 result = optVelocity;
195 for(
unsigned long int i = 0; i < lines.size(); ++i)
198 if(lines[i].dir.Det(lines[i].liesOn - result) > 0.0f)
200 const Vector tempResult = result;
202 if(!
linearProgram1(lines, i, radius, optVelocity, directionOpt, result))
216 float distance = 0.0f;
218 for(
size_t i = beginLine; i < lines.size(); ++i)
220 if(lines[i].dir.Det(lines[i].liesOn - result) > distance)
223 std::vector<Line> projLines(lines.begin(), lines.begin() +
static_cast<ptrdiff_t
>(numObstLines));
225 for(
size_t j = numObstLines; j < i; ++j)
229 float determinant = lines[i].
dir.Det(lines[j].dir);
231 if(std::fabs(determinant) <=
CN_EPS)
234 if(lines[i].dir.ScalarProduct(lines[j].dir) > 0.0f)
242 line.
liesOn = (lines[i].liesOn + lines[j].liesOn) * 0.5f;
247 line.
liesOn = lines[i].liesOn + lines[i].dir * (lines[j].dir.Det(lines[i].liesOn - lines[j].liesOn) / determinant);
251 line.
dir = (lines[j].dir - lines[i].dir);
252 line.
dir = line.
dir / line.
dir.EuclideanNorm();
253 projLines.push_back(line);
256 const Vector tempResult = result;
258 if(
linearProgram2(projLines, radius,
Vector(-lines[i].dir.Y(), lines[i].dir.X()),
true, result) < projLines.size())
263 distance = lines[i].dir.Det(lines[i].liesOn - result);
float SquaredEuclideanNorm() const
Computes squared euclidean norm of vector.
bool linearProgram1(const std::vector< Line > &lines, unsigned long curr, float radius, const Vector &optVelocity, bool directionOpt, Vector &result)
Solves a one-dimensional linear program on a specified line subject to linear constraints defined by ...
Vector dir
direction vector of line.
void SetConvex(bool cvx)
Sets convexity of vertex.
The class defines a line in 2D space.
File contains Node, Point, Line, Vertex, ObstacleSegment classes and some methods and functions imple...
float Y() const
Returns Y-coordinate of the point.
The Point class defines a position (or euclidean vector from (0,0)) in 2D space.
#define Vector
Vector type definition.
float x
X-coordinate of the point.
std::string ToString() const
Creates STL string, which contains x,y values.
bool IsConvex() const
Return convexity of vertex.
Point()
Point default constructor.
void linearProgram3(const std::vector< Line > &lines, size_t numObstLines, size_t beginLine, float radius, Vector &result)
Solves a two-dimensional linear program subject to linear constraints defined by lines and a circular...
float y
Y-coordinate of the point.
unsigned long int linearProgram2(const std::vector< Line > &lines, float radius, const Vector &optVelocity, bool directionOpt, Vector &result)
Solves a two-dimensional linear program subject to linear constraints defined by lines and a circular...
float X() const
Returns X-coordinate of the point.
The set of utility functions.
float SqPointSegDistance(Point L1, Point L2, Point P)
Computes squared euclidean distance from point to line segment.
std::pair< float, float > GetPair()
Creates STL pair (x,y) from point.
Point liesOn
point on line.
#define CN_EPS
Epsilon for float number operations definition.