Поиск устойчивого размещения нерегулярной (не выпуклой) формы

Учитывая образ двумерной нерегулярной (невыпуклой) формы, как я мог бы вычислить все способы, которыми он мог бы лежать на плоской поверхности? Например, если форма является идеальным прямоугольным прямоугольником, то она, несомненно, будет иметь 4 способа, в которых она стабильна. С другой стороны, круг не имеет устойчивой ориентации, или каждая точка является устойчивой ориентацией.

EDIT: Там эта симпатичная маленькая игра называется Splitter (бойтесь, захватывающая игра впереди), которая кажется близкой к тому, что я хочу. Заметив, что вы отрезали кусок дерева, он упал бы на землю и улегся.

EDIT: В итоге подход, который я принял, - вычислить центр масс (формы) и вычислить выпуклую оболочку (используя OpenCV), а затем пропустить каждую пару вершин. Если центр масс падает на вершину линии, образованной двумя вершинами, он считается стабильным, иначе нет.

Ответ 1

Сначала найдите его центр масс (СМ). Стабильная позиция - это позиция, в которой CM будет выше, если вы сделаете небольшое вращение. Теперь посмотрите на корпус, наименьшую выпуклую область, которая окружает форму:

Convex Hull and Centre of Mass
(источник: walkytalky.net)

Если корпус является многоangularьником, то устойчивое положение - это положение, в котором фигура покоится на одной из сторон, а КМ находится непосредственно над этой стороной (не обязательно над средней точкой стороны, просто где-то над ней).

Если у корпуса есть изгибы (то есть, если у формы есть изгибы, которые касаются корпуса), им необходимо уделить особое внимание. Форма будет устойчивой, если она опирается на изогнутый край, если КМ находится непосредственно над самой нижней точкой кривой, а радиус кривой в этой точке больше высоты КМ.

Примеры:

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

Illustration of the examples
(источник: walkytalky.net)

(Положение эллипса, помеченное знаком X, нестабильно, поскольку кривизна меньше расстояния до центра масс.)

Ответ 2

Примечание. В этом ответе предполагается, что ваша фигура является правильным многоangularьником.

Для наших целей мы определим положение равновесия как положение, в котором центр масс находится непосредственно над точкой, которая находится между крайней левой и правой точками контакта с землей объекта (при условии, что земля плоская поверхность, перпендикулярная силе тяжести). Это будет работать во всех случаях, для всех форм.

Обратите внимание, что это фактически физическое определение вращательного равновесия, как следствие ньютоновской вращательной кинематики.

Для правильного многоangularьника, если мы исключим случаи, когда они находятся на единственной вершине, это определение эквивалентно устойчивой позиции.

Поэтому, если у вас прямая сила тяжести, сначала найдите самые левые и самые правые части, которые касаются земли.

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

После этого, оставьте строку с вашего CoM; если пересечение CoM и земли находится между этими двумя значениями x, оно находится в равновесии.

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

Обратите внимание, что это также можно использовать для измерения "насколько устойчив" объект - эта мера является максимальным y-расстоянием, на которое Центр масс может переместиться, прежде чем он перестанет находиться в пределах диапазона двух точек контакта.

ОБНОВЛЕНИЕ: изящная диаграмма, сделанная наспех

Diagram

Итак, как вы можете использовать это, чтобы найти все способы, которыми он может сидеть на столе? См:


EDIT

Программируемый подход

Вместо вычислительно дорогой задачи поворота фигуры, попробуйте это вместо этого.

Ваше представление формы в вашей программе, вероятно, должно иметь список всех вершин.

Найдите вершины своей фигуры выпуклой оболочки (в основном, вашей фигуры, но со всеми вогнутыми вершинами - вершины, которые "вставлены" - исключены).

Затем выполните итерацию по каждой из пары смежных вершин на вашей выпуклой оболочке (т.е. если бы у меня были вершины A, B, C, D, я бы повторил через AB, BC, CD, DA)

Сделайте этот тест:

  1. Нарисуйте линию A через две тестируемые вершины
  2. Нарисуйте линию перпендикулярно A, проходя через CoM C.
  3. Найти пересечение двух прямых (простая алгебра)
  4. Если значение y пересечения находится между значением y двух вершин, оно устойчиво. Если все значения y равны, сравните значения x.

Это должно сработать.

Вот пример выполнения теста на одной паре вершин:

Example test

Если ваша форма не представлена его вершинами в структуре данных, вам следует попытаться преобразовать их. Если это что-то вроде круга или эллипса, вы можете использовать эвристику, чтобы угадать ответ (круг имеет бесконечные положения равновесия; эллипс 4, хотя только две "устойчивые" точки). Если это изогнутая нерегулярная шаткая форма, вам придется предоставить свою структуру данных, чтобы я мог помочь в программном отношении, а не просто предоставлять эвристику в каждом конкретном случае.

Ответ 3

Я уверен, что это не самый эффективный алгоритм, но это идея.

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