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");
        }
Esempio n. 2
0
        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");
        }