16 bool operator()(
const Eigen::Vector2d &i,
const Eigen::Vector2d &j) {
17 return (i[0] <= j[0]);
22 bool operator()(
const Eigen::Vector2d &i,
const Eigen::Vector2d &j) {
23 return (i[1] <= j[1]);
76 std::vector<collision::CollisionObjectConstPtr> collision_objects,
77 const Eigen::Vector2d &point1,
const Eigen::Vector2d &point2,
78 std::vector<LineSegment> &intersect,
bool remove_overlaps) {
80 std::vector<LineSegment> res2;
82 for (
auto &obj : collision_objects) {
83 res = obj->rayTrace(point1, point2, res2) || res;
88 std::stringstream out;
89 out <<
"[Raytrace] Obstacle CollisionObjects count: " << counter << std::endl;
90 out <<
"[Raytrace] Returned segments: " << res2.size() << std::endl;
94 if (remove_overlaps) {
96 (fabs(point1[0] - point2[0]) <=
97 fabs(point1[1] - point2[1]));
100 intersect.insert(intersect.end(), res2.begin(), res2.end());
106 const Eigen::Vector2d &point2,
107 std::vector<Eigen::Vector2d> inters1,
108 std::vector<LineSegment> &intersect,
110 double eps = 0.0000001;
113 std::stringstream out;
114 out <<
"[Raytrace] Postprocessing points: " << inters1.size() << std::endl;
118 if (inters1.size() == 2) {
119 intersect.push_back(
LineSegment(inters1[0], inters1[1]));
121 }
else if (inters1.size() == 1) {
123 intersect.push_back(
LineSegment(point2, inters1[0]));
129 intersect.push_back(
LineSegment(point1, inters1[0]));
133 }
else if (inters1.size() == 0) {
149 std::vector<Eigen::Vector2d> inters2;
153 std::ostringstream debugO;
154 debugO <<
"[RayTrace] [Raytrace Point]" << inters1[0][0] <<
" ";
155 debugO << inters1[0][1] <<
" ;";
157 unsigned int cc1 = 1;
158 for (; cc1 < inters1.size(); cc1++) {
159 if ((pow(inters1[cc1][0] - inters1[0][0], 2) +
160 pow(inters1[cc1][1] - inters1[0][1], 2)) >= eps) {
163 inters2.push_back(inters1[cc1]);
165 debugO <<
"[RayTrace] [Raytrace Point]" << inters1[cc1][0] <<
" ";
166 debugO << inters1[cc1][1] <<
" ;";
186 intersect.push_back(
LineSegment(inters1[0], inters2[0]));
188 inters2.push_back(inters1[0]);
198 std::vector<LineSegment> &out_vec,
int axis) {
199 std::vector<LineSegment> starts = intersect;
200 std::vector<LineSegment> ends = intersect;
201 std::vector<bool> remove_its(intersect.size());
204 for (
auto &it : starts) {
205 if (it.point1().getCoord(axis) > it.point2().getCoord(axis)) {
210 std::sort(starts.begin(), starts.end(),
startsSortX);
212 std::sort(starts.begin(), starts.end(),
startsSortY);
216 std::vector<LineSegment>::iterator starts_it = starts.begin();
217 while (starts_it < starts.end()) {
219 auto starts_it2 = starts_it + 1;
222 std::vector<LineSegment>::iterator maxend = starts_it;
223 while ((starts_it2 < starts.end()) &&
224 (starts_it2)->point1().getCoord(axis) <=
225 (starts_it)->point2().getCoord(axis)) {
226 remove_its[starts_it2 - starts.begin()] =
true;
227 if ((starts_it2)->point2().getCoord(axis) >=
228 maxend->point2().getCoord(axis)) {
233 if (maxend != starts_it) {
234 starts_it->set_point_2(maxend->point2());
236 starts_it = starts_it2;
242 for (
unsigned int cc1 = 0; cc1 < starts.size(); cc1++) {
243 if (!remove_its[cc1]) {
244 out_vec.push_back(starts[cc1]);
struct collision::raytrace::EndsLineSegmentSort_X endsSortX
bool operator()(LineSegment i, LineSegment j)
bool operator()(LineSegment i, LineSegment j)
struct collision::raytrace::StartsLineSegmentSort_X startsSortX
bool operator()(LineSegment i, LineSegment j)
struct collision::raytrace::EndsLineSegmentSort_Y_goe endsSortY_goe
struct collision::raytrace::Vector2dSort_X vector2dSortX
bool rayTracePostprocess(const Eigen::Vector2d &point1, const Eigen::Vector2d &point2, std::vector< Eigen::Vector2d > inters1, std::vector< LineSegment > &intersect, const collision::CollisionObject *obj)
bool operator()(LineSegment i, LineSegment j)
void RaytraceDebugOutput(const char *)
raytrace::Point point2() const
bool operator()(const Eigen::Vector2d &i, const Eigen::Vector2d &j)
struct collision::raytrace::StartsLineSegmentSort_Y startsSortY
bool operator()(LineSegment i, LineSegment j)
virtual bool collide(const CollisionObject &c, const collision::CollisionRequest &req=CollisionRequest()) const =0
int rayTraceRemoveOverlaps(std::vector< LineSegment > intersect, std::vector< LineSegment > &out_vec, int axis=0)
bool rayTracePrimitive(std::vector< collision::CollisionObjectConstPtr > collision_objects, const Eigen::Vector2d &point1, const Eigen::Vector2d &point2, std::vector< LineSegment > &intersect, bool remove_overlaps)
struct collision::raytrace::EndsLineSegmentSort_Y endsSortY
Universal structure specifying collision request properties.
struct collision::raytrace::StartsLineSegmentSort_Y_goe startsSortY_goe
bool operator()(LineSegment i, LineSegment j)
raytrace::Point point1() const
struct collision::raytrace::EndsLineSegmentSort_X_goe endsSortX_goe
struct collision::raytrace::StartsLineSegmentSort_X_goe startsSortXgoe
struct collision::raytrace::Vector2dSort_Y vector2dSortY
bool operator()(LineSegment i, LineSegment j)
Base class for CollisionObjects and some of their groups.
bool operator()(const Eigen::Vector2d &i, const Eigen::Vector2d &j)
bool operator()(LineSegment i, LineSegment j)