public static Ponto?Inter(Segmento seg, Reta r) { Ponto?p = Reta.Inter(r, seg.r); if (p == null) { return(null); } if (r.Contem(seg.p1)) { return(seg.p1); } if (r.Contem(seg.p2)) { return(seg.p2); } return(seg.Contem((Ponto)p) ? p : null); }
public static List <Tuple <Ponto, int> > Inter(Poligono poly, Reta r) { int i; var intersec = new List <Tuple <Ponto, int> >(); for (i = 0; i < poly.pontos.Count; i++) { //seg [p_i - p_i+1] int prox = (i + 1) % poly.pontos.Count; Segmento seg = new Segmento(poly.pontos[i], poly.pontos[prox]); if (r.Contem(seg.p1) && r.Contem(seg.p2)) { //intersec.Add(new Tuple<Ponto, bool>(seg.p1, true)); intersec.Add(new Tuple <Ponto, int>(seg.p2, prox)); } else { Ponto?p = Segmento.Inter(seg, r); if (p != null) { bool isExtremo = false; if (p == seg.p1 || p == seg.p2) { isExtremo = true; } if (!isExtremo || p == seg.p2) { intersec.Add(new Tuple <Ponto, int>((Ponto)p, isExtremo ? prox : -1)); } } } } return(intersec); }