예제 #1
0
파일: Form1.cs 프로젝트: ogamespec/psxdev
        /// <summary>
        /// Резиновая трансформация изображений
        /// </summary>
        /// <param name="boxFrom"></param>
        /// <param name="boxTo"></param>
        private void RubberWarping(EntityBox boxFrom, EntityBox boxTo)
        {
            Delaunay delaunay = new Delaunay();

            //
            // Получить ключевые точки
            //

            List <Point2D> pointsLeft  = GetKeypoints(boxFrom);
            List <Point2D> pointsRight = GetKeypoints(boxTo);

            //
            // Добавить точки по краям изображения
            //

            float gapFromWidth  = 25;
            float gapFromHeight = 25;
            float scale         = new Vec(pointsLeft[0], pointsLeft[1]).Length() /
                                  new Vec(pointsRight[0], pointsRight[1]).Length();
            float gapToWidth  = gapFromWidth * scale;
            float gapToHeight = gapFromHeight * scale;

            AddCornerKeypoints(ref pointsLeft, gapFromWidth, gapFromHeight);
            AddCornerKeypoints(ref pointsRight, gapToWidth, gapToHeight);

            //
            // Триангулируем
            //

            List <Triangle> mesh = delaunay.GenMesh(pointsLeft);

            //
            // Сформировать изображение справа
            //

            Point2D bottomDownTo = BottomDownPoint(pointsRight);

            Bitmap   bitmap = new Bitmap((int)bottomDownTo.X + 1, (int)bottomDownTo.Y + 1);
            Graphics gr     = Graphics.FromImage(bitmap);

            gr.Clear(Color.Gray);
            boxTo.Image0 = bitmap;

            //
            // Трилатеральный перенос треугольников левого изображения в правое
            //

            foreach (Triangle sourceTri in mesh)
            {
                Triangle destTri = new Triangle();

                destTri.a = MapPoint(sourceTri.a, pointsRight);
                destTri.b = MapPoint(sourceTri.b, pointsRight);
                destTri.c = MapPoint(sourceTri.c, pointsRight);

                NonAffineTransform.WarpTriangle(boxFrom.Image0,
                                                boxTo.Image0,
                                                sourceTri, destTri);
            }
        }
예제 #2
0
        private void GenMesh()
        {
            Delaunay       delaunay = new Delaunay();
            List <Point2D> points   = new List <Point2D>();

            foreach (Entity entity in entityBox1.GetEntities())
            {
                Point screen = entityBox1.LambdaToScreen(entity.LambdaX, entity.LambdaY);
                points.Add(new Point2D(screen.X, screen.Y));
            }

            //
            // Триангулируем
            //

            List <Triangle> mesh;

            try
            {
                mesh = delaunay.GenMesh(points);
            }
            catch
            {
                return;
            }

            //
            // Отобразить треугольную сетку
            //

            foreach (Triangle tri in mesh)
            {
                AddTriangle(entityBox1, tri);
            }
        }
예제 #3
0
파일: Form1.cs 프로젝트: ogamespec/psxdev
        /// <summary>
        /// Сгенерировать и показать треугольную сетку
        /// </summary>
        /// <param name="box"></param>
        private void GenerateMesh(EntityBox box)
        {
            Delaunay delaunay = new Delaunay();

            List <Point2D> points = new List <Point2D>();

            //
            // Получить ключевые точки
            //

            foreach (Entity entity in box.GetEntities())
            {
                if (entity.IsVias())
                {
                    Point   p     = box.LambdaToScreen(entity.LambdaX, entity.LambdaY);
                    Point2D point = new Point2D(p.X, p.Y);
                    points.Add(point);
                }
            }

            if (points.Count < 3)
            {
                MessageBox.Show("3 or more keypoints required!", "Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            //
            // Добавить ключевые точки по углам
            //

            AddCornerKeypoints(ref points, 25, 25);

            //
            // Триангулируем
            //

            List <Triangle> mesh = delaunay.GenMesh(points);

            //
            // Отобразить треугольную сетку
            //

            Random rnd = new Random();

            foreach (Triangle tri in mesh)
            {
                Color randomColor = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256));

                AddTriangle(box, tri, randomColor);
            }
        }