Проверка на выпуклость многоугольника - 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; }
Объяснение кода листинга программы
- Ввод количества вершин многоугольника
- Ввод координат вершин многоугольника
- Вычисление вектора между первой и последней вершинами
- Вычисление вектора между второй и предпоследней вершинами
- Проверка на выпуклость многоугольника по формуле: если скалярное произведение векторов между любыми двумя соседними вершинами меняет знак, то многоугольник выпуклый
- Проверка последней пары вершин на выпуклость
- Вывод результата: выпуклый или впуклый многоугольник
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д