/// <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); } }
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); }
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); }
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; }