Учитывая изображение 2-мерной неправильной (невыпуклой) формы, как был бы я способный вычислить все пути, которыми это могло лечь стабильное на плоскую поверхность? Например, если форма будет прямоугольником полного квадрата, то она будет, конечно, иметь 4 пути, которыми это стабильно. Круг, с другой стороны, или не имеет никакой стабильной ориентации или каждой точки, стабильная ориентация.
Править: Существует эта миленькая игра под названием Разделитель (Остерегайтесь, захватывающая игра вперед), который кажется близко к тому, что я хочу. Замеченный, что Вы сокращаете кусок дерева, он упал бы на землю и положил бы стабильным способом.
Править: В конце подход, который я проявил, должен вычислить центр массы (формы) и вычислить выпуклую оболочку (использующий OpenCV), и затем цикл через каждую пару вершин. Если центр массовых падений сверху строки, сформированной этими 2 вершинами, это считают стабильным, еще, нет.
Сначала найдите его центр масс (CM). Устойчивое положение - это положение, в котором CM будет выше , если вы сделаете небольшой поворот. Теперь посмотрите на корпус, наименьшую выпуклую область, которая окружает фигуру:
(источник: walkytalky.net )
Если корпус представляет собой многоугольник, то стабильным положением считается положение, в котором форма опирается на одну из сторон, а CM находится прямо над этой стороной (не обязательно над серединой стороны, а где-то над ней.
Если у корпуса есть изгибы (то есть, если форма имеет изгибы, которые касаться корпуса), они должны быть обработаны особым образом. Форма будет стабильной, если опираться на изогнутую кромку, если только CM находится непосредственно над самой нижней точкой кривой, а радиус кривой в этой точке больше, чем высота CM.
Примеры:
(источник: walkytalky.net )
(Положение эллипса, отмеченное знаком X, нестабильно, потому что кривизна меньше, чем расстояние до центра масс.)
примечание: этот ответ предполагает, что ваша форма является правильным многоугольником.
Для наших целей мы определим положение равновесия как положение, при котором Центр масс находится непосредственно над точкой, которая находится между крайней левой и крайней правой точками контакта с землей объекта (при условии, что земля плоская поверхность, перпендикулярная силе тяжести). Это будет работать во всех случаях для всех форм.
Обратите внимание, что это фактически физическое определение вращательного равновесия, как следствие ньютоновской вращательной кинематики.
Для правильного многоугольника, если мы исключим случаи, когда они стоят на единственной вершине, это определение эквивалентно устойчивому положению.
Итак, если у вас прямая гравитация, направленная вниз, сначала найдите крайнюю левую и крайнюю правую ее части, которые касаются земли.
Затем вычислите свой Центр масс. Для многоугольника с известными вершинами и однородной плотностью эта задача сводится к нахождению Центроида ( соответствующий раздел ).
После этого напишите письмо из своего CoM; если точка пересечения CoM и земли находится между этими двумя значениями x, значит, она находится в состоянии равновесия.
Если ваша самая левая и самая правая точки совпадают (т. Е. В круглом объекте), это все равно останется; просто не забывайте быть осторожными с вашими сравнениями с плавающей запятой.
Обратите внимание, что это также можно использовать для измерения «устойчивости» объекта - эта мера представляет собой максимальное расстояние по оси Y, на которое Центр масс может переместиться, прежде чем он выйдет за пределы диапазона двух точек контакта.
РЕДАКТИРОВАТЬ: изящная диаграмма, сделанная наспех
Итак, как вы можете использовать ее, чтобы найти все способы, которыми она может разместиться на столе? См .:
РЕДАКТИРОВАТЬ
Вместо дорогостоящей вычислительной задачи поворота формы попробуйте это.
Представление вашей формы в вашей программе, вероятно, должно иметь список всех вершин.
Найдите вершины выпуклой оболочки вашей фигуры (в основном, вашей формы, но со всеми вогнутыми вершинами - вершинами, которые "вдавлены" - удалены).
Затем выполните итерацию по каждой из пар соседних вершин выпуклой оболочки (т.е. если бы у меня были вершины A, B, C, D, я бы перебирал AB, BC, CD, DA).
Выполните этот тест :
Это должно помочь.
Вот пример теста, запущенного на одной паре вершин:
Если ваша фигура не представлена своими вершинами в вашей структуре данных, вы должны попытаться преобразовать их.Если это что-то вроде круга или эллипса, вы можете использовать эвристику, чтобы угадать ответ (круг имеет бесконечные положения равновесия; эллипс 4, хотя и только две «устойчивые» точки). Если это изогнутая, шаткая неправильная форма, вам придется предоставить свою структуру данных, чтобы я мог помочь программным способом, вместо того, чтобы просто предоставлять эвристику для каждого конкретного случая.
Я уверен, что это не самый эффективный алгоритм, но это идея.
Если вы можете упорядочить вершины многоугольника (при условии, что он имеет конечное число вершин), то просто перебирайте смежные пары вершин и записывайте угол, под которым он опирается, с помощью некоторой формы моделирования. В случае странных форм, таких как звезды, будут дублированные ориентации, но вы можете приспособиться к этому, отслеживая вращение в состоянии покоя.