Пример #1
0
 private void InitializePoints(LowPolyMotion.GridConfig gridConfig, ref LowPolyMotion.MotionPoint[,] points)
 {
     LowPolyMotion.GridInfo gridInfo = gridConfig.getGridInfo();
     for (int i = 0; i < gridInfo.c_x; i++)
     {
         for (int j = 0; j < gridInfo.c_y; j++)
         {
             points[i, j] = new LowPolyMotion.MotionPoint(rand.Next(LowPolyMotion.rangeN.min, LowPolyMotion.rangeN.max), 0, NewEndXYZ(gridConfig, i, j), NewEndXYZ(gridConfig, i, j));
         }
     }
 }
Пример #2
0
        private void InitializeLowPolyConfig(LowPolyMotion.GridConfig gridConfig, int boardWidth, int boardHeight, int pointCount)
        {
            if (pointCount <= 1)
            {
                pointCount = 2;
            }

            // Initialize Grid
            gridConfig.initGridConfig(boardWidth, boardHeight, pointCount);

            // Initialize Rects
            LowPolyMotion.GridInfo gridInfo = gridConfig.getGridInfo();
            gridInfo.c_x = grid.getCrossCellCount();
            gridInfo.c_y = grid.getDirectionCellCount();
            gridInfo.c_w = grid.getCrossCellWidth();
            gridInfo.c_h = grid.getDirectionCellHeight();
            rects        = new LowPolyMotion.Rect[gridInfo.c_x, gridInfo.c_y];
            for (int i = 0; i < gridInfo.c_x; i++)
            {
                for (int j = 0; j < gridInfo.c_y; j++)
                {
                    rects[i, j]            = new LowPolyMotion.Rect();
                    rects[i, j].xyz        = new LowPolyMotion.xyz(gridInfo.c_w * i, gridInfo.c_h * j, 0);
                    rects[i, j].w          = gridInfo.c_w;
                    rects[i, j].h          = gridInfo.c_h;
                    rects[i, j].T_Diagonal = rand.Next(0, 2); // [0,2)
                }
            }

            // Initialize Points
            points = new LowPolyMotion.MotionPoint[gridInfo.c_x, gridInfo.c_y];
            InitializePoints(gridConfig, ref points);
            CalOutCenter(gridConfig, ref rects, points);

            // Initialize Light
            light = new LowPolyMotion.MotionPoint(rand.Next(LowPolyMotion.rangeN.min, LowPolyMotion.rangeN.max), 0, new LowPolyMotion.xyz(boardWidth / 2, boardHeight / 2, rand.Next(LowPolyMotion.rangeZ.min, LowPolyMotion.rangeZ.max)), NewEndXYZ(boardWidth, boardHeight, LowPolyMotion.rangeZ.light_min, LowPolyMotion.rangeZ.light_max));

            // Color Rendering
            ColorRendering(gridConfig, ref rects, points);
        }
Пример #3
0
        private void Draw(LowPolyMotion.GridConfig gridConfig, LowPolyMotion.Rect[,] rects, LowPolyMotion.MotionPoint[,] points, Boolean showExtrInf = false)
        {
            // 在内存中建立虚拟画布
            Bitmap bitmap = new Bitmap(this.Size.Width, this.Size.Height);

            // 获取内存画布的 Graphics 引用
            Graphics g = Graphics.FromImage(bitmap);

            g.Clear(Color.White);

            // 获取网格基础信息
            LowPolyMotion.GridInfo gridInfo = gridConfig.getGridInfo();

            // 创建画笔
            Pen myPen = new Pen(Color.Black, 2);

            // 绘图
            if (showExtrInf)
            {
                /// 画网格线
                myPen.Color = Color.Tan;
                for (int i = 0; i < gridInfo.c_x + 1; i++)
                {
                    g.DrawLine(myPen, gridInfo.c_w * i, 0, gridInfo.c_w * i, gridInfo.c_h * gridInfo.c_y);
                }
                for (int j = 0; j < gridInfo.c_y + 1; j++)
                {
                    g.DrawLine(myPen, 0, gridInfo.c_h * j, gridInfo.c_w * gridInfo.c_x, gridInfo.c_h * j);
                }

                /// 画点
                myPen.Color = Color.Black;
                for (int i = 0; i < gridInfo.c_x; i++)
                {
                    for (int j = 0; j < gridInfo.c_y; j++)
                    {
                        g.DrawRectangle(myPen, points[i, j].motionData.current_xyz.x - 1, points[i, j].motionData.current_xyz.y - 1, 2, 2);
                    }
                }

                /// 连线
                myPen.Color = Color.Black;
                LowPolyMotion.MotionPoint[] ro_p = new LowPolyMotion.MotionPoint[4];

                for (int i = 0; i < gridInfo.c_x - 1; i++)
                {
                    for (int j = 0; j < gridInfo.c_y - 1; j++)
                    {
                        // 被连线的网格顶点
                        ro_p[0] = points[i, j];
                        ro_p[1] = points[i + 1, j];
                        ro_p[2] = points[i, j + 1];
                        ro_p[3] = points[i + 1, j + 1];

                        // 四边形连线
                        g.DrawLine(myPen, ro_p[0].motionData.current_xyz.x, ro_p[0].motionData.current_xyz.y, ro_p[1].motionData.current_xyz.x, ro_p[1].motionData.current_xyz.y);
                        g.DrawLine(myPen, ro_p[0].motionData.current_xyz.x, ro_p[0].motionData.current_xyz.y, ro_p[2].motionData.current_xyz.x, ro_p[2].motionData.current_xyz.y);
                        g.DrawLine(myPen, ro_p[1].motionData.current_xyz.x, ro_p[1].motionData.current_xyz.y, ro_p[3].motionData.current_xyz.x, ro_p[3].motionData.current_xyz.y);
                        g.DrawLine(myPen, ro_p[2].motionData.current_xyz.x, ro_p[2].motionData.current_xyz.y, ro_p[3].motionData.current_xyz.x, ro_p[3].motionData.current_xyz.y);

                        // 对角线
                        if (rects[i, j].T_Diagonal == 0) // 0.\  1./
                        {
                            g.DrawLine(myPen, ro_p[0].motionData.current_xyz.x, ro_p[0].motionData.current_xyz.y, ro_p[3].motionData.current_xyz.x, ro_p[3].motionData.current_xyz.y);
                        }
                        else
                        {
                            g.DrawLine(myPen, ro_p[1].motionData.current_xyz.x, ro_p[1].motionData.current_xyz.y, ro_p[2].motionData.current_xyz.x, ro_p[2].motionData.current_xyz.y);
                        }
                    }
                }
            }

            // 颜色渲染
            SolidBrush myBrush = new SolidBrush(Color.BlueViolet);

            Point[] myPoints = new Point[3];
            for (int i = 0; i < gridInfo.c_x - 1; i++)
            {
                for (int j = 0; j < gridInfo.c_y - 1; j++)
                {
                    if (rects[i, j].T_Diagonal == 0) // 0.\ 1./
                    {
                        // 左边面
                        myPoints[0].X = (int)points[i, j].motionData.current_xyz.x; myPoints[0].Y = (int)points[i, j].motionData.current_xyz.y;
                        myPoints[1].X = (int)points[i, j + 1].motionData.current_xyz.x; myPoints[1].Y = (int)points[i, j + 1].motionData.current_xyz.y;
                        myPoints[2].X = (int)points[i + 1, j + 1].motionData.current_xyz.x; myPoints[2].Y = (int)points[i + 1, j + 1].motionData.current_xyz.y;
                        myBrush.Color = Color.FromArgb(rects[i, j].color[0].R, rects[i, j].color[0].G, rects[i, j].color[0].B);
                        g.FillPolygon(myBrush, myPoints);
                        // 右边面
                        myPoints[1].X = (int)points[i + 1, j].motionData.current_xyz.x; myPoints[1].Y = (int)points[i + 1, j].motionData.current_xyz.y;
                        myBrush.Color = Color.FromArgb(rects[i, j].color[1].R, rects[i, j].color[1].G, rects[i, j].color[1].B);
                        g.FillPolygon(myBrush, myPoints);
                    }
                    else
                    {
                        // 左边面
                        myPoints[0].X = (int)points[i, j].motionData.current_xyz.x; myPoints[0].Y = (int)points[i, j].motionData.current_xyz.y;
                        myPoints[1].X = (int)points[i + 1, j].motionData.current_xyz.x; myPoints[1].Y = (int)points[i + 1, j].motionData.current_xyz.y;
                        myPoints[2].X = (int)points[i, j + 1].motionData.current_xyz.x; myPoints[2].Y = (int)points[i, j + 1].motionData.current_xyz.y;
                        myBrush.Color = Color.FromArgb(rects[i, j].color[0].R, rects[i, j].color[0].G, rects[i, j].color[0].B);
                        g.FillPolygon(myBrush, myPoints);
                        // 右边面
                        myPoints[0].X = (int)points[i + 1, j + 1].motionData.current_xyz.x; myPoints[0].Y = (int)points[i + 1, j + 1].motionData.current_xyz.y;
                        myBrush.Color = Color.FromArgb(rects[i, j].color[1].R, rects[i, j].color[1].G, rects[i, j].color[1].B);
                        g.FillPolygon(myBrush, myPoints);
                    }
                }
            }

            if (showExtrInf)
            {
                // 画重心
                myPen.Color = Color.DarkBlue;
                for (int i = 0; i < gridInfo.c_x - 1; i++)
                {
                    for (int j = 0; j < gridInfo.c_y - 1; j++)
                    {
                        myPen.Color = Color.DarkBlue;
                        g.DrawRectangle(myPen, rects[i, j].outcentreXYZ[0].x - 2, rects[i, j].outcentreXYZ[0].y - 2, 4, 4);
                        g.DrawRectangle(myPen, rects[i, j].outcentreXYZ[1].x - 2, rects[i, j].outcentreXYZ[1].y - 2, 4, 4);
                        myPen.Color = Color.FromArgb(50, 23, 23, 23);
                        g.DrawLine(myPen, rects[i, j].outcentreXYZ[0].x, rects[i, j].outcentreXYZ[0].y, light.motionData.current_xyz.x, light.motionData.current_xyz.y);
                        g.DrawLine(myPen, rects[i, j].outcentreXYZ[1].x, rects[i, j].outcentreXYZ[1].y, light.motionData.current_xyz.x, light.motionData.current_xyz.y);
                    }
                }

                // 画点光源
                myPen.Color = Color.Red;
                g.DrawRectangle(myPen, light.motionData.current_xyz.x - 2, light.motionData.current_xyz.y - 2, 4, 4);
            }

            // 将内存画布绘制到屏幕上
            Graphics myGraphics = this.CreateGraphics();

            myGraphics.DrawImage(bitmap, 0, 0);

            // 释放资源
            bitmap.Dispose();
            g.Dispose();
            myPen.Dispose();
            myGraphics.Dispose();
        }