예제 #1
0
    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);
    }
예제 #2
0
    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);
    }