protected override void Algorithm(ref Cl3DModel p_Model) { Cl3DModel.Cl3DModelPointIterator iter = p_Model.GetIterator(); float maxX = iter.X; float minX = iter.X; float maxY = iter.Y; float minY = iter.Y; do { if (maxX < iter.X) maxX = iter.X; if (maxY < iter.Y) maxY = iter.Y; if (minX > iter.X) minX = iter.X; if (minY > iter.Y) minY = iter.Y; } while (iter.MoveToNext()); int width = (int)(maxX - minX) + 1; int height = (int)(maxY - minY) + 1; Bitmap map = new Bitmap(width, height); ClRaserizer rasterizer = new ClRaserizer(map, width, height); List<ClTools.ClTriangle> triangles = null; iter = p_Model.GetIterator(); do { ClTools.GetListOfTriangles(out triangles, iter); foreach (ClTools.ClTriangle triangle in triangles) { int x1 = (int)(((triangle.m_point1.X - minX)/(maxX-minX)) * (width-1)); int y1 = (int)(((triangle.m_point1.Y - minY)/(maxY-minY)) * (height-1)); int x2 = (int)(((triangle.m_point2.X - minX)/(maxX-minX)) * (width-1)); int y2 = (int)(((triangle.m_point2.Y - minY)/(maxY-minY)) * (height-1)); int x3 = (int)(((triangle.m_point3.X - minX)/(maxX-minX)) * (width-1)); int y3 = (int)(((triangle.m_point3.Y - minY)/(maxY-minY)) * (height-1)); rasterizer.DrawTriangle( triangle.m_point1.Color, x1, y1, triangle.m_point2.Color, x2, y2, triangle.m_point3.Color, x3, y3 ); } } while (iter.MoveToNext()); if (CenterFaceBasedOnNoseTip) { Cl3DModel.Cl3DModelPointIterator NoseTip = p_Model.GetSpecificPoint(Cl3DModel.eSpecificPoints.NoseTip); int NoseTipX = (int)(((NoseTip.X - minX) / (maxX - minX)) * (width - 1)); int NoseTipY = (int)(((NoseTip.Y - minY) / (maxY - minY)) * (height - 1)); int MaxDistanceFromTheNoseTip = (int)Math.Max(Math.Max(NoseTipX, NoseTipY), Math.Max(Math.Abs(width - NoseTipX), Math.Abs(height - NoseTipY))); int OffsetX = (int)((MaxDistanceFromTheNoseTip) - NoseTipX); int OffsetY = (int)((MaxDistanceFromTheNoseTip) - NoseTipY); Bitmap NewMap = new Bitmap((MaxDistanceFromTheNoseTip * 2), (MaxDistanceFromTheNoseTip * 2)); for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) NewMap.SetPixel(OffsetX + i, OffsetY + j, map.GetPixel(i, j)); map = NewMap; } if (m_FixedSize) { Bitmap bmp = new Bitmap(NewWidth, NewHeight); Graphics graphic = Graphics.FromImage((Image)bmp); graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; graphic.DrawImage(map, 0, 0, NewWidth, NewHeight); graphic.Dispose(); map = bmp; } if (rotate180) map.RotateFlip(RotateFlipType.Rotate180FlipNone); map.Save(p_Model.ModelFilePath + m_sFilePostFix + ".bmp"); }
protected override void Algorithm(ref Cl3DModel p_Model) { Cl3DModel.Cl3DModelPointIterator iter = p_Model.GetIterator(); float maxX = iter.X; float minX = iter.X; float maxY = iter.Y; float minY = iter.Y; do { if (maxX < iter.X) { maxX = iter.X; } if (maxY < iter.Y) { maxY = iter.Y; } if (minX > iter.X) { minX = iter.X; } if (minY > iter.Y) { minY = iter.Y; } } while (iter.MoveToNext()); int width = (int)(maxX - minX) + 1; int height = (int)(maxY - minY) + 1; Bitmap map = new Bitmap(width, height); ClRaserizer rasterizer = new ClRaserizer(map, width, height); List <ClTools.ClTriangle> triangles = null; iter = p_Model.GetIterator(); do { ClTools.GetListOfTriangles(out triangles, iter); foreach (ClTools.ClTriangle triangle in triangles) { int x1 = (int)(((triangle.m_point1.X - minX) / (maxX - minX)) * (width - 1)); int y1 = (int)(((triangle.m_point1.Y - minY) / (maxY - minY)) * (height - 1)); int x2 = (int)(((triangle.m_point2.X - minX) / (maxX - minX)) * (width - 1)); int y2 = (int)(((triangle.m_point2.Y - minY) / (maxY - minY)) * (height - 1)); int x3 = (int)(((triangle.m_point3.X - minX) / (maxX - minX)) * (width - 1)); int y3 = (int)(((triangle.m_point3.Y - minY) / (maxY - minY)) * (height - 1)); rasterizer.DrawTriangle(triangle.m_point1.Color, x1, y1, triangle.m_point2.Color, x2, y2, triangle.m_point3.Color, x3, y3 ); } } while (iter.MoveToNext()); if (CenterFaceBasedOnNoseTip) { Cl3DModel.Cl3DModelPointIterator NoseTip = p_Model.GetSpecificPoint(Cl3DModel.eSpecificPoints.NoseTip); int NoseTipX = (int)(((NoseTip.X - minX) / (maxX - minX)) * (width - 1)); int NoseTipY = (int)(((NoseTip.Y - minY) / (maxY - minY)) * (height - 1)); int MaxDistanceFromTheNoseTip = (int)Math.Max(Math.Max(NoseTipX, NoseTipY), Math.Max(Math.Abs(width - NoseTipX), Math.Abs(height - NoseTipY))); int OffsetX = (int)((MaxDistanceFromTheNoseTip) - NoseTipX); int OffsetY = (int)((MaxDistanceFromTheNoseTip) - NoseTipY); Bitmap NewMap = new Bitmap((MaxDistanceFromTheNoseTip * 2), (MaxDistanceFromTheNoseTip * 2)); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { NewMap.SetPixel(OffsetX + i, OffsetY + j, map.GetPixel(i, j)); } } map = NewMap; } if (m_FixedSize) { Bitmap bmp = new Bitmap(NewWidth, NewHeight); Graphics graphic = Graphics.FromImage((Image)bmp); graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; graphic.DrawImage(map, 0, 0, NewWidth, NewHeight); graphic.Dispose(); map = bmp; } if (rotate180) { map.RotateFlip(RotateFlipType.Rotate180FlipNone); } map.Save(p_Model.ModelFilePath + m_sFilePostFix + ".bmp"); }