Задать вопрос

Как найти сумму углов n-многоугольника?

Здравствуйте!

Мне нужно определить, выпуклый многоугольник или нет. Если сумма его углов = 180*(n-2), то он выпуклый, в противном случае - нет.

Так как можно найти сумму его углов? Спасибо.
  • Вопрос задан
  • 2960 просмотров
Подписаться 5 Оценить Комментировать
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вы выбрали неудачный метод проверки на выпуклость. Из-за погрешности при расчётах углов велики шансы получить неточное значение, причём погрешность при суммировании будет накапливаться.
Правильный метод - проверка знаков векторных произведений соседних отрезков. Для выпуклого многоугольника все произведения будут иметь один и тот же знак, зависящий от направления обхода.
#define sign(x) ((x) == 0 ? 0 : ((x) > 0 ? 1 : -1))
#define vmul(i,j,k) = ((x[(j)]-x[(i)])*(y[(k)]-y[(j)])-(x[(k)]-x[(j)])*(y[(j)]-y[(i)]))
bool function isConvex(double *x, double *y, int n) {
    S = sign(vmul(n-2, n-1, 0));
    if ((S1 = vmul(n-1, 0, 1)) != 0 && sign(S1) != S)
        return false;
    for (int i = 0; i < n-2; i++)
        if ((S1 = vmul(i, i+1, i+2)) != 0 && sign(S1) != S )
            return false;
    return true;
}

Контроль на совпадение точек (Pi = Pi+1) или (Pi = Pi+2) добавьте сами.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Teivaz
@Teivaz
Он будет выпуклым даже если один угол больше 180 градусов.
Ответ написан
Комментировать
Grox
@Grox
Если просто определить, выпуклый многоугольник или нет, то воспользоваться одним из его определений:
многоугольник без самопересечений такой, что каждый внутренний угол которого не более 180°;

Ответ: Проверить все углы, если каждый угол <= 180°, то это выпуклый многоугольник.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы