public void DrawScene() { Main = new Bitmap(Width, Height); //TestList = new Bitmap(500, 500); //Testg = Graphics.FromImage(TestList); ClearBuffer(); Graphics g = Graphics.FromImage(Main); foreach (Polygon p in Polygons) { TransformToScreen(p); DrawPolygon(p, g); } g.DrawString(Cam.Location.ToString(), new Font("Arial", 12), Brushes.Black, 10, 10); } public void DrawPolygon(Polygon p, Graphics g) { if (Wireframe) g.DrawPolygon(new Pen(Brushes.Black), p.Points2D()); else { double v; double w; p.Depth = new double[Width, Height]; int MinX = (int)Math.Max(0, Math.Min(p.TransformedPoints[0].X, Math.Min(p.TransformedPoints[1].X, p.TransformedPoints[2].X))); int MinY = (int)Math.Max(0, Math.Min(p.TransformedPoints[0].Y, Math.Min(p.TransformedPoints[1].Y, p.TransformedPoints[2].Y))); int MaxX = (int)Math.Min(Width, Math.Max(p.TransformedPoints[0].X, Math.Max(p.TransformedPoints[1].X, p.TransformedPoints[2].X))); int MaxY = (int)Math.Min(Height, Math.Max(p.TransformedPoints[0].Y, Math.Max(p.TransformedPoints[1].Y, p.TransformedPoints[2].Y))); if (MaxX > MinX && MaxY > MinY) { BufferTest = new Bitmap(MaxX - MinX, MaxY - MinY); Graphics BufferGraphics = Graphics.FromImage(BufferTest); BufferGraphics.FillPolygon(Brushes.White, p.Points2D(MinX, MinY)); for (int x = MinX; x < MaxX; x++) { for (int y = MinY; y < MaxY; y++) { if (BufferTest.GetPixel(x - MinX, y - MinY).A == 255) { w = (double)((y - p.TransformedPoints[0].Y) * (p.TransformedPoints[1].X - p.TransformedPoints[0].X) - (x - p.TransformedPoints[0].X) * (p.TransformedPoints[2].Y - p.TransformedPoints[0].Y)) / (double)((p.TransformedPoints[1].Y - p.TransformedPoints[0].Y) * (p.TransformedPoints[1].X - p.TransformedPoints[0].X) - (p.TransformedPoints[2].X - p.TransformedPoints[0].X) * (p.TransformedPoints[2].Y - p.TransformedPoints[0].Y)); v = (double)(x - p.TransformedPoints[0].X - w * (p.TransformedPoints[2].X - p.TransformedPoints[0].X)) / (double)(p.TransformedPoints[1].X - p.TransformedPoints[0].X); double z = v * (double)(p.TransformedPoints[1].Z - p.TransformedPoints[0].Z) + w * (double)(p.TransformedPoints[2].Z - p.TransformedPoints[0].Z); if (Buffer[x, y] > z) { Main.SetPixel(x, y, p.Color); //BufferTest.SetPixel(x - MinX, y - MinY, Buffer[x, y] - z > 255 ? Color.Black : Color.FromArgb((int)(Buffer[x, y] - z), 255, 0, 0)); Buffer[x, y] = z; } } } } //Testg.DrawImage(BufferTest, lastx, 0); //lastx = MaxX - MinX; //f.pictureBox2.Image = TestList; } } } void TransformToScreen(Polygon p) { Vector[] newPoints = new Vector[3]; double r; for (int i = 0; i < p.Points.Length; i++) { r = (Cam.Distance) / (p.Points[i].Z - Cam.Location.Z); if (r > 1 || r <= 0) //muss noch in per pixel geƤndert werden { for (int j = 0; j < p.Points.Length; j++) { newPoints[j] = new Vector(0, 0, 0); } break; } newPoints[i] = new Vector((int)((double)Cam.Location.X + r * (double)(p.Points[i].X - Cam.Location.X) + Width / 2), (int)((double)Cam.Location.Y + r * (double)(p.Points[i].Y - Cam.Location.Y) + Height / 2), (p.Points[i] - Cam.Location).Abs());//Math.Sqrt(Math.Pow(Cam.Location.x - p.Points[i].x, 2) + Math.Pow(Cam.Location.y - p.Points[i].y, 2) + Math.Pow(Cam.Location.z - p.Points[i].z, 2))); } p.TransformedPoints = newPoints; } private void ClearBuffer() { for (int i = 0; i < Width; i++) for (int j = 0; j < Height; j++) Buffer[i, j] = double.MaxValue; }