Здраствуйте. Не понимаю как решить задачу на СИ
Заданы координаты вершин четырехугольника. Вывести их в порядке обхода по часовой стрелке. Главная проблема в том, что в задаче можно использовать только условные операторы, массивы и функции нельзя использовать, задача из вуза для закрепления темы про условные операторы, не понимаю как можно вывести координаты по часовой при помощи условных операторов.
- Комментарий преподавателя: Предлагаю 2 варианта.
- Найдите координаты центра множества - среднее арифметическое по x и y, она будет внутри четырехугольника (рекомендую сразу рисовать). Если от этой точки построить отрезки (векторы) до каждой вершины, то можно найти углы наклона этих отрезков. Теперь берем эти углы от большего к меньшему (находим самый большой, потом и оставшихся следующий самый большой и потом наибольший из двух оставшихся) и выводим координаты вершин в этом же порядке.
- Берем первую точку в качестве начала, а остальные три - как концы векторов. Находим попарные векторные произведения и так определяем, какой вектор левее всех, его конец - это вторая точка. Аналогично из оставшихся двух определяем левый (третья точка) и остается последняя точка.
Ответы (1 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
В предположении что все точки - вершины выпуклого четырёхугольника, задачу решает сортировка трёх точек по углу вокруг первой:
#include <stdio.h>
int main() {
int x0, y0, x1, y1, x2, y2, x3, y3;
scanf("%d%d%d%d%d%d%d%d", &x0, &y0, &x1, &y1, &x2, &y2, &x3, &y3);
if ((x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0) > 0) {
int tmp = x1;
x1 = x2;
x2 = tmp;
tmp = y1;
y1 = y2;
y2 = tmp;
}
if ((x1 - x0) * (y3 - y0) - (x3 - x0) * (y1 - y0) > 0) {
int tmp = x1;
x1 = x3;
x3 = tmp;
tmp = y1;
y1 = y3;
y3 = tmp;
}
if ((x2 - x0) * (y3 - y0) - (x3 - x0) * (y2 - y0) > 0) {
int tmp = x2;
x2 = x3;
x3 = tmp;
tmp = y2;
y2 = y3;
y3 = tmp;
}
printf("%d %d\n%d %d\n%d %d\n%d %d\n", x0, y0, x1, y1, x2, y2, x3, y3);
}