на самом деле невыпуклый многоугольник - это очень нетривиальный вариант. В первом приближении сгодится центр того вписанного треугольника, образованного тремя произвольными вершинами многоугольника, что имеет наибольшую площадь.
Вы лучше дайте хороший алгоритм для выпуклого
ПС: Деление многоугольника прямой на 2 равных по площади части - как бы вы это сделали?
Вот что я придумал.
Начнем с выпуклого: допустим, нам необходимо разделить его на 2 равные по площади части линией, параллельно оси х.
Проводим через каждую вершину прямую, параллельную оси х, таким образом разделив многоугольник на множество простых фигур, каждая из которых будет являть либо треугольником, либо трапецией.
Найти площадь каждой из этих фигур тривиально.
Затем начинаем двигаться с двух сторон, суммируя площади, и находим фигуру, обладающую такой площадью, что если прибавить ее к сумме площадей фигур ниже нее, эта сумма станет больше суммы площадей фигур выше нее, а если прибавить ее к сумме площадей фигур выше нее, эта сумма станет больше суммы площадей фигур ниже нее.
Затем следует разделить ее линией, параллельной оси х на две части так, чтобы S ниж. части + сумма S нижних фигур = S верхней части + сумма S верхних фигур. Эту задачу я пока не решил, но решу, вечером, когда время будет.
Вот иллюстрация:
Аналогично для невыпуклого, с такой принципиальной разницей, что в разрезе у нас может оказаться не одна, а множество фигур, и задача станет в том, чтобы разделить одной линией их сразу все в верной пропорции. Учитывая их свойства, особенно то, что трапеции будут все образованы двумя параллельными линиями, возможно, даже с моим убогим знанием геометрии, я, возможно, решу эту задачу, но опять же, все в будущем времени
А теперь два таких быстрых варианта, без сложного решения, в контексте задачи о центре многоугольника.
1) для выпуклого, тупо взять центр найденной срединной трапеции.
2) для невыпуклого, найти среди фигур разреза такую же срединную фигуру и взять ее центр.
P.S. А вот еще пара идей конечно, это все будет не так точно, как если найти точно точку пересечения двух разделяющих прямых:
1) для выпуклого:
мы находим разрез по х, находим разрез по у.
Эти 4 прямые образуют прямоугольник. Берем его центр.
2) для невыпуклого:
находим также такую точку, и, так как она может быть вне многоугольника, ищем ближайшую к ней точку, принадлежащую многоугольнику, и считаем ее центром.
Если считать задачу разделения напополам по площади решенной, а она 100% решаема, то вышеупомянутой точкой будет не центр прямоугольника, а точка пересечения разделяющих прямых.
Сообщение отредактировал Havoc: 24.12.2009, 10:41:47