public static bool Contains(Polygon containingPolygon, Segment containedSegement) { // Il suffit de contenir les deux extrémités du segment et de ne jamais croiser le segment // À part si le croisement se fait sur une extremité bool result; if (Cross(containingPolygon, containedSegement)) { // Si ça se croise : ça peut encore être les extremités qui touchent List <RealPoint> crossPoints = GetCrossingPoints(containingPolygon, containedSegement); if (crossPoints.Count > 2) { // Plus de 2 croisements : le segment n'est pas contenu result = false; } else { // Maximum 2 croisements (= les 2 extremités) : le segment est contenu si les 2 extremités et le milieu sont contenus if (PolygonWithRealPoint.Contains(containingPolygon, containedSegement.StartPoint) && PolygonWithRealPoint.Contains(containingPolygon, containedSegement.EndPoint) && PolygonWithRealPoint.Contains(containingPolygon, containedSegement.Barycenter)) { result = true; } else { result = false; } } } else { // Pas de croisement, il suffit de contenir un point du segment result = PolygonWithRealPoint.Contains(containingPolygon, containedSegement.StartPoint); } return(result); }
public static bool Contains(Polygon containingPolygon, Circle containedCircle) { // Pour contenir un cercle, un polygone ne doit pas être contenu par le cercle, ne pas le croiser et contenir son centre return(!CircleWithPolygon.Contains(containedCircle, containingPolygon) && !PolygonWithCircle.Cross(containingPolygon, containedCircle) && PolygonWithRealPoint.Contains(containingPolygon, containedCircle.Center)); }