コード例 #1
0
        /// <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
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
 /// <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);
         }
     }
 }
コード例 #4
0
        /// <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);
        }