Как мне создать алгоритм для центроида любого объекта System.Windows.Media.Geometry? - PullRequest
1 голос
/ 25 августа 2009

Я планирую разделить объект Geometry на ряд более простых форм и объединить их центроиды по следующей формуле:
image
Mathematical details of this formula can be found in эта статья в Википедии .

ВНИМАНИЕ: Не удивляйтесь, если мой взгляд на математику неверен. После тригонометрии я не делал сложных математических операций, и мне никогда не приходилось иметь дело с греческими буквами. Я думаю, что понимаю это довольно хорошо, но, пожалуйста, просто дайте мне знать, если я ошибаюсь.

Информационная заметка : центроид геометрической формы или призмы - это не просто середина формы. Это центр тяжести или центр масс. Я предполагаю, что объекты Geometry могут также инкапсулировать 3D-призмы, поэтому мне, возможно, придется учесть это в будущем, но сейчас я сосредоточусь только на 2D-геометрии. Для 2D-фигуры вы должны представить, что это жесткий лист бумаги с заданной формой, а центроид будет точкой, в которой этот листок бумаги будет балансировать на игле.

Первая проблема, с которой я столкнулся, заключается в том, что мне нужно найти способ точного разбиения любого данного объекта Geometry на достаточно простые фигуры, чтобы эта формула могла работать правильно. У кого-нибудь есть идеи, как этого достичь? Или есть лучшая процедура, которая все еще будет работать универсально?

Вторая проблема, с которой я сталкиваюсь, заключается в том, что после разделения геометрии, как мне найти центроид каждой части? Каждый тип простой формы (треугольник, четырехугольник, полукруг и т. Д.) Имеет свою формулу центроида. Есть ли у меня способ выяснить, какой тип фигуры у каждого куска?

Ответы [ 2 ]

3 голосов
/ 25 августа 2009

Тесселяция или дискретизация произвольных двумерных плоских форм является распространенной проблемой при анализе методом конечных элементов. Обычно это делается с помощью плоских треугольников или четырехугольников. Попробуйте поиск в Google по "2d генерации конечно-элементных сеток" или по генерации квадродеревьев или октодеревьев. Вы можете вычислить центр тяжести каждой простой фигуры и применить приведенную вами (правильную) формулу.

Что-то вроде этого . Или эти . Конечно, вам нужно будет указать исходную геометрию для рассматриваемого тела.

Вам еще предстоит длинный ряд. Вам нужно будет сделать все следующее:

  1. Найдите программу автоматического построения сетки и научитесь вводить геометрию для вашей 2D-фигуры.
  2. Запустите автоматическую сетку и получите вывод сетки, который будет состоять из всех двухмерных точек в пространстве и связности всех треугольных и четырехугольных элементов.
  3. Напишите программу для чтения в сетке и рассчитайте площадь и центр тяжести каждого элемента.
  4. Вставьте эти значения в формулу, которую вы указали, чтобы вычислить центр тяжести вашей исходной 2D-формы. Это означает зацикливание всех элементов и накопление площадей и произведений координат (x, y) центроида каждого элемента и его площади.
  5. Получив ответ, вы должны проверить сходимость. Вы делаете это, улучшая вашу сетку, делая элементы меньше и пересчитывая. Вы знаете, что сблизились, когда вы уточнили сетку, и ответы изменились менее чем на небольшой допуск (5% или что вы хотите терпеть).

Это все еще изрядное количество работы.

ОБНОВЛЕНИЕ: Этот выглядит довольно хорошо, и это с открытым исходным кодом.

0 голосов
/ 25 августа 2009

У меня нет кода для этого, но я видел, где фигура была пересечена (в данном случае с помощью полигональная триангуляция ), поэтому у вас будет хороший набор треугольников. Затем вычислите комбинированный центроид на основе средневзвешенного значения центроида треугольников.

РЕДАКТИРОВАТЬ:

Есть блог от ребят, работающих над продуктом AGI под названием Insight3D . В этой записи они говорят о триангуляции. Это может помочь вам сделать это, так как они дают больше указателей на алгоритмы. В зависимости от вашего использования, вы можете повторно использовать один из их реализаций . Это бесплатно для разработки и некоммерческого использования.

...