/// <summary> /// Devuelve el valor de la curva Bziel cuyo polígono de control está formado /// por los trés puntos pasados por parámetro, para el parámetro u e (0,1) /// /// Formula sacada de la wikipedia /// B(t) = p0*((1-t)^3) + 3*P1*t*((1-t)^2) + 3*p2*(t^2)*(1-t) + p3*t^3 /// http://es.wikipedia.org/wiki/Curva_de_B%C3%A9zier /// </summary> private PuntoFlotante GetValorEnSegmento(IList <PuntoFlotante> puntosParteCurva, double u) { if (puntosParteCurva.Count != CANTIDAD_PUNTOS_SEGMENTO) { throw new InvalidOperationException("es una Bziel de " + CANTIDAD_PUNTOS_SEGMENTO + " puntos de control"); } PuntoFlotante primerSumando = puntosParteCurva[0].MultiplicarEscalar(Math.Pow(1 - u, 3)); PuntoFlotante segundoSumando = puntosParteCurva[1].MultiplicarEscalar(3).MultiplicarEscalar(u).MultiplicarEscalar(Math.Pow(1 - u, 2)); PuntoFlotante tercerSumando = puntosParteCurva[2].MultiplicarEscalar(3).MultiplicarEscalar(Math.Pow(u, 2)).MultiplicarEscalar(1 - u); PuntoFlotante cuartoSumando = puntosParteCurva[3].MultiplicarEscalar(Math.Pow(u, 3)); return(primerSumando.SumarPunto(segundoSumando.SumarPunto(tercerSumando.SumarPunto(cuartoSumando)))); }
public static IList RecortarPoligono(IList puntos, ViewPort viewport) { IList puntosClippeados; Punto pia = new PuntoFlotante(viewport.XIzq, viewport.YAbajo); Punto pda = new PuntoFlotante(viewport.XDer, viewport.YAbajo); Punto pdb = new PuntoFlotante(viewport.XDer, viewport.YArriba); Punto pib = new PuntoFlotante(viewport.XIzq, viewport.YArriba); puntosClippeados = Recortar(puntos, pia, pda); puntosClippeados = Recortar(puntosClippeados, pda, pdb); puntosClippeados = Recortar(puntosClippeados, pdb, pib); puntosClippeados = Recortar(puntosClippeados, pib, pia); return puntosClippeados; }
/// <summary> /// No modifica el valor de this, ni del otro, devuelve un nuevo punto flotante con el valor de la suma de ambos /// </summary> /// <param name="punto"></param> /// <returns></returns> public PuntoFlotante SumarPunto(PuntoFlotante punto) { return new PuntoFlotante(this.GetXFlotante() + punto.GetXFlotante(), this.GetYFlotante() + punto.GetYFlotante()); }
/// <summary> /// No modifica el valor de this, ni del otro, devuelve un nuevo punto flotante con el valor de la suma de ambos /// </summary> /// <param name="punto"></param> /// <returns></returns> public PuntoFlotante SumarPunto(PuntoFlotante punto) { return(new PuntoFlotante(this.GetXFlotante() + punto.GetXFlotante(), this.GetYFlotante() + punto.GetYFlotante())); }