/// <summary> /// Dibuja el Poligono 'p' en la pantalla con sus vertices correspondientes. /// </summary> /// <param name="p">Poligono que se desea dibujar.</param> private void DibujaPoligono(Poligono p) { Color _color = Color.Green; Gl.glColor4ub(_color.R, _color.G, _color.B, _color.A); if (!_lineas) { Gl.glBegin(Gl.GL_TRIANGLES); } else { Gl.glBegin(Gl.GL_LINE_LOOP); } if (_caras || PoligonoIsVisible(p)) { foreach (Vertice v in p.Vertices) { Gl.glVertex2f(_listP[v.Numero - 1].X, _listP[v.Numero - 1].Y); } } Gl.glEnd(); //se finaliza el pintado }
/// <summary> /// Trata la "linea" de texto como si fuera un Poligono, y lee los /// Vertices que lo componen. /// </summary> /// <param name="linea">Linea de texto del archivo *.obj</param> /// <returns>Regresa el Poligono con sus Vertices.</returns> private Poligono LeePoligono(String linea) { Poligono p = new Poligono(contador_p++); int i = 2; Boolean insertado = false; string leido = ""; while (linea[i] != '\r') { if (char.IsNumber(linea[i]) && !insertado) { leido += linea[i]; } i++; if ((linea[i] == '/' || linea[i] == '\r') && !insertado) { int numv = int.Parse(leido); p.AgregaVertice(list_vertices[numv - 1]); if (linea[i] != '\r') { i++; } leido = ""; insertado = true; } if (linea[i] == ' ' && linea[i + 1] != '\r') { insertado = false; } } return(p); }
/// <summary> /// Separa una linea de texto del archivo *.obj y la agrega a su lista /// correspondiente, ya sea un Vertice o un Poligono. /// </summary> /// <param name="linea">Liea del archivo *.obj a codificar.</param> private void CodificaLinea(String linea) { if (linea != "") { linea += "\r"; if (linea[0] == 'v' && linea[1] == ' ') { Vertice v = LeeVertice(linea); list_vertices.Add(v); } else if (linea[0] == 'f' && linea[1] == ' ') { Poligono p = LeePoligono(linea); list_poligonos.Add(p); } } }
/// <summary> /// Verifica si el Poligono 'p' se debe de dibujar o no. /// El método checa si el poligono se encuentra en la parte /// frontal del objeto, o en la parte trasera. /// </summary> /// <param name="p">Poligo al que se verifica su visibilidad.</param> /// <returns>Regresa TRUE si es visible, de lo contrario regresa FALSE.</returns> private Boolean PoligonoIsVisible(Poligono p) { Boolean ret = false; Vertice v1, v2, vnorm, vcop, vn; v1 = new Vertice(p.Vertices[1].X - p.Vertices[0].X, p.Vertices[1].Y - p.Vertices[0].Y, p.Vertices[1].Z - p.Vertices[0].Z, 0); v2 = new Vertice(p.Vertices[2].X - p.Vertices[0].X, p.Vertices[2].Y - p.Vertices[0].Y, p.Vertices[2].Z - p.Vertices[0].Z, 0); vnorm = new Vertice((v1.Y * v2.Z - v2.Y * v1.Z), -(v1.X * v2.Z - v2.X * v1.Z), (v1.X * v2.Y - v2.X * v1.Y), 0); vcop = new Vertice(_q * _dx, _q * _dy, _q * _dz, 0); vn = p.Vertices[1]; vcop.X = vn.X - vcop.X; vcop.Y = vn.Y - vcop.Y; vcop.Z = vn.Z - vcop.Z; if (((vcop.X * vnorm.X) + (vcop.Y * vnorm.Y) + (vcop.Z * vnorm.Z)) <= 0) { ret = true; } return(ret); }