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