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