bool Circle::IntersectsDisc(const LineSegment &lineSegment) const { float d; bool intersectsPlane = lineSegment.Intersects(ContainingPlane(), &d); if (intersectsPlane) return false; return lineSegment.GetPoint(d).DistanceSq(pos) <= r*r; }
bool Polygon::IsSimple() const { assume(IsPlanar()); Plane plane = PlaneCCW(); for(int i = 0; i < (int)p.size(); ++i) { LineSegment si = plane.Project(Edge(i)); for(int j = i+2; j < (int)p.size(); ++j) { if (i == 0 && j == (int)p.size() - 1) continue; // These two edges are consecutive and share a vertex. Don't check that pair. LineSegment sj = plane.Project(Edge(j)); if (si.Intersects(sj)) return false; } } return true; }
bool Polygon::Intersects2D(const LineSegment &localSpaceLineSegment) const { if (p.size() < 3) return false; const vec basisU = BasisU(); const vec basisV = BasisV(); const vec origin = p[0]; LineSegment edge; edge.a = POINT_VEC(Dot(p.back(), basisU), Dot(p.back(), basisV), 0); // map to 2D for (int i = 0; i < (int)p.size(); ++i) { edge.b = POINT_VEC(Dot(p[i], basisU), Dot(p[i], basisV), 0); // map to 2D if (edge.Intersects(localSpaceLineSegment)) return true; edge.a = edge.b; } // The line segment did not intersect with any of the polygon edges, so either the whole line segment is inside // the polygon, or it is fully outside the polygon. Test one point of the line segment to determine which. return Contains(MapFrom2D(localSpaceLineSegment.a.xy())); }