Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef TRAJECTORY_TRACKER_EIGEN_LINE_H
00032 #define TRAJECTORY_TRACKER_EIGEN_LINE_H
00033
00034 #include <cmath>
00035
00036 #include <Eigen/Core>
00037
00038 namespace trajectory_tracker
00039 {
00040 inline float curv3p(
00041 const Eigen::Vector2d& a,
00042 const Eigen::Vector2d& b,
00043 const Eigen::Vector2d& c)
00044 {
00045 float ret;
00046 ret = 2 * (a[0] * b[1] + b[0] * c[1] + c[0] * a[1] -
00047 a[0] * c[1] - b[0] * a[1] - c[0] * b[1]);
00048 ret /= std::sqrt((b - a).squaredNorm() * (b - c).squaredNorm() * (c - a).squaredNorm());
00049
00050 return ret;
00051 }
00052
00053 inline float cross2(const Eigen::Vector2d& a, const Eigen::Vector2d& b)
00054 {
00055 return a[0] * b[1] - a[1] * b[0];
00056 }
00057
00058 inline float lineDistance(
00059 const Eigen::Vector2d& a,
00060 const Eigen::Vector2d& b,
00061 const Eigen::Vector2d& c)
00062 {
00063 return cross2((b - a), (c - a)) / (b - a).norm();
00064 }
00065
00066 inline float lineStripDistance(
00067 const Eigen::Vector2d& a,
00068 const Eigen::Vector2d& b,
00069 const Eigen::Vector2d& c)
00070 {
00071 if ((b - a).dot(c - a) <= 0)
00072 return (c - a).norm();
00073 if ((a - b).dot(c - b) <= 0)
00074 return (c - b).norm() + 0.005;
00075 return std::abs(lineDistance(a, b, c));
00076 }
00077
00078 inline Eigen::Vector2d projection2d(
00079 const Eigen::Vector2d& a,
00080 const Eigen::Vector2d& b,
00081 const Eigen::Vector2d& c)
00082 {
00083 const float r = (b - a).dot(c - a) / (b - a).squaredNorm();
00084 return b * r + a * (1.0 - r);
00085 }
00086 }
00087
00088 #endif // TRAJECTORY_TRACKER_EIGEN_LINE_H