Задача: Добавить n пиксельный буфер в существующий многоугольник (гарантированный быть закрытым, неперекрывающимся и точками по часовой стрелке) при сохранении центроид многоугольника.Добавьте N пиксельный буфер в многоугольник (регион/путь), поддерживая Centroid в C#
Текущий: У меня есть класс PolyRegion, который содержит путь System.Drawing и System.Drawing Region. Когда я создаю экземпляр класса, я добавляю буфер факторов в путь и масштабирую/преобразую его. Результат сдвигается, если масштабируется относительно центра тяжести.
Пример: Зеленый полигон является оригиналом. Когда я масштабирую его в n раз, я получаю/хочу фиолетовый многоугольник (центрированный по центру).
Вопрос: Как можно масштабировать относительно центроида? AM Мне лучше масштабировать каждую точку в массиве точек или масштабировать Path/Region?
Код:
public PolyRegion(Int32 Id, List<Point> Points)
{
this.Id = Id;
this.Points = Points;
this.Path = this.CreatePath();
float factor = 10;
float wScale = (float)((this.Path.GetBounds().Width - factor)/this.Path.GetBounds().Width);
float hScale = (float)((this.Path.GetBounds().Height - factor)/this.Path.GetBounds().Height);
Matrix transformMatrix = new Matrix();
transformMatrix.Scale(wScale, hScale);
this.Path.Transform(transformMatrix);
this.Region = new Region(this.Path);
this.Area = CalculateArea();
}
Поскольку вы не укажете его в своем коде, я бы вычислил (x, y) как среднее из всех точки с вашей фигуры. – SJuan76
Почему № 1 необходимо? Почему бы просто не масштабировать, а затем переставлять? Кажется, есть лучший способ сделать это. –
Обычно графические алгоритмы имеют дело с матрицами, поскольку он предлагает однородный инструмент для всех преобразований, а в настоящее время HW оптимизирован. Конечно, способ, который вы предлагаете, возможен для этой конкретной ситуации; если центроид равен '(x, y)', то после приближения к шкале 'k' он будет' (kx, ky) '. Исчисление необходимого перевода оставлено в качестве упражнения для читателя :-). – SJuan76