Проверка на выпуклость многоугольника - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Реализовать функцию с переменным числом аргументов, принимающую координаты точек многоугольника и вычисляющую является ли этот многоугольник выпуклым. Вот такая задача, более или менее годный код видел только на паскале, но там функция не с переменным числом аргументов, помогите кто чем может Вот тот код на паскале: http://delphid.dax.ru/www/exampl20.htm
Мда, как я понимаю с помощью тут туговато

Решение задачи: «Проверка на выпуклость многоугольника»

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
#define size 100
 
struct koordinati
{
    double x, y;
};
 
koordinati vector_koord(koordinati a, koordinati b);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    koordinati mas[size];
    koordinati vec1, vec2;
    int vershini, i;
 
    printf("Введите количество вершин: ");
    vershini = getche() - 48;
    putchar('\n');
 
    double vect_dob,znak,post_znak;
    int perevir;
 
    perevir = 1;
 
    for (i = 0; i < vershini; i++){
        printf("%d - а точка\n", i+1);
        printf("x = ");
        scanf("%lf", &mas[i].x);
        printf("y = ");
        scanf("%lf", &mas[i].y);
        putchar('\n');
    }
 
    vec1 = vector_koord (mas[vershini-1],mas[0]);
    vec2 = vector_koord (mas[0],mas[1]);
 
    vect_dob = vec1.x * vec2.y - vec2.x * vec1.y;
    znak = vect_dob/fabs(vect_dob);
 
    post_znak = znak;
 
    vec1 = vec2;
 
    for (i = 1; i < vershini - 1; i++){
        vec2 = vector_koord (mas[i], mas[i+1]);
        vect_dob = vec1.x * vec2.y - vec2.x * vec1.y;
 
        znak = vect_dob / fabs (vect_dob);
        if (znak != post_znak) { 
            printf ("Точка %d создает впуклость\n", i + 1);
            perevir = 0; 
        }
        vec1 = vec2;
    }
    i--;
    vec1 = vec2;
    vec2 = vector_koord (mas[i], mas[0]);
    vect_dob = vec1.x * vec2.y - vec2.x * vec1.y;
 
    znak = vect_dob / fabs (vect_dob);
    if (znak != post_znak) { 
        printf ("Точка %d создает впуклость!\n", i + 2);
        perevir = 0; 
    }
 
    printf ("%d-угольник ",vershini);
    if (perevir)
        printf("выпуклый\n");
    else
        printf("впуклый\n");
    getch();
}
 
koordinati vector_koord (koordinati a, koordinati b){ 
    koordinati dod;
    dod.x = b.x - a.x;
    dod.y = b.y - a.y;
    return dod;
}

Объяснение кода листинга программы

  1. Ввод количества вершин многоугольника
  2. Ввод координат вершин многоугольника
  3. Вычисление вектора между первой и последней вершинами
  4. Вычисление вектора между второй и предпоследней вершинами
  5. Проверка на выпуклость многоугольника по формуле: если скалярное произведение векторов между любыми двумя соседними вершинами меняет знак, то многоугольник выпуклый
  6. Проверка последней пары вершин на выпуклость
  7. Вывод результата: выпуклый или впуклый многоугольник

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.692 из 5