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