2009-08-24 2 views
1

я планирую иметь, чтобы разделить объект Geometry в ряд более простых форм, и объединить их центроиды, используя эту формулу:

Математические детали этой формулы можно найти в this Wikipedia article.Как создать алгоритм для центра тяжести любого объекта System.Windows.Media.Geometry?

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

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

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

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

+0

Нет универсальной формулы, только для конкретной формы. –

+0

Спасибо, Лэнс. Я отредактирую эту часть. – Giffyguy

+1

Ваш взгляд на математику верен. – duffymo

ответ

3

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

Нечто вроде this. Или these. Конечно, вам придется поставлять необработанную геометрию для рассматриваемого тела.

У вас есть длинный ряд для мотыги. Вам нужно будет сделать все из перечисленного:

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

Это еще справедливое количество работ.

ОБНОВЛЕНИЕ: This one выглядит неплохо, и это с открытым исходным кодом.

+0

Интересно ... Я должен попробовать и посмотреть, что они могут сделать. – Giffyguy

+0

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

+0

Google для «треугольника с конечным элементом автоматического сетчатого треугольника» и выберите наиболее подробный, который вы можете найти. Может потребоваться некоторое время, чтобы закодировать - это не будет тривиально. Возможно, вы захотите просто использовать то, что существует: http://www-users.informatik.rwth-aachen.de/~roberts/software.html – duffymo

0

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

EDIT:

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

+0

Я занимаюсь этим несколько часов, и похоже, что тесселяция - это путь. Но мне все еще нужен хороший алгоритм для выполнения тесселяции. Я еще не смог найти ничего явного, кода ИЛИ математики. – Giffyguy

Смежные вопросы