Ejemplo n.º 1
0
        private void button1_Click(object sender, EventArgs e)
        {
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            using (var g = Graphics.FromImage(pictureBox1.Image))
            {
                Brush            b             = Brushes.Green;
                Pen              p             = Pens.Black;
                PointF[]         point3D       = new PointF[6];
                int              x             = Convert.ToInt32(textBox1.Text);
                int              y             = Convert.ToInt32(textBox3.Text);
                int              z             = Convert.ToInt32(textBox2.Text);
                int              XSize         = Convert.ToInt32(textBox4.Text);
                int              YSize         = Convert.ToInt32(textBox5.Text);
                int              dist          = Convert.ToInt32(textBox6.Text);
                int              Size          = Convert.ToInt32(textBox7.Text);
                int              LampZ         = Convert.ToInt32(textBox8.Text);
                int              XAngle        = Convert.ToInt32(trackBar1.Value);
                int              YAngle        = Convert.ToInt32(trackBar2.Value);
                int              ZAngle        = Convert.ToInt32(trackBar3.Value);
                View3D.Point3D   point0        = new View3D.Point3D(x, y, z);
                View3D.Point3D[] pyramidPoints = PiramidPoints(Size, Size, Size);
                View3D.Point3D   pyramidOrigin = new View3D.Point3D((int)(Size / 2), (int)(Size / 2), (int)(Size / 2));
                pyramidPoints = View3D.Translate(pyramidPoints, pyramidOrigin, point0);
                pyramidPoints = View3D.RotateX(pyramidPoints, XAngle);
                pyramidPoints = View3D.RotateY(pyramidPoints, YAngle);
                pyramidPoints = View3D.RotateZ(pyramidPoints, ZAngle);
                pyramidPoints = View3D.Translate(pyramidPoints, point0, pyramidOrigin);
                for (int i = 0; i < point3D.Length; i++)
                {
                    point3D[i].X = ((XSize / 2) + (((float)pyramidPoints[i].X * dist) / ((float)pyramidPoints[i].Z + dist)));
                    point3D[i].Y = (YSize / 2) - (((float)pyramidPoints[i].Y * dist) / ((float)pyramidPoints[i].Z + dist));
                }
                if (!checkBox1.Checked)
                {
                    View3D.Point3D n = View3D.CalcNormal(pyramidPoints[3], pyramidPoints[0], pyramidPoints[1]);
                    if (n.Z * dist + n.X * pyramidPoints[3].X + n.Y * pyramidPoints[3].Y + n.Z * pyramidPoints[3].Z > 0)
                    {
                        //1
                        g.DrawLine(p, point3D[1].X, point3D[1].Y, point3D[0].X, point3D[0].Y);
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[0].X, point3D[0].Y);
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[1].X, point3D[1].Y);
                    }
                    n = View3D.CalcNormal(pyramidPoints[5], pyramidPoints[0], pyramidPoints[3]);
                    if (n.Z * dist + n.X * pyramidPoints[5].X + n.Y * pyramidPoints[5].Y + n.Z * pyramidPoints[5].Z > 0)
                    {
                        //2
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[0].X, point3D[0].Y);
                        g.DrawLine(p, point3D[5].X, point3D[5].Y, point3D[0].X, point3D[0].Y);
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[5].X, point3D[5].Y);
                    }

                    n = View3D.CalcNormal(pyramidPoints[5], pyramidPoints[3], pyramidPoints[1]);
                    if (n.Z * dist + n.X * pyramidPoints[5].X + n.Y * pyramidPoints[5].Y + n.Z * pyramidPoints[5].Z > 0)
                    {
                        //3
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[5].X, point3D[5].Y);
                        g.DrawLine(p, point3D[5].X, point3D[5].Y, point3D[1].X, point3D[1].Y);
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[1].X, point3D[1].Y);
                    }

                    n = View3D.CalcNormal(pyramidPoints[5], pyramidPoints[1], pyramidPoints[0]);
                    if (n.Z * dist + n.X * pyramidPoints[5].X + n.Y * pyramidPoints[5].Y + n.Z * pyramidPoints[5].Z > 0)
                    {
                        //4
                        g.DrawLine(p, point3D[5].X, point3D[5].Y, point3D[0].X, point3D[0].Y);
                        g.DrawLine(p, point3D[5].X, point3D[5].Y, point3D[1].X, point3D[1].Y);
                        g.DrawLine(p, point3D[1].X, point3D[1].Y, point3D[0].X, point3D[0].Y);
                    }
                }
                else
                {
                    View3D.Point3D n = View3D.CalcNormal(pyramidPoints[3], pyramidPoints[0], pyramidPoints[1]);
                    if (n.Z * dist + n.X * pyramidPoints[3].X + n.Y * pyramidPoints[3].Y + n.Z * pyramidPoints[3].Z > 0 && n.Z * dist + n.X * pyramidPoints[0].X + n.Y * pyramidPoints[0].Y + n.Z * pyramidPoints[0].Z > 0 &&
                        n.Z * dist + n.X * pyramidPoints[1].X + n.Y * pyramidPoints[1].Y + n.Z * pyramidPoints[1].Z > 0)
                    {
                        //1
                        var s = Math.Abs((n.X * button2.Location.X + n.Y * button2.Location.Y + n.Z * LampZ + n.X * pyramidPoints[3].X + n.Y * pyramidPoints[3].Y + n.Z * pyramidPoints[3].Z) + (n.Z * dist + n.X * pyramidPoints[0].X + n.Y * pyramidPoints[0].Y + n.Z * pyramidPoints[0].Z) +
                                         n.Z * dist + n.X * pyramidPoints[1].X + n.Y * pyramidPoints[1].Y + n.Z * pyramidPoints[1].Z);
                        Color c = new Color();
                        s = (s - 0) / (25500 - 0);
                        if (s < 255)
                        {
                            c = Color.FromArgb(0, (int)s, 0);
                        }
                        else
                        {
                            c = Color.FromArgb(0, 255, 0);
                        }
                        b = new SolidBrush(c);

                        g.FillPolygon(b, new PointF[3] {
                            new PointF(point3D[1].X, point3D[1].Y), new PointF(point3D[0].X, point3D[0].Y), new PointF(point3D[3].X, point3D[3].Y)
                        });
                        g.DrawLine(p, point3D[1].X, point3D[1].Y, point3D[0].X, point3D[0].Y);
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[0].X, point3D[0].Y);
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[1].X, point3D[1].Y);
                    }
                    n = View3D.CalcNormal(pyramidPoints[5], pyramidPoints[0], pyramidPoints[3]);
                    if (n.Z * dist + n.X * pyramidPoints[5].X + n.Y * pyramidPoints[5].Y + n.Z * pyramidPoints[5].Z > 0 && n.Z * dist + n.X * pyramidPoints[0].X + n.Y * pyramidPoints[0].Y + n.Z * pyramidPoints[0].Z > 0 &&
                        n.Z * dist + n.X * pyramidPoints[3].X + n.Y * pyramidPoints[3].Y + n.Z * pyramidPoints[3].Z > 0)
                    {
                        var s = Math.Abs((n.X * button2.Location.X + n.Y * button2.Location.Y + n.Z * LampZ + n.X * pyramidPoints[5].X + n.Y * pyramidPoints[5].Y + n.Z * pyramidPoints[5].Z) + (n.Z * dist + n.X * pyramidPoints[0].X + n.Y * pyramidPoints[0].Y + n.Z * pyramidPoints[0].Z) +
                                         n.Z * dist + n.X * pyramidPoints[3].X + n.Y * pyramidPoints[3].Y + n.Z * pyramidPoints[3].Z);
                        Color c = new Color();
                        s = (s - 0) / (25500 - 0);
                        if (s < 255)
                        {
                            c = Color.FromArgb(0, (int)s, 0);
                        }
                        else
                        {
                            c = Color.FromArgb(0, 255, 0);
                        }
                        b = new SolidBrush(c);
                        //2
                        g.FillPolygon(b, new PointF[3] {
                            new PointF(point3D[3].X, point3D[3].Y), new PointF(point3D[0].X, point3D[0].Y), new PointF(point3D[5].X, point3D[5].Y)
                        });
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[0].X, point3D[0].Y);
                        g.DrawLine(p, point3D[5].X, point3D[5].Y, point3D[0].X, point3D[0].Y);
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[5].X, point3D[5].Y);
                    }

                    n = View3D.CalcNormal(pyramidPoints[5], pyramidPoints[3], pyramidPoints[1]);
                    if (n.Z * dist + n.X * pyramidPoints[5].X + n.Y * pyramidPoints[5].Y + n.Z * pyramidPoints[5].Z > 0 && n.Z * dist + n.X * pyramidPoints[3].X + n.Y * pyramidPoints[3].Y + n.Z * pyramidPoints[3].Z > 0 &&
                        n.Z * dist + n.X * pyramidPoints[1].X + n.Y * pyramidPoints[1].Y + n.Z * pyramidPoints[1].Z > 0)
                    {
                        var s = Math.Abs(n.X * button2.Location.X + n.Y * button2.Location.Y + n.Z * LampZ + n.X * pyramidPoints[5].X + n.Y * pyramidPoints[5].Y + n.Z * pyramidPoints[5].Z + (n.Z * dist + n.X * pyramidPoints[3].X + n.Y * pyramidPoints[3].Y + n.Z * pyramidPoints[3].Z) +
                                         n.Z * dist + n.X * pyramidPoints[1].X + n.Y * pyramidPoints[1].Y + n.Z * pyramidPoints[1].Z);
                        Color c = new Color();
                        s = (s - 0) / (25500 - 0);
                        if (s < 255)
                        {
                            c = Color.FromArgb(0, (int)s, 0);
                        }
                        else
                        {
                            c = Color.FromArgb(0, 255, 0);
                        }

                        b = new SolidBrush(c);
                        //3
                        g.FillPolygon(b, new PointF[3] {
                            new PointF(point3D[3].X, point3D[3].Y), new PointF(point3D[5].X, point3D[5].Y), new PointF(point3D[1].X, point3D[1].Y)
                        });
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[5].X, point3D[5].Y);
                        g.DrawLine(p, point3D[5].X, point3D[5].Y, point3D[1].X, point3D[1].Y);
                        g.DrawLine(p, point3D[3].X, point3D[3].Y, point3D[1].X, point3D[1].Y);
                    }

                    n = View3D.CalcNormal(pyramidPoints[5], pyramidPoints[1], pyramidPoints[0]);
                    if (n.Z * dist + n.X * pyramidPoints[5].X + n.Y * pyramidPoints[5].Y + n.Z * pyramidPoints[5].Z > 0 && n.Z * dist + n.X * pyramidPoints[1].X + n.Y * pyramidPoints[1].Y + n.Z * pyramidPoints[1].Z > 0 &&
                        n.Z * dist + n.X * pyramidPoints[0].X + n.Y * pyramidPoints[0].Y + n.Z * pyramidPoints[0].Z > 0)
                    {
                        var s = Math.Abs(n.X * button2.Location.X + n.Y * button2.Location.Y + n.Z * LampZ + n.X * pyramidPoints[5].X + n.Y * pyramidPoints[5].Y + n.Z * pyramidPoints[5].Z + (n.Z * dist + n.X * pyramidPoints[1].X + n.Y * pyramidPoints[1].Y + n.Z * pyramidPoints[1].Z) +
                                         n.Z * dist + n.X * pyramidPoints[0].X + n.Y * pyramidPoints[0].Y + n.Z * pyramidPoints[0].Z);
                        Color c = new Color();
                        s = (s - 0) / (25500 - 0);
                        if (s < 255)
                        {
                            c = Color.FromArgb(0, (int)s, 0);
                        }
                        else
                        {
                            c = Color.FromArgb(0, 255, 0);
                        }


                        b = new SolidBrush(c);
                        //4
                        g.FillPolygon(b, new PointF[3] {
                            new PointF(point3D[5].X, point3D[5].Y), new PointF(point3D[0].X, point3D[0].Y), new PointF(point3D[1].X, point3D[1].Y)
                        });
                        g.DrawLine(p, point3D[5].X, point3D[5].Y, point3D[0].X, point3D[0].Y);
                        g.DrawLine(p, point3D[5].X, point3D[5].Y, point3D[1].X, point3D[1].Y);
                        g.DrawLine(p, point3D[1].X, point3D[1].Y, point3D[0].X, point3D[0].Y);
                    }
                }
                pictureBox1.Refresh();
            }
            stopwatch.Stop();
            label11.Text = "Runtime: " + stopwatch.Elapsed.ToString();
            GC.Collect();
        }