Ejemplo n.º 1
0
        public static Bitmap drawObjectXZ(Object3D obj, Bitmap b)
        {
            int        x1, x2, y1, y2;
            BitmapData bdma = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
                                         ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            foreach (Face f in obj.getFaces())
            {
                for (int i = 0; i < f.getVertexs().Count - 1; i++)
                {
                    x1 = (int)(330 + obj.getActuals()[f.getVertexs()[i]].getX());
                    y1 = (int)(250 + obj.getActuals()[f.getVertexs()[i]].getZ());
                    x2 = (int)(330 + obj.getActuals()[f.getVertexs()[i + 1]].getX());
                    y2 = (int)(250 + obj.getActuals()[f.getVertexs()[i + 1]].getZ());
                    GraphicPrimitives.bresenham(bdma, x1, y1, x2, y2);
                }
                x1 = (int)(330 + obj.getActuals()[f.getVertexs()[f.getVertexs().Count - 1]].getX());
                y1 = (int)(250 + obj.getActuals()[f.getVertexs()[f.getVertexs().Count - 1]].getZ());
                x2 = (int)(330 + obj.getActuals()[f.getVertexs()[0]].getX());
                y2 = (int)(250 + obj.getActuals()[f.getVertexs()[0]].getZ());
                GraphicPrimitives.bresenham(bdma, x1, y1, x2, y2);
            }

            b.UnlockBits(bdma);

            return(b);
        }
Ejemplo n.º 2
0
        private static void desenha(Object3D obj, Face f, BitmapData bdma)
        {
            int x1, x2, y1, y2;

            for (int i = 0; i < f.getVertexs().Count - 1; i++)
            {
                x1 = (int)(330 + obj.getActuals()[f.getVertexs()[i]].getX());
                y1 = (int)(250 + obj.getActuals()[f.getVertexs()[i]].getY());
                x2 = (int)(330 + obj.getActuals()[f.getVertexs()[i + 1]].getX());
                y2 = (int)(250 + obj.getActuals()[f.getVertexs()[i + 1]].getY());
                GraphicPrimitives.bresenham(bdma, x1, y1, x2, y2);
            }
            x1 = (int)(330 + obj.getActuals()[f.getVertexs()[f.getVertexs().Count - 1]].getX());
            y1 = (int)(250 + obj.getActuals()[f.getVertexs()[f.getVertexs().Count - 1]].getY());
            x2 = (int)(330 + obj.getActuals()[f.getVertexs()[0]].getX());
            y2 = (int)(250 + obj.getActuals()[f.getVertexs()[0]].getY());
            GraphicPrimitives.bresenham(bdma, x1, y1, x2, y2);
        }
Ejemplo n.º 3
0
        public static void phong(List <Vertex> lv, Color cor, BitmapData b)
        {
            int y = 0;

            double ymin = lv[0].getY(), ymax = lv[0].getY(), xmin = 0, primy, incx = 0;
            Vertex p1, p2;
            Color  color = Color.FromArgb(cor.ToArgb());

            for (int i = 1; i < lv.Count; i++)
            {
                if (ymin > lv[i].getY())
                {
                    ymin = lv[i].getY();
                }
                if (ymax < lv[i].getY())
                {
                    ymax = lv[i].getY();
                }
            }
            primy = ymin;

            List <NoScan>[] et = new List <NoScan> [(int)(ymax - ymin + 1)];

            for (int i = 0; i < (int)(ymax - ymin + 1); i++)
            {
                et[i] = new List <NoScan>();
            }
            for (int i = 1; i < lv.Count; i++)
            {
                p1 = lv[i - 1];
                p2 = lv[i];
                if (p1.getY() != p2.getY())
                {
                    if (p1.getY() < p2.getY())
                    {
                        ymin = p1.getY();
                        ymax = p2.getY();
                        xmin = p1.getX();
                    }
                    else
                    {
                        ymin = p2.getY();
                        ymax = p1.getY();
                        xmin = p2.getX();
                    }
                    incx = (double)(p2.getX() - p1.getX()) / (p2.getY() - p1.getY());
                    et[(int)(ymin - primy)].Add(new NoScan(ymax, xmin, incx));
                }
            }
            p1 = lv[0];
            p2 = lv[lv.Count - 1];
            if (p1.getY() != p2.getY())
            {
                if (p1.getY() < p2.getY())
                {
                    ymin = p1.getY();
                    ymax = p2.getY();
                    xmin = p1.getX();
                }
                else if (p1.getY() > p2.getY())
                {
                    ymin = p2.getY();
                    ymax = p1.getY();
                    xmin = p2.getX();
                }
                incx = (double)(p2.getX() - p1.getX()) / (p2.getY() - p1.getY());
                et[(int)(ymin - primy)].Add(new NoScan(ymax, xmin, incx));
            }

            List <NoScan> aet = et[y];

            while (y < et.Length)
            {
                for (int i = 0; i < aet.Count; i++)
                {
                    if (y + primy == aet[i].Ymax)
                    {
                        aet.RemoveAt(i);
                    }
                }
                aet.Sort((o1, o2) => o1.Xmin.CompareTo(o2.Xmin));
                for (int i = 1; i < aet.Count; i += 2)
                {
                    GraphicPrimitives.bresenham(b, (int)aet[i - 1].Xmin, (int)(y + primy), (int)aet[i].Xmin, (int)(y + primy));
                }
                for (int i = 0; i < aet.Count; i++)
                {
                    aet[i].Xmin += aet[i].Incx;
                }
                y++;
                if (y < et.Length)
                {
                    for (int pos2 = 0; pos2 < et[y].Count; pos2++)
                    {
                        aet.Add(et[y][pos2]);
                    }
                }
            }
        }