Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
14 / 17 / 11
Регистрация: 20.10.2018
Сообщений: 98

Выпуклая оболочка

24.01.2019, 21:35. Показов 5541. Ответов 3

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Столкнулся с проблемой: не выходит правильно написать выпуклую оболочку

Ввод: количество точек (n), далее n координат (x, y) в декартовой системе координат
Вывод: количество точек на выпуклой оболочке и их координаты в декартовой системе координат

Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <bits/stdc++.h>
 
using namespace std;
 
struct point
{
    long long x, y;
};
 
point operator-(const point& a, const point& b)
{
    return {a.x-b.x, a.y-b.y};
}
 
bool operator<(const point& a, const point& b)
{
    return a.x < b.x || a.x == b.x && a.y < b.y;
}
 
long long operator^(const point& a, const point& b)
{
    return a.x*b.y - a.y*b.x;
}
 
int rotation(const point& a, const point& b, const point& c)
{
    long long cross = (b-a)^(c-b);
    if (cross < 0)
        return -1;
    if (cross > 0)
        return 1;
    return 0;
}
 
void convex_hull(vector<point>& points)
{
    sort(points.begin(), points.end());
    int n = points.size();
    vector<point> top = {points[0]}, bottom = {points[0]};
    for (int i = 1; i < n; i ++)
    {
        if (rotation(points[0], points[n-1], points[i]) >= 0)
        {
            while (top.size() > 1 && rotation(top[top.size()-2], top[top.size()-1], points[i]) >= 0)
                top.pop_back();
            top.push_back(points[i]);
        }
        else
        {
            while (bottom.size() > 1 && rotation(bottom[bottom.size()-2], bottom[bottom.size()-1], points[i]) <= 0)
                bottom.pop_back();
            bottom.push_back(points[i]);
        }
    }
    reverse(bottom.begin(), bottom.end());
    bottom.pop_back();
    cout << top.size() + bottom.size() << "\n";
 
 
    for(int i = 0; i < top.size() ; i ++)
    {
        cout << top[i].x << " " << top[i].y << "\n";
    }
    for(int i = 0; i < bottom.size() ; i ++)
    {
        cout << bottom[i].x << " " << bottom[i].y << "\n";
    }
 
}
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, x, y;
    cin >> n;
    vector < point > points;
    for (int i = 0 ; i < n; i ++)
    {
        cin >> x >> y;
        points.push_back({x, y});
    }
    convex_hull(points);
}
Помогите пожалуйста, срочно

Заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.01.2019, 21:35
Ответы с готовыми решениями:

Задача "Выпуклая оболочка" (acmp)
Вот мой код, при проверке в системе WA на 6-ом тесте. Алгоритм - найти крайние точки и построить прямоугольник по ним. #include...

Графическая оболочка
А чтобы писать программы с графической оболочкой на С++ скоко надо учиться? и как это сложно?

графическая оболочка
Возник вопрос с таким заданием: 1)Нужно создать абстрактный класс &quot;геометрические фигуры&quot; сделать 3 дочерних класса, треугольник,...

3
14 / 17 / 11
Регистрация: 20.10.2018
Сообщений: 98
29.01.2019, 17:34  [ТС]
Тема закрыта

Если кому-то надо то вот код (правильный)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
struct point
{
    long long x, y;
};
 
point operator-(const point& a, const point& b)
{
    return {a.x-b.x, a.y-b.y};
}
 
bool operator<(const point& a, const point& b)
{
    return a.x < b.x || a.x == b.x && a.y < b.y;
}
 
long long operator^(const point& a, const point& b)
{
    return a.x*b.y - a.y*b.x;
}
 
int rotation(const point& a, const point& b, const point& c)
{
    long long cross = (b-a)^(c-b);
    if (cross < 0) return -1;
    if (cross > 0) return 1;
    return 0;
}
 
vector < point > convex_hull(vector<point>& points)
{
    sort(points.begin(), points.end());
    int n = points.size();
    vector<point> top = {points[0]}, bottom = {points[0]};
    for (int i = 1; i < n; i ++)
    {
        if (rotation(points[0], points[n-1], points[i]) >= 0)
        {
            while (top.size() > 1 && rotation(top[top.size()-2], top[top.size()-1], points[i]) >= 0)
                top.pop_back();
            top.push_back(points[i]);
        }
        else
        {
            while (bottom.size() > 1 && rotation(bottom[bottom.size()-2], bottom[bottom.size()-1], points[i]) <= 0)
                bottom.pop_back();
            bottom.push_back(points[i]);
        }
 
    }
 
    while (bottom.size() > 1 && rotation(bottom[bottom.size()-2], bottom[bottom.size()-1], points[n-1]) <= 0)
        bottom.pop_back();
 
    reverse(bottom.begin(), bottom.end());
 
    for (point u:bottom)
        top.push_back(u);
    top.pop_back();
    return top;
}
0
 Аватар для Tlya
16 / 16 / 10
Регистрация: 20.11.2015
Сообщений: 305
07.02.2022, 14:14
А как насчет 3D точек?
Интернет завален решением 2D, а вот с координатами Z решение найти сложновато...
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
07.02.2022, 14:41
Tlya, да тот же принцип. Перебираешь кандидатов на новые точки, оборачиваешь точками, треугольники, с которыми образуют максимальный угол с оболочкой. Всё.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2022, 14:41
Помогаю со студенческими работами здесь

Графическая оболочка
Здравствуйте) у меня возникла проблемка, у меня есть скомпелированная игра &quot;Змейка&quot;, но проблема в том, что еще нужно сделать...

Файловая оболочка
Уважаемые товарищи,прошу помочь мне реализовать такой проект на языке C: Файловая оболочка. * Навигация по дереву...

Графическая оболочка на С++
Привет всем, учил С++ , но так просто для проведения досуга , теперь решил писать программы, столкнулся с вопросом, хочу писать программы,...

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

Оболочка для программы
Вот пишу программу на с++ и интересует, как создать графическую оболочку для программы? Надо сделать окошко для ввода текста двух...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru