コード例 #1
0
        public static Bitmap Start(Lamp lamp)
        {
            int h = 720, w = 1080;
            Container <Figure> list = new Container <Figure>();
            Point    obs            = new Point(0, 0, -1000);
            double   alf            = Math.PI / 4;
            double   bt             = Math.PI / 4;
            double   gm             = 0;
            Lamp     Lamp           = lamp;
            Bitmap   frame          = new Bitmap(w, h);
            Graphics paint          = Graphics.FromImage(frame);
            Pen      painter        = new Pen(Color.Black);

            paint.Clear(Color.White);

            obs.Rotate(alf, bt, gm);
            Point B = new Point(250, 100, -500);
            Point C = new Point(-250, 100, -500);
            Point F = new Point(-250, 100, 500);
            Point D = new Point(250, 100, 500);

            Point G = new Point(-250, -200, 500);
            Point H = new Point(250, -200, 500);
            Point K = new Point(-250, -200, -500);


            list.PushBack(new Cube(new Point(0, 0, 0), 200));
            list.PushBack(new Cube(new Point(0, -150, 0), 100));

            list.PushBack(new Triangle(B, C, F));
            list.PushBack(new Triangle(D, F, B));

            list.PushBack(new Triangle(C, K, G));
            list.PushBack(new Triangle(C, F, G));

            list.PushBack(new Triangle(D, F, G));
            list.PushBack(new Triangle(D, H, G));

            Point  curr   = new Point();
            Point  inter  = new Point();
            Point  inter2 = new Point();
            double lastdist;

            for (int i = 0; i < w; i++)
            {
                for (int j = 0; j < h; j++)
                {
                    curr.X = -w / 2 + i;
                    curr.Y = -h / 2 + j;
                    curr.Z = -500;
                    curr.Rotate(alf, bt, gm);
                    lastdist = double.MaxValue;


                    for (int a = 0; a < list.GetSize(); a++)
                    {
                        if (list[a].Intersect(obs, curr, ref inter))
                        {
                            if (Point.Distance(obs, inter) < lastdist)
                            {
                                int il = illumination(Point.Distance(Lamp, inter));
                                frame.SetPixel(i, j, Color.FromArgb(il, il, il));
                                lastdist = Point.Distance(obs, inter);
                                for (int b = 0; b < list.GetSize(); b++)
                                {
                                    if (list[b].Intersect(inter, Lamp, ref inter2))
                                    {
                                        frame.SetPixel(i, j, Color.Black);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(frame);
        }