bool Geometric2DCollection::Collides(const Triangle2D& tri) const { for(size_t i=0;i<aabbs.size();i++) { Box2D box; box.set(aabbs[i]); if(box.intersects(tri)) return true; } for(size_t i=0;i<boxes.size();i++) if(boxes[i].intersects(tri)) return true; for(size_t i=0;i<circles.size();i++) if(tri.closestPoint(circles[i].center).distanceSquared(circles[i].center) < Sqr(circles[i].radius)) return true; for(size_t i=0;i<triangles.size();i++) if(tri.intersects(triangles[i])) return true; return false; }
bool Geometric2DCSpace::ObstacleOverlap(const Triangle2D& tri) const { AABB2D bb; tri.getAABB(bb); if(!domain.contains(bb)) return true; return Geometric2DCollection::Collides(tri); }
bool intersect2d::aabb_triangle(const AABB_2D &aabb, const Triangle2D &tri) { //First check if any of the triangles corners is in the aabb: if(aabb.contains(tri.p1) || aabb.contains(tri.p2) || aabb.contains(tri.p3)) return true; //Then if any of the aabb corners are in the triangle for(const glm::vec2 & c: aabb.corners()) { if(tri.contains(c)) return true; } //Then test if any lines intersect: return aabb_line(aabb, Line2D(tri.p1, tri.p2)) || aabb_line(aabb, Line2D(tri.p2, tri.p3)) || aabb_line(aabb, Line2D(tri.p3, tri.p1)); }
bool Geometric2DCollection::Collides(const Triangle2D& t,int obstacle) const { Type type=ObstacleType(obstacle); int index = ObstacleIndex(obstacle); switch(type) { case AABB: { Box2D box; box.set(aabbs[index]); return box.intersects(t); } case Triangle: return triangles[index].intersects(t); case Box: return boxes[index].intersects(t); case Circle: { return (t.closestPoint(circles[index].center).distanceSquared(circles[index].center) < Sqr(circles[index].radius)); } } abort(); return false; }
/*********************************************************** test if inside triangle ***********************************************************/ bool Point2D::is_inside (const Triangle2D & t) const { return t.contains (*this); }