примечание: в этом ответе предполагается, что ваша фигура является правильным многоугольником.
Для наших целей мы определим положение равновесия как положение, в котором Центр масс находится непосредственновыше точки, которая находится между крайней левой и правой точками контакта с землей объекта (при условии, что земля представляет собой плоскую поверхность, перпендикулярную силе гравитации).Это будет работать во всех случаях, для всех форм.
Обратите внимание, что это фактически физическое определение вращательного равновесия, как следствие ньютоновской вращательной кинематики.
Для правильного многоугольника, если мы исключим случаи, когда он стоит на единственной вершине, это определение эквивалентно устойчивой позиции.
Итак, если у вас прямая гравитация вниз, сначала найдитесамые левые и самые правые его части, которые касаются земли.
Затем вычислите свой центр масс. Для многоугольника с известными вершинами и равномерной плотности эта проблемасводится к поиску Centroid ( соответствующий раздел ).
После этого удалите строку из вашего CoM;если пересечение CoM и земли находится между этими двумя значениями x, оно находится в равновесии.
Если крайняя левая точка и крайняя правая точка совпадают (т. е. в круглом объекте), это все равно будет сохраняться;просто помните, что нужно быть осторожным с вашими сравнениями с плавающей запятой.
Обратите внимание, что это также может быть использовано для измерения "насколько устойчив" объект - эта мера является максимальным y-расстоянием, на которое Центр масс может двигаться доон больше не находится в пределах диапазона между двумя контактными точками.
РЕДАКТИРОВАТЬ: изящная диаграмма, сделанная наспех
Диаграмма http://img52.imageshack.us/img52/9506/1276930988102131dc.png
Итак, как вы можете использовать это, чтобы найтивсе способы он может сидеть на столе?См .:
РЕДАКТИРОВАТЬ
Программируемый подход
Вместо дорогостоящей задачи вращения формы, попробуйте это вместо этого.
Представление вашей фигуры в вашей программе, вероятно, должно иметь список всех вершин.
Найдите вершины выпуклой оболочки вашей фигуры (в основном, ваша фигура, но со всеми вогнутыми вершинами)- вершины, которые "вставлены" - исключены).
Затем выполните итерацию по каждой из пары смежных вершин на вашей выпуклой оболочке (т. е. если бы у меня были вершины A, B, C, D, I 'повторить AB, BC, CD, DA)
Выполните этот тест:
- Нарисуйте линию A через две тестируемые вершины
- Нарисуйте линию, перпендикулярную A , проходя через CoM C .
- Найдите пересечение двух линий (простая алгебра)
- Еслизначение y пересечения находится между значением y двух вершин, оно устойчиво.Если все значения y равны, сравните значения x.
Это должно сработать.
Вот пример теста, выполняемого на одной паре вершин:
Пример теста http://img17.imageshack.us/img17/918/stabled.png
Если ваша форма не представлена его вершинами в структуре данных, вам следует попытаться преобразовать их.Если это что-то вроде круга или эллипса, вы можете использовать эвристику, чтобы угадать ответ (круг имеет бесконечные положения равновесия; эллипс 4, хотя только две «устойчивые» точки).Если это изогнутая, шаткая неправильная форма, вам придется предоставить свою структуру данных, чтобы я мог помочь в программном отношении, вместо того, чтобы просто предоставлять эвристику в каждом конкретном случае.