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