示例#1
0
        /// <summary>
        /// Dibuja la curva que representa el perfil del terreno.
        /// </summary>
        /// <param name="puntos">Puntos de control</param>
        public static void DibujarTerreno2D(IList <PuntoFlotante> puntos)
        {
            // Dibujo el lazo punteado que une los puntos.
            PlotHelper.DibujarLazoPunteado(puntos);

            // Dibujo los puntos para denotar su ubicación.
            foreach (PuntoFlotante punto in puntos)
            {
                PlotHelper.DibujarPunto(punto);
            }

            // Dibujo la curva que se forma a partir de los puntos.
            if (puntos.Count > 2)
            {
                CurvaBzierSegmentosCubicos curvaCamino = new CurvaBzierSegmentosCubicos(puntos);

                Gl.glDisable(Gl.GL_LIGHTING);
                Gl.glBegin(Gl.GL_LINE_STRIP);
                Gl.glPushMatrix();
                Gl.glColor3d(0.5, 0.5, 0);
                foreach (PuntoFlotante punto in curvaCamino.GetPuntosDiscretos(0.001))
                {
                    Gl.glVertex2d(punto.X, punto.Y);
                }
                Gl.glPopMatrix();
                Gl.glEnd();
                Gl.glEnable(Gl.GL_LIGHTING);
                Gl.glColor3d(1, 1, 1);
            }
        }
示例#2
0
        public Terraplen(double altura)
        {
            this.RENDER_MODE = Gl.GL_TRIANGLE_STRIP;

            // Curva del terraplen
            puntosControl.Add(new Punto(0, -2, 0));
            puntosControl.Add(new Punto(0, -1.6, 1.6));
            puntosControl.Add(new Punto(0, -1.1, 1.8));
            puntosControl.Add(new Punto(0, -1, 2));

            // Plano del terraplen
            puntosControl.Add(new Punto(0, -0.5, altura));
            puntosControl.Add(new Punto(0, 0.5, altura));
            puntosControl.Add(new Punto(0, 1, 2));

            // Curva del terraplen
            puntosControl.Add(new Punto(0, 1, 2));
            puntosControl.Add(new Punto(0, 1.1, 1.8));
            puntosControl.Add(new Punto(0, 1.6, 1.6));
            puntosControl.Add(new Punto(0, 2, 0));

            this.curvaSeccion = new CurvaBzierSegmentosCubicos(puntosControl);
        }
示例#3
0
        public Terraplen(double altura)
        {
            this.RENDER_MODE = Gl.GL_TRIANGLE_STRIP;

            // Curva del terraplen
            puntosControl.Add(new Punto(0, -2, 0));
            puntosControl.Add(new Punto(0, -1.6, 1.6));
            puntosControl.Add(new Punto(0, -1.1, 1.8));
            puntosControl.Add(new Punto(0, -1, 2));

            // Plano del terraplen
            puntosControl.Add(new Punto(0, -0.5, altura));
            puntosControl.Add(new Punto(0, 0.5, altura));
            puntosControl.Add(new Punto(0, 1, 2));

            // Curva del terraplen
            puntosControl.Add(new Punto(0, 1, 2));
            puntosControl.Add(new Punto(0, 1.1, 1.8));
            puntosControl.Add(new Punto(0, 1.6, 1.6));
            puntosControl.Add(new Punto(0, 2, 0));

            this.curvaSeccion = new CurvaBzierSegmentosCubicos(puntosControl);
        }
示例#4
0
        private Punto[][] generarMatrizVertices(Punto[] curva, double gradosRevolucion, int cantidadCaras)
        {
            double anguloRotacionRadianes      = MathUtils.DegreeToRadian(gradosRevolucion / cantidadCaras);
            CurvaBzierSegmentosCubicos curvaBS = new CurvaBzierSegmentosCubicos(curva);
            IList <Punto> curvaDiscretizada1   = curvaBS.GetPuntosDiscretos(PASO_BEZIER);

            curvaDiscretizada1.RemoveAt(curvaDiscretizada1.Count - 2);
            Punto[] curvaDiscretizada = curvaDiscretizada1.ToArray <Punto>();

            Punto[] normales = this.ObtenerNormalesCurva2D(curvaDiscretizada);

            Punto[][] matriz = new Punto[cantidadCaras + 2][];

            for (int iteradorRotacion = 0; iteradorRotacion < cantidadCaras; ++iteradorRotacion)
            {
                matriz[iteradorRotacion] = new Punto[curvaDiscretizada.Length];
                for (int iteradorBezier = 0; iteradorBezier < curvaDiscretizada.Length; ++iteradorBezier)
                {
                    Punto puntoCurva = curvaDiscretizada[iteradorBezier];
                    matriz[iteradorRotacion][iteradorBezier] = puntoCurva.Clone();

                    // roto, al mismo tiempo, los puntos de la curva alrededor del eje Y
                    Punto puntoCurvaBack = puntoCurva.Clone();
                    puntoCurva.X = puntoCurvaBack.X * Math.Cos(anguloRotacionRadianes) + puntoCurvaBack.Z * Math.Sin(anguloRotacionRadianes);
                    puntoCurva.Z = puntoCurvaBack.Z * Math.Cos(anguloRotacionRadianes) - puntoCurvaBack.X * Math.Sin(anguloRotacionRadianes);

                    curvaDiscretizada[iteradorBezier] = puntoCurva;


                    // roto, al mismo tiempo, los puntos de la normal alrededor del eje Y
                    Punto puntoNormal = normales[iteradorBezier];
                    matriz[iteradorRotacion][iteradorBezier].NormalX = puntoNormal.X;
                    matriz[iteradorRotacion][iteradorBezier].NormalY = puntoNormal.Y;
                    matriz[iteradorRotacion][iteradorBezier].NormalZ = puntoNormal.Z;

                    Punto puntoNormalBack = puntoNormal.Clone();
                    puntoNormal.X = puntoNormalBack.X * Math.Cos(anguloRotacionRadianes) + puntoNormalBack.Z * Math.Sin(anguloRotacionRadianes);
                    puntoNormal.Z = puntoNormalBack.Z * Math.Cos(anguloRotacionRadianes) - puntoNormalBack.X * Math.Sin(anguloRotacionRadianes);

                    normales[iteradorBezier] = puntoNormal;
                }
            }

            matriz[cantidadCaras]     = matriz[0];
            matriz[cantidadCaras + 1] = matriz[1]; // OJO solo si los grados son 360


            /*
             * // calculo las normales en toda la matriz
             * Boolean invertirNormal = true;
             * Punto puntoNorte = null;
             * Punto puntoSur = null;
             * Punto puntoEste = null;
             * Punto puntoOeste = null;
             * Punto puntoCentro = null;
             * int cantidadPixelesAlto = curvaDiscretizada.Length;
             * int cantidadPixelesAncho = matriz.Length;
             *
             * for (int indiceFila = 0; indiceFila < cantidadPixelesAncho; ++indiceFila)
             * {
             *  for (int indiceColumna = 0; indiceColumna < cantidadPixelesAlto; ++indiceColumna)
             *  {
             *      puntoCentro = matriz[indiceFila][indiceColumna];
             *
             *      if (indiceFila + 1 < cantidadPixelesAncho - 1) // Hay punto norte
             *          puntoNorte = matriz[indiceFila + 1][indiceColumna];
             *      else puntoNorte = null;
             *
             *      if (indiceFila - 1 >= 0) // Hay punto sur
             *          puntoSur = matriz[indiceFila - 1][indiceColumna];
             *      else puntoSur = null;
             *
             *      if (indiceColumna - 1 >= 0) // Hay punto este
             *          puntoOeste = matriz[indiceFila][indiceColumna - 1];
             *      else puntoOeste = null;
             *
             *      if (indiceColumna + 1 < cantidadPixelesAlto - 1) // Hay punto oeste
             *          puntoEste = matriz[indiceFila][indiceColumna + 1];
             *      else puntoEste = null;
             *
             *      Punto normal = Punto.CalcularNormal(puntoCentro, puntoNorte, puntoEste, puntoSur, puntoOeste, invertirNormal);
             *      matriz[indiceFila][indiceColumna].NormalX = normal.X;
             *      matriz[indiceFila][indiceColumna].NormalY = normal.Y;
             *      matriz[indiceFila][indiceColumna].NormalZ = normal.Z;
             *  }
             * }
             */
            return(matriz);
        }
示例#5
0
        private Punto[][] generarMatrizVertices(Punto[] curva, double gradosRevolucion, int cantidadCaras)
        {
            double anguloRotacionRadianes = MathUtils.DegreeToRadian(gradosRevolucion / cantidadCaras);
            CurvaBzierSegmentosCubicos curvaBS = new CurvaBzierSegmentosCubicos(curva);
            IList<Punto> curvaDiscretizada1 = curvaBS.GetPuntosDiscretos(PASO_BEZIER);
            curvaDiscretizada1.RemoveAt(curvaDiscretizada1.Count - 2);
            Punto[] curvaDiscretizada = curvaDiscretizada1.ToArray<Punto>();

            Punto[] normales = this.ObtenerNormalesCurva2D(curvaDiscretizada);

            Punto[][] matriz = new Punto[cantidadCaras + 2][];

            for (int iteradorRotacion = 0; iteradorRotacion < cantidadCaras; ++iteradorRotacion)
            {
                matriz[iteradorRotacion] = new Punto[curvaDiscretizada.Length];
                for (int iteradorBezier = 0; iteradorBezier < curvaDiscretizada.Length; ++iteradorBezier)
                {
                    Punto puntoCurva = curvaDiscretizada[iteradorBezier];
                    matriz[iteradorRotacion][iteradorBezier] = puntoCurva.Clone();

                    // roto, al mismo tiempo, los puntos de la curva alrededor del eje Y
                    Punto puntoCurvaBack = puntoCurva.Clone();
                    puntoCurva.X = puntoCurvaBack.X * Math.Cos(anguloRotacionRadianes) + puntoCurvaBack.Z * Math.Sin(anguloRotacionRadianes);
                    puntoCurva.Z = puntoCurvaBack.Z * Math.Cos(anguloRotacionRadianes) - puntoCurvaBack.X * Math.Sin(anguloRotacionRadianes);

                    curvaDiscretizada[iteradorBezier] = puntoCurva;

                    // roto, al mismo tiempo, los puntos de la normal alrededor del eje Y
                    Punto puntoNormal = normales[iteradorBezier];
                    matriz[iteradorRotacion][iteradorBezier].NormalX = puntoNormal.X;
                    matriz[iteradorRotacion][iteradorBezier].NormalY = puntoNormal.Y;
                    matriz[iteradorRotacion][iteradorBezier].NormalZ = puntoNormal.Z;

                    Punto puntoNormalBack = puntoNormal.Clone();
                    puntoNormal.X = puntoNormalBack.X * Math.Cos(anguloRotacionRadianes) + puntoNormalBack.Z * Math.Sin(anguloRotacionRadianes);
                    puntoNormal.Z = puntoNormalBack.Z * Math.Cos(anguloRotacionRadianes) - puntoNormalBack.X * Math.Sin(anguloRotacionRadianes);

                    normales[iteradorBezier] = puntoNormal;

                }

            }

            matriz[cantidadCaras] = matriz[0];
            matriz[cantidadCaras + 1] = matriz[1]; // OJO solo si los grados son 360

            /*
            // calculo las normales en toda la matriz
            Boolean invertirNormal = true;
            Punto puntoNorte = null;
            Punto puntoSur = null;
            Punto puntoEste = null;
            Punto puntoOeste = null;
            Punto puntoCentro = null;
            int cantidadPixelesAlto = curvaDiscretizada.Length;
            int cantidadPixelesAncho = matriz.Length;

            for (int indiceFila = 0; indiceFila < cantidadPixelesAncho; ++indiceFila)
            {
                for (int indiceColumna = 0; indiceColumna < cantidadPixelesAlto; ++indiceColumna)
                {
                    puntoCentro = matriz[indiceFila][indiceColumna];

                    if (indiceFila + 1 < cantidadPixelesAncho - 1) // Hay punto norte
                        puntoNorte = matriz[indiceFila + 1][indiceColumna];
                    else puntoNorte = null;

                    if (indiceFila - 1 >= 0) // Hay punto sur
                        puntoSur = matriz[indiceFila - 1][indiceColumna];
                    else puntoSur = null;

                    if (indiceColumna - 1 >= 0) // Hay punto este
                        puntoOeste = matriz[indiceFila][indiceColumna - 1];
                    else puntoOeste = null;

                    if (indiceColumna + 1 < cantidadPixelesAlto - 1) // Hay punto oeste
                        puntoEste = matriz[indiceFila][indiceColumna + 1];
                    else puntoEste = null;

                    Punto normal = Punto.CalcularNormal(puntoCentro, puntoNorte, puntoEste, puntoSur, puntoOeste, invertirNormal);
                    matriz[indiceFila][indiceColumna].NormalX = normal.X;
                    matriz[indiceFila][indiceColumna].NormalY = normal.Y;
                    matriz[indiceFila][indiceColumna].NormalZ = normal.Z;
                }
            }
            */
            return matriz;
        }