58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 850
1

Перегрузка операций

17.11.2015, 16:41. Показов 359. Ответов 0
Метки нет (Все метки)

Написал код. (Обход Грэхэма)

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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <iostream>
#include<cmath>
#include<stack>
#include<vector>
#include<fstream>
using namespace std;
const double PI = 3.14159265;
//============================================//
 
struct hull
{
    double x;
    double y;
};
 
int Lowest_point(hull *value, const int n)
{
    int k = 0;
    for (int i = 1; i < n; i++)
    {
        if (value[i].y < value->y)
        {
             k = i;
        }
 
    }
    return k;
}
 
void Angle(vector<double>& ps2, hull* point, const int n)
{
    
    ps2.resize(n);
    int j = Lowest_point(point, n);
    for (int i = 0; i < n; i++)
        ps2[i] = atan2(point[i].y - point[j].y, point[i].x - point[j].x) * 180 / PI;
 
    for (int i = 0; i < n; i++)
        cout << ps2[i] << endl;
}
 
 
void Sort(vector<double> &a, hull *b, const int n)
{
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (a[j] > a[i])
            {
                swap(a[i], a[j]);
                swap(b[i], b[j]);
            }
        }
    }
}
 
double result(const hull &p1, const hull &p2, const hull &p3)
{
    return (p2.x - p1.x)*(p3.y - p1.y) - (p3.x - p1.x)*(p2.y - p1.y);
}
 
bool leftTurn(const hull &a, const hull &b, const hull &c)
{
    return result(a, b, c) > 0;
}
 
void Stack(vector<double> &ang, hull *point)
{
    stack<int>S;
    S.push(0);
    S.push(1);
 
    for (int c = 2; c < ang.size(); c++)
    {
        int a, b;
        do
        {
            b = S.top();
            S.pop();
            a = S.top();
        }
 
        while (!leftTurn(point[a], point[b], point[c]));
 
        S.push(b);
        S.push(c);
    }
 
    cout << endl;
    while (!S.empty())
    {
        cout << point[S.top()].x << " " << point[S.top()].y << endl;
        S.pop();
    }
}
 
 
int main()
{
    ifstream inFile;
    inFile.open("point.txt");
 
    if (!inFile.is_open())
    {
        cout << "Could not open the file! ";
        system("pause");
        exit(EXIT_FAILURE);
    }
 
    int N;
    inFile >> N;
 
    hull *ps = new hull[N];
 
    int i = 0;
    while (i < N && inFile.good())
    {
        inFile >> ps[i].x >> ps[i].y;
        ++i;
    }
    vector<double>ps2;
 
    Angle(ps2, ps, N);
    Sort(ps2, ps, N);
    Stack(ps2, ps);
 
    delete[] ps;
    system("pause");
    return 0;
}
Работает все отлично, но преподу не понравилось что реализовано с помощью atan2 (а как еще то угол посчитать), тобишь скорость работы < и предложил свой вариант:

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
86
87
88
89
90
91
#include <stack>
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
struct Point {
    double x, y;
    Point(double a = 0, double b = 0) {
        x = a;
        y = b;
    }
    bool operator < (const Point& p) {
        return ((x*p.y - y*p.x)>0);
    } 
    Point operator - (const Point &p) {
        return Point(x - p.x, y - p.y);
    }
    Point operator + (const Point &p) {
        return Point(x + p.x, y + p.y);
    }
};
 
typedef vector<Point> vec_point;
 
vec_point read_verts(const string filename) {
    ifstream f1(filename);
 
    vec_point verts;
    int n;
    Point temp;
 
    f1 >> n;
 
    for (int i = 0; i < n; i++) {
        f1 >> temp.x >> temp.y;
        verts.push_back(temp);
    }
    return verts;
}
 
vec_point Graham(vec_point verts) {
    int min = 0;
    for (int i = 1; i < verts.size(); i++) {
        if (verts[min].y > verts[i].y)
            min = i;
    }
    swap(verts[min], verts[0]);
 
    for (int i = 1; i < verts.size(); i++) {
        verts[i].x -= verts[0].x;
        verts[i].y -= verts[0].y;
    }
 
    sort(verts.begin() + 1, verts.end());
 
    stack<int> Stack;
    Stack.push(0);
    Stack.push(1);
 
    for (int c = 2; c < verts.size(); c++) {
        int a, b;
        do {
            b = Stack.top();
            Stack.pop();
            a = Stack.top();
        } while (!(b - a < c - b));
        Stack.push(b);
        Stack.push(c);
    }
 
    vec_point res;
    while (Stack.size()) {
        int num = Stack.top();
        Stack.pop();
        res.push_back(verts[num] + verts[0]);
    }
    res.push_back(verts[0]);
 
    return res;
}
 
int main() {
    vec_point res = Graham(read_verts("graham.txt"));
    for (int i = 0; i < res.size(); i++)
        cout << res[i].x << ' ' << res[i].y << '\n';
 
    return 0;
}
Не особо понимаю смысл этих операторов и как они работают (в данном случае). Мало того данный код не запускается. У меня вопрос: Намного ли хуже тем что я воспользовался atan2? и где во втором коде ошибка ?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2015, 16:41
Ответы с готовыми решениями:

Перегрузка операций += и -=
Объясните, пожалуйста, как правильно выполнить перегрузку операций += и -=? При такой реализации...

Перегрузка операций С++
Подскажете пожалуйста, как буквам &quot;А&quot; и &quot;В&quot; присвоить номера 10 и 11 вместо 17 и 18. // пр4.cpp:...

перегрузка операций С++
Доброй ночи. Товарищи помогите пожалуйста, нужно срочно сдать лабораторную, а я никак не освою...

Перегрузка операций
Добрый день форумчане, помогите решить задачку Перегрузить 8 операторов для класса Вот пример...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2015, 16:41
Помогаю со студенческими работами здесь

Перегрузка операций
Всем привет. Пытаюсь понять ооп. Задали такую лабу: 1. Определить класс согласно варианту...

ПЕРЕГРУЗКА ОПЕРАЦИЙ
Всем добрый день.Нужна помощь по перегрузкам операций.Написать программу.Кто сможет помочь,буду...

Перегрузка операций
C++ ругается когда я пытаюсь сделать след-ю перегрузку операций. У меня трехмерный массив matrix и...

Перегрузка операций
Здравствуйте, помогите с лабораторной. Я правильно сделал и как менять названия у перегрузки...

Перегрузка операций
Данная программа выполянет операции с дробями. Но у меня возникла проблема. Я создал сервисную...

Перегрузка операций
Не могу понять в чем ошибка. Нужно вводитьномер в формате (123) 456-789 Но почему то только...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru