Как найти центр тяжести многоугольника
Понятие «центр тяжести многоугольника» можно интерпретировать тремя различными способами:
- Масса находится только в вершинах, причем каждая вершина «весит» одинаково
- Масса равномерно распределена по границе многоугольника
- Масса равномерно распределена по области, ограниченной многоугольником.
Рассмотрим все три интерпретации в порядке возрастания сложности алгоритма.
1. Масса находится только в вершинах, причем каждая вершина весит одинаково
В этом случае координаты центра тяжести выражаются по формулам:
Xc = (M1*X1 + . + MN*XN)/M Yc = (M1*Y1 + . + MN*YN)/M
(Xi, Yi) — координаты i-ой вершины многоугольника,
Mi — масса i-ой вершины.
M — масса всех вершин (M = M1 + . + MN)
Таким образом для нашего частного случая имеем:
Xc = (X1 + . + XN)/N Yc = (Y1 + . + YN)/N,
что никакой сложности в реализации не представляет.
2. Масса равномерно распределена по границе многоугольника
В этом случае масса ребра пропорциональна его длине. Таким образом каждое ребро мы можем заменить на точечную массу (пропорциональную длине ребра). Затем применяя те же формулы для определения центра тяжести получаем:
Xc = (L1*X’1 + L2*X’2 + . + LN*X’N) / P Yc = (L1*Y’1 + L2*Y’2 + . + LN*Y’N) / P
(X’i, Y’i) — координаты, середины i-ого ребра.
Li — длина i-ого ребра
P — периметр многоугольника (P = L1 + . + LN) Обозначим эти формулы (*)
Ниже представлена программа, реализующая описанный алгоритм:
#include #include #define MAX 100 int n; double x[MAX]; double y[MAX]; // возвращает длину отрезка с координатами (x1,y1)-(x2,y2) double length(double x1,double y1,double x2,double y2) < return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); >void main() < // будем вводить данные из файла freopen("input.txt","r",stdin); while (scanf("%d",&n)==1) < for(int j=0; j// применяем формулы (*) double l = length(x[i],y[i],x[(i+1)%n],y[(i+1)%n]); xc += l * (x[i]+x[(i+1)%n]) / 2; yc += l * (y[i]+y[(i+1)%n]) / 2; P += l; > xc/=P; yc/=P; printf("%lf %lf\n",xc,yc); > >
3. Масса равномерно распределена по области, ограниченной многоугольником.
Этот случай уже не является столь тривиальным, как два предыдущих. Для построения алгоритма понадобится следующий факт:
Предложение 1
Пусть фигура Ф есть объединение двух других фигур Ф1 и Ф2 (пересекающихся только по границе).
Тогда центр тяжести фигуры Ф выражается так:
Xc = (Xc1*S1 + Xc2*S2) / S Yc = (Yc1*S1 + Yc2*S2) / S
(Xc, Yc) — координаты центра тяжести Ф
(Xc1, Yc1) — координаты центра тяжести Ф1
(Xc2, Yc2) — координаты центра тяжести Ф2
S — площадь Ф
S1 — площадь Ф1
S2 — площадь Ф2
(Это утверждение очевидно следует из определения центра тяжести произвольной фигуры и свойства аддитивности интеграла)
Кроме того для треугольника центр тяжести определяется так:
Xc = (X1 + X2 + X3) / 3 Yc = (Y1 + Y2 + Y3) / 3
Разобьем наш многоугольник на треугольники. Для каждого треугольника найдем его центр тяжести (Xci, Yci) и площадь (Si). После этого, согласно Предложению 1, координаты центра тяжести многоугольника можно найти следующим образом:
Xc = (Xc1*S1 + . + XcN*SM) / S Yc = (Yc1*S1 + . + YcN*SM) / S
M — количество треугольников, на которые мы разбили многоугольник
S — площадь всего многоугольника (S = S1 + . + SM)
Обозначим эти формулы (**)
Остается вопрос, как разбить многоугольник на треугольники. Если многоугольник выпуклый, а вершины перечислены в порядке обхода по или против часовой стрелки, то достаточно просто найти одну точку внутри многоугольника (Xm,Ym), а затем разбить многоугольник на N следующих треугольников:
Если же многоугольник выпуклый, но вершины перечислены не в порядке обхода, то их придется упорядочить. Сделать это можно, например, отсортировав вершины по углу между положительной полуосью ОХ и вектором (Xi-Xm, Yi-Ym).
Невыпуклый многоугольник всегда можно разбить на несколько выпуклых. А затем, применив описанный алгоритм для каждой выпуклой части, и используя Предложение 1, найти центр тяжести всего многоугольника. Задача о разбиении произвольного многоугольника на выпуклые части является самостоятельной задачей, которая рассмотрена в соответствующем разделе. Поэтому представленная ниже реализация алгоритма работает только для выпуклых многоугольников.
Ниже представлен пример реализации описанного алгоритма на языке С для нахождения центра тяжести выпуклого многоугольника, вершины которого перечислены в порядке обхода по или против часовой стрелки:
#include #include #define MAX 100 double x[MAX], y[MAX]; int n; // возвращает площадь треугольника по координатам вершин // площадь - это половина модуля векторного произведения двух сторон double square(double x1,double y1,double x2,double y2,double x3,double y3) < return 0.5*fabs((x2-x3)*(y1-y3) - (x1-x3)*(y2-y3)); >int main(void) < freopen("input.txt","r",stdin); while (scanf("%d", &n) == 1) // количество вершин в многоугольнике < double xm=0, ym=0; for(int i=0; ixm/=n; ym/=n; // координаты точки внутри многоугольника double s = 0; double xc=0,yc=0; // Шагаем по треугольникам. Их n штук for(i=0; i// используем полученные формулы (**) double s1 =square(xm,ym,x[i],y[i],x[(i+1)%n],y[(i+1)%n]); xc+=s1*(xm+x[i]+x[(i+1)%n])/3; yc+=s1*(ym+y[i]+y[(i+1)%n])/3; s+=s1; > xc/=s; yc/=s; printf("%lf %lf\n", xc, yc); > return 0; >
К статье можно в текстовом формате.
Как вычислить центр тяжести плоской ограниченной фигуры
с помощью двойного интеграла?
Данная статья посвящена наиболее распространённому на практике приложению двойного интеграла – вычислению центра тяжести плоской ограниченной фигуры. Многие читатели интуитивно понимают, что такое центр тяжести, но, тем не менее, рекомендую повторить материал одного из уроков аналитической геометрии, где я разобрал задачу о центре тяжести треугольника и в доступной форме расшифровал физический смысл этого термина.
В самостоятельных и контрольных заданиях для решения, как правило, предлагается простейший случай – плоская ограниченная однородная фигура, то есть фигура постоянной физической плотности – стеклянная, деревянная, оловянная чугунные игрушки, тяжёлое детство и т.д. Далее по умолчанию речь пойдёт только о таких фигурах =)
Первое правило и простейший пример: если у плоской фигуры есть центр симметрии, то он является центром тяжести данной фигуры. Например, центр круглой однородной пластины. Логично и по-житейски понятно – масса такой фигуры «справедливо распределена во все стороны» относительно центра. Верти – не хочу.
Однако в суровых реалиях вам вряд ли подкинут сладкую эллиптическую шоколадку, поэтому придётся вооружиться серьёзным кухонным инструментом:
Координаты центра тяжести плоской однородной ограниченной фигуры рассчитываются по следующим формулам:
, или:
, где – площадь области (фигуры); или совсем коротко:
Интеграл будем условно называть «иксовым» интегралом, а интеграл – «игрековым» интегралом.
Примечание-справка: для плоской ограниченной неоднородной фигуры, плотность которой задана функцией , формулы более сложные:
, где – масса фигуры; в случае однородной плотности они упрощаются до вышеприведённых формул.
На формулах, собственно, вся новизна и заканчивается, остальное – это ваше умение решать двойные интегралы, кстати, сейчас предоставляется прекрасная возможность потренироваться и усовершенствовать свою технику. А совершенству, как известно, нет предела =)
Закинемся бодрящей порцией парабол:
Найти координаты центра тяжести однородной плоской фигуры, ограниченной линиями .
Решение: линии здесь элементарны: задаёт ось абсцисс, а уравнение – параболу, которая легко и быстро строится с помощью геометрических преобразований графиков:
– парабола , сдвинутая на 2 единицы влево и на 1 единицу вниз.

Я выполню сразу весь чертёж с готовой точкой центра тяжести фигуры:
Правило второе: если у фигуры существует ось симметрии, то центр тяжести данной фигуры обязательно лежит на этой оси.
В нашем случае фигура симметрична относительно прямой , то есть фактически мы уже знаем «иксовую» координату точки «эм».
Также обратите внимание, что по вертикали центр тяжести смещён ближе к оси абсцисс, поскольку там фигура более массивна.
Полезная рекомендация: ещё до вычислений постарайтесь определить примерное расположение центра тяжести «на глазок» – это поможет проверить полученные значения на предмет явных ошибок.
Да, возможно, ещё не все до конца поняли, что такое центр тяжести: пожалуйста, поднимите вверх указательный палец и мысленно поставьте на него заштрихованную «подошву» точкой . Теоретически фигура не должна упасть.
Координаты центра тяжести фигуры найдём по формулам , где .
Порядок обхода области (фигуры) здесь очевиден:
Внимание! Определяемся с наиболее выгодным порядком обхода один раз – и используем его для всех интегралов!
1) Сначала вычислим площадь фигуры. Ввиду относительной простоты интеграла решение можно оформить компактно, главное, не запутаться в вычислениях:
Смотрим на чертёж и прикидываем по клеточкам площадь. Получилось около дела.
2) Иксовая координата центра тяжести уже найдена «графическим методом», поэтому можно сослаться на симметрию и перейти к следующему пункту. Однако так делать всё-таки не советую – велика вероятность, что решение забракуют с формулировкой «используйте формулу».
В этой связи координату лучше рассчитать формально. Вычислим «иксовый» интеграл:
Заметьте, что здесь можно обойтись исключительно устными вычислениями – иногда совсем не обязательно приводить дроби к общему знаменателю или мучить калькулятор.
Таким образом:
, что и требовалось получить.
3) Найдём ординату центра тяжести. Вычислим «игрековый» интеграл:
А вот тут без калькулятора пришлось бы тяжко. На всякий случай закомментирую, что в результате умножения многочленов получается 9 членов, причём некоторые из них подобны. Подобные слагаемые я привёл устно (как это обычно принято делать в похожих случаях) и сразу записал итоговую сумму .
В результате:
, что очень и очень похоже на правду.
На заключительном этапе отмечаем на чертеже точку . По условию не требовалось ничего чертить, но в большинстве задач мы волей-неволей вынуждены изобразить фигуру. Зато есть безусловный плюс – визуальная и довольно эффективная проверка результата.
Ответ:
Следующие два примера для самостоятельного решения.
Найти координаты центра тяжести однородной плоской фигуры, ограниченной линиями
Кстати, если вы представляете, как расположена парабола и увидели точки, в которых она пересекает ось , то здесь и на самом деле можно обойтись без чертежа.
Найти центр тяжести однородной плоской фигуры, ограниченной линиями
В случае затруднений с построением графиков, изучите (повторите) урок о параболах и/или Пример №11 статьи Двойные интегралы для чайников.
Примерные образцы решений в конце урока.
Кроме того, десяток-другой похожих примеров можно найти в соответствующем архиве на странице Готовые решения по высшей математике.
Ну а я не могу не порадовать любителей высшей математики, которые часто просят меня разбирать и трудные задачки:
Найти центр тяжести однородной плоской фигуры, ограниченной линиями . Фигуру и её центр тяжести изобразить на чертеже.

Решение: условие данной задачи уже категорично требует выполнения чертежа. А ведь требование не настолько и формально! – эту фигуру способен представить в уме даже человек со средним уровнем подготовки:
Прямая рассекает круг на 2 части, и дополнительная оговорка (см. линейные неравенства) указывает на то, что речь идёт именно о маленьком заштрихованном кусочке.
Фигура симметрична относительно прямой (изображена пунктиром), поэтому центр тяжести должен лежать на данной линии. И, очевидно, что его координаты равны по модулю. Отличный ориентир, практически исключающий ошибочный ответ!
Теперь плохая новость =) На горизонте маячит малоприятный интеграл от корня, который мы подробно разобрали в Примере №4 урока Эффективные методы решения интегралов. И кто его знает, что там нарисуется ещё. Казалось бы, ввиду наличия окружности выгодно перейти к полярной системе координат, однако не всё так просто. Уравнение прямой преобразуется к виду и интегралы тоже получатся не сахарные (хотя фанаты тригонометрических интегралов оценят). В этой связи осмотрительнее остановиться на декартовых координатах.
Порядок обхода фигуры:
1) Вычислим площадь фигуры:
Первый интеграл рациональнее взять подведением под знак дифференциала:
А во втором интеграле проведём стандартную замену:
Вычислим новые пределы интегрирования:
Весьма достоверно, едем дальше:
Здесь во 2-м интеграле опять был использован метод подведения функции под знак дифференциала. Отработайте и возьмите на вооружение эти оптимальные (по моему мнению) приёмы решения типовых интегралов.
После непростых и длительных вычислений вновь обращаем свой взор на чертёж (помним, что точки мы пока не знаем!) и получаем глубокое моральное удовлетворение от найденного значения .
3) Исходя из проведённого ранее анализа, осталось убедиться, что .
Изобразим точку на чертеже. В соответствии с формулировкой условия запишем её как окончательный ответ:
Похожее задание для самостоятельного решения:
Найти центр тяжести однородной плоской фигуры, ограниченной линиями . Выполнить чертёж.
Эта задача интереса тем, что в ней задана фигура достаточно малых размеров, и если где-нибудь допустить ошибку, то высока вероятность вообще «не попасть» в область. Что, безусловно, хорошо с точки зрения контроля решения.
Примерный образец оформления в конце урока.

Иногда бывает целесообразен переход к полярным координатам в двойных интегралах. Это зависит от фигуры. Искал-искал у себя удачный пример, но не нашёл, поэтому продемонстрирую ход решения на 1-й демо-задаче указанного выше урока:
Напоминаю, что в том примере мы перешли к полярным координатам, выяснили порядок обхода области и вычислили её площадь
Давайте найдём центр тяжести данной фигуры. Схема та же: . Значение просматривается прямо из чертежа, а «иксовая» координата должна быть смещена чуть ближе к оси ординат, поскольку там располагается более массивная часть полукруга.
В интегралах используем стандартные формулы перехода:
Правдоподобно, скорее всего, не ошиблись.
Примечание: интеграл подробно разобран в Примере №9 урока Интегралы от тригонометрических функций.
, что и требовалось получить.
Как-то так невзначай на этой странице уместились 17 двойных интегралов, что является полнейшим безобразием, по причине того, что за окном жаркие деньки июня, которые совсем не располагают к учёбе.
Успешной сдачи сессии!
Решения и ответы:

Пример 2: Решение: выполним чертёж:
Координаты центра тяжести фигуры найдём по формулам , где .
Порядок обхода области:
1) Вычислим площадь фигуры:
2) Найдём абсциссу центра тяжести.
3) Найдём ординату центра тяжести.
Ответ:

Пример 3: Решение: выполним чертеж:
Выберем следующий порядок обхода фигуры:
Найдём центр тяжести . Используем формулы , где
1) Вычислим площадь фигуры:
2) Найдём абсциссу центра тяжести.
3) Найдём ординату центра тяжести.
(интеграл от нечетной функции по симметричному относительно нуля отрезку)
Ответ:

Пример 5: Решение: выразим функции в явном виде:
Выполним чертеж:
Выберем следующий порядок обхода фигуры:
По соответствующим формулам найдём координаты центра тяжести данной фигуры.
В первом интеграле проведем замену:
Новые пределы интегрирования:
Ответ:
Автор: Емелин Александр

(Переход на главную страницу)

Zaochnik.com – профессиональная помощь студентам,
cкидкa 15% на первый зaкaз, при оформлении введите прoмoкoд: 5530-hihi5
© Copyright mathprofi.ru, Александр Емелин, 2010-2024. Копирование материалов сайта запрещено
Как найти центр тяжести?

В инженерной практике случается, что возникает необходимость вычислить координаты центра тяжести сложной плоской фигуры, состоящей из простых элементов, для которых расположение центра тяжести известно. Такая задача является частью задачи определения.
. геометрических характеристик составных поперечных сечений балок и стержней. Часто с подобными вопросами приходится сталкиваться инженерам-конструкторам вырубных штампов при определении координат центра давления, разработчикам схем погрузки различного транспорта при размещении грузов, проектировщикам строительных металлических конструкций при подборе сечений элементов и, конечно, студентам при изучении дисциплин «Теоретическая механика» и «Сопротивление материалов».
Библиотека элементарных фигур.

Для симметричных плоских фигур центр тяжести совпадает с центром симметрии. К симметричной группе элементарных объектов относятся: круг, прямоугольник (в том числе квадрат), параллелограмм (в том числе ромб), правильный многоугольник.
Из десяти фигур, представленных на рисунке выше, только две являются базовыми. То есть, используя треугольники и сектора кругов, можно скомбинировать почти любую фигуру, имеющую практический интерес. Любые произвольные кривые можно, разбив на участки, заменить дугами окружностей.
Оставшиеся восемь фигур являются самыми распространенными, поэтому они и были включены в эту своеобразную библиотеку. В нашей классификации эти элементы не являются базовыми. Прямоугольник, параллелограмм и трапецию можно составить из двух треугольников. Шестиугольник – это сумма из четырех треугольников. Сегмент круга — это разность сектора круга и треугольника. Кольцевой сектор круга — разность двух секторов. Круг – это сектор круга с углом α=2*π=360˚. Полукруг – это, соответственно, сектор круга с углом α=π=180˚.
Расчет в Excel координат центра тяжести составной фигуры.
Передавать и воспринимать информацию, рассматривая пример, всегда легче, чем изучать вопрос на чисто теоретических выкладках. Рассмотрим решение задачи «Как найти центр тяжести?» на примере составной фигуры, изображенной на рисунке, расположенном ниже этого текста.

Составное сечение представляет собой прямоугольник (с размерами a1 =80 мм, b1 =40 мм), к которому слева сверху добавили равнобедренный треугольник (с размером основания a2 =24 мм и высотой h2 =42 мм) и из которого справа сверху вырезали полукруг (с центром в точке с координатами x03 =50 мм и y03 =40 мм, радиусом r3 =26 мм).
В помощь для выполнения расчета привлечем программу MS Excel или программу OOo Calc. Любая из них легко справится с нашей задачей!
В ячейках с желтой заливкой выполним вспомогательные предварительныерасчеты .
В ячейках со светло-желтой заливкой считаем результаты .
Синий шрифт – это исходные данные.
Черный шрифт – это промежуточные результаты расчетов.
Красный шрифт – это окончательные результаты расчетов.
Начинаем решение задачи – начинаем поиск координат центра тяжести сечения.
Исходные данные:
1. Названия элементарных фигур, образующих составное сечение впишем соответственно
в ячейку D3: Прямоугольник
в ячейку E3: Треугольник
в ячейку F3: Полукруг
2. Пользуясь представленной в этой статье «Библиотекой элементарных фигур», определим координаты центров тяжести элементов составного сечения xci и yci в мм относительно произвольно выбранных осей 0x и 0y и запишем
в ячейку D4: =80/2=40,000
xc 1 = a 1 /2
в ячейку D5: =40/2=20,000
yc 1 = b 1 /2
в ячейку E4: =24/2=12,000
xc 2 = a 2 /2
в ячейку E5: =40+42/3=54,000
yc 2 = b 1 + h 2 /3
в ячейку F4: =50=50,000
xc 3 = x03
в ячейку F5: =40-4*26/3/ПИ()=28,965
yc 3 = y 03 -4* r3 /3/π
3. Рассчитаем площади элементов F 1 , F 2 , F3 в мм2, воспользовавшись вновь формулами из раздела «Библиотека элементарных фигур»
в ячейке D6: =40*80=3200
F1 = a 1 * b1
в ячейке E6: =24*42/2=504
F2 = a2 * h2 /2
в ячейке F6: =-ПИ()/2*26^2=-1062
F3 = -π/2* r3 ^2
Площадь третьего элемента – полукруга – отрицательная потому, что это вырез – пустое место!

Расчет координат центра тяжести:
4. Определим общую площадь итоговой фигуры F0 в мм2
в объединенной ячейке D8E8F8: =D6+E6+F6=2642
F0 = F 1 + F 2 + F3
5. Вычислим статические моменты составной фигуры Sx и Sy в мм3 относительно выбранных осей 0x и 0y
в объединенной ячейке D9E9F9: =D5*D6+E5*E6+F5*F6=60459
Sx = yc1 * F1 + yc2 * F2 + yc3 * F3
в объединенной ячейке D10E10F10: =D4*D6+E4*E6+F4*F6=80955
Sy = xc1 * F1 + xc2 * F2 + xc3 * F3
6. И в завершение рассчитаем координаты центра тяжести составного сечения Xc и Yc в мм в выбранной системе координат 0x — 0y
в объединенной ячейке D11E11F11: =D10/D8=30,640
Xc = Sy / F0
в объединенной ячейке D12E12F12: =D9/D8=22,883
Задача решена, расчет в Excel выполнен — найдены координаты центра тяжести сечения, составленного при использовании трех простых элементов!
Заключение.
Пример в статье был выбран очень простым для того, чтобы легче было разобраться в методологии расчетов центра тяжести сложного сечения. Метод заключается в том, что любую сложную фигуру следует разбить на простые элементы с известными местами расположения центров тяжести и произвести итоговые вычисления для всего сечения.
Если сечение составлено из прокатных профилей – уголков и швеллеров, то их нет необходимости разбивать на прямоугольники и квадраты с вырезанными круговыми «π/2»- секторами. Координаты центров тяжести этих профилей приведены в таблицах ГОСТов, то есть и уголок и швеллер будут в ваших расчетах составных сечений базовыми элементарными элементами (о двутаврах, трубах, прутках и шестигранниках говорить нет смысла – это центрально симметричные сечения).
Расположение осей координат на положение центра тяжести фигуры, конечно, не влияет! Поэтому выбирайте систему координат, упрощающую вам расчеты. Если, например, я развернул бы в нашем примере систему координат на 45˚ по часовой стрелке, то вычисление координат центров тяжести прямоугольника, треугольника и полукруга превратилось бы в еще один отдельный и громоздкий этап расчетов, который «в уме» не выполнишь.
Представленный ниже расчетный файл Excel в данном случае программой не является. Скорее – это набросок калькулятора, алгоритм, шаблон по которому следует в каждом конкретном случае составлять свою последовательность формул для ячеек с яркой желтой заливкой.
Итак, как найти центр тяжести любого сечения вы теперь знаете! Полный расчет всех геометрических характеристик произвольных сложных составных сечений будет рассмотрен в одной из ближайших статей в рубрике «Механика».
Несколько слов о бокале, монете и двух вилках, которые изображены на «значке-иллюстрации» в самом начале статьи. Многим из вас, безусловно, знаком этот «трюк», вызывающий восхищенные взгляды детей и непосвященных взрослых. Тема этой статьи – центр тяжести. Именно он и точка опоры, играя с нашим сознанием и опытом, попросту дурачат наш разум!
Центр тяжести системы «вилки+монета» всегда располагается на фиксированном расстоянии по вертикали вниз от края монеты, который в свою очередь является точкой опоры. Это положение устойчивого равновесия! Если покачать вилки, то сразу становится очевидным, что система стремится занять свое прежнее устойчивое положение! Представьте маятник – точка закрепления (=точка опоры монеты на кромку бокала), стержень-ось маятника (=в нашем случае ось виртуальная, так как масса двух вилок разведена в разные стороны пространства) и груз внизу оси (=центр тяжести всей системы «вилки+монета»). Если начать отклонять маятник от вертикали в любую сторону (вперед, назад, налево, направо), то он неизбежно под действием силы тяжести будет возвращаться в исходное устойчивое состояние равновесия (это же самое происходит и с нашими вилками и монетой)!
Кто не понял, но хочет понять – разберитесь самостоятельно. Это ведь очень интересно «доходить» самому! Добавлю, что этот же принцип использования устойчивого равновесия реализован и в игрушке ванька–встань-ка. Только центр тяжести у этой игрушки расположен выше точки опоры, но ниже центра полусферы опорной поверхности.
Ссылка на скачивание файла: raschet-tsentra-tyazhesti (xls 17,0KB).
Научный форум dxdy
Нахождение центра произвольного многоугольника
| На страницу 1 , 2 , 3 След. |
Нахождение центра произвольного многоугольника
05.02.2018, 18:18
Последний раз редактировалось GANJE 05.02.2018, 18:32, всего редактировалось 2 раз(а).
Есть произвольный невыпуклый многоугольник на плоской плоскости, заданный списком вершин, то есть векторов. Я придумала, как приближённо найти у него подходящий центр так, чтобы при вращении вокруг этого центра многоугольник не сильно колбасило. Время линейно зависит от количества вершин. Наверняка есть какие-то более хитрые и заумные алгоритмы, но мой мне нравится простотой. Я его ещё не написала. Итак, вкратце:
1) хватаем любую (первую) вершину и начинаем крутить;
2) для каждой итерации берём ограничивающий прямоугольник и находим его центр (элементарно — пересечение диагоналей);
3) сохраняем каждый предварительный центр относительно каждого поворота;
4) поворачиваем все центры обратно;
5) находим приближённый центр как центр тяжести предварительных центров.
Крутим раз 10-12. Даже на моём слабеньком компьютере все эти синусы-косинусы даже 1000 раз по 10000 (пробовала) вычислялись меньше чем за секунду, а кроме того, можно заранее составить таблицу, и каждый раз их вычислять вообще не придётся.
Чем плох простой центр тяжести?
Предположим, у нас есть многоугольник из 100000000 + 1 вершин. 100000000 вершин лежит близко к стороне правильного треугольника и изображает реки, леса, поля, птичек и кошечек. А 1 вершина находится на противолежащей вершине правильного треугольника. И тогда центр тяжести будет сколь угодно близок к «тяжёлой» стороне треугольника, чем больше нулей возьмём, тем ближе.
Зачем я это объясняю. Я пишу программу, которая будет работать с выкройками, а простейшее представление выкройки — многоугольник. Детали надо покрутить так, чтобы на тех отрезах произвольной формы, что есть у пользователя (он сам должен задать их), осталось как можно меньше неизрасходованной ткани. И соответственно, больше остатков можно было пустить в дело.
Что вы думаете по этому поводу? Думала использовать центр описанной вокруг выпуклого огибающего многоугольника окружности, но если многоугольник по форме будет близок к полуокружности, то центр будет рядом с краем, поэтому крутиться будет некрасиво. А надо чтобы удобно.
Да и ещё «построение минимальной выпуклой оболочки» мне показалось чем-то чудовищным, хотя если вникнуть, может не стоить и выеденного яйца.
Только сейчас сообразила: крутить можно вокруг любой выбранной точки, не только вершины многоугольника, просто я хотела нарисовать ограничивающий прямоугольник для каждого поворота и посмотреть, а для этого удобнее, чтобы центр вращения был как-то ближе к многоугольнику, ну, чтобы он (многоугольник) далеко не убегал.