Форум программистов, компьютерный форум CyberForum.ru

Можно ли переделать метод ? - C++

Восстановить пароль Регистрация
 
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
08.05.2013, 21:00     Можно ли переделать метод ? #1
есть метод:
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
Из многочисленных подходов к решению этой подзадачи наш выбор остановился на алгоритме, в основе которого лежит определение относительного положения точки и вектора на плоскости. Вектор — это направленный отрезок прямой линии, начинающийся в точке beg_p и заканчивающийся в точке end_p. При графическом изображении конец вектора украшают стрелкой. Теперь призовите ваше пространственное воображение или вооружитесь карандашом и бумагой, чтобы проверить следующее утверждение. Вектор (beg_p, end_p) делит плоскость на пять непересекающихся областей:
 
    все точки слева от воображаемой бесконечной прямой, на которой лежит наш вектор (область LEFT),
    все точки справа от воображаемой бесконечной прямой, на которой лежит наш вектор (область RIGHT),
    все точки на воображаемом продолжении прямой назад от точки beg_p в бесконечность (область BEHIND),
    все точки на воображаемом продолжении прямой вперед от точки end_p в бесконечность (область AHEAD),
    все точки, принадлежащие самому вектору (область BETWEEN).
 
Для выяснения относительного положения точки, заданной некоторым объектом класса Point, добавим в класс Point перечисляемый тип:
 
enum ORIENT { LEFT, RIGHT, AHEAD, BEHIND, BETWEEN };
а также метод Classify(beg_p, end_p), возвращающий значение типа ORIENT для данной точки относительно вектора (beg_p, end_p).
 
Обладая этим мощным методом, совсем нетрудно определить, находится ли точка внутри некоторого треугольника. Мы договорились перед началом решения задачи, что треугольники будут задаваться перечислением их вершин в порядке изображения их на плоскости по часовой стрелке. То есть каждая пара вершин образует вектор, и эти векторы следуют один за другим по часовой стрелке. При этом условии некоторая точка находится внутри треугольника тогда и только тогда, когда ее ориентация относительно каждой вектора-стороны треугольника имеет одно из двух значений: либо RIGHT, либо BETWEEN. Эту подзадачу будет решать метод InTriangle() в классе Point.
 
Изложим по порядку, какие изменения нужно внести в тексты модулей.
1. Модуль Point.h.
 
    Добавьте перед объявлением класса Point объявление нового типа ORIENT, а также упреждающее объявление типа Triangle:
 
enum ORIENT { LEFT, RIGHT, AHEAD, BEHIND, BETWEEN };
class Triangle;
 
Последнее необходимо, чтобы имя типа Triangle было известно компилятору в данной единице трансляции, так как оно используется в сигнатуре метода InTriangle().
 
    Добавьте внутри класса Point объявления функций:
 
Point operator +(Point&);
Point operator -(Point&);
double Length() const; // определяет длину вектора точки
// в полярной системе координат
ORIENT Classify(Point&, Point&) const; // определяет положение точки
// относительно вектора,
// заданного двумя точками
bool InTriangle(Triangle&) const; // определяет,
// находится ли точка внутри
// треугольника
 
Функция-операция “–” и метод Length() будут использованы при реализации метода Classify(), а функция-операция “+” добавлена для симметрии. Метод Classify(), в свою очередь, вызывается из метода InTriangle().
1. Модуль Point.cpp.
 
    Добавьте после директивы #include директиву #include .
 
Она необходима для использования функции sqrt(x) из математической библиотеки С++ в алгоритме метода Length().
Добавьте после директивы #include “Point.h” директиву #include “Triangle.h”.
Последняя необходима в связи с использованием имени класса Triangle в данной единице трансляции.
Добавьте реализацию функций-операций:
 
Point Point::operator +(Point& p) {
    return Point(x + p.x, y + p.y);
    }
    Point Point::operator -(Point& p) {
    return Point(x - p.x, y - p.y);
    }
 
        Добавьте реализацию метода Length():
 
    double Point::Length() const {
    return sqrt(x*x + y*y);
    }
 
        Добавьте реализацию метода Classify():
 
    ORIENT Point::Classify(Point& beg_p, Point& end_p) const {
    Point p0 = *this; 
    Point a = end_p - beg_p; 
    Point b = p0 - beg_p; 
    double sa = a.x * b.y - b.x * a.y;
 
    if (sa > 0.0) return LEFT; 
    if (sa < 0.0) return RIGHT;
 
    if ((a.x * b.x < 0.0) || (a.y * b.y < 0.0)) return BEHIND; 
    if (a.Length() < b.Length()) return AHEAD;
 
    return BETWEEN;
    }
 
    Алгоритм заимствован из [6], поэтому мы не будем здесь подробно его разбирать. Обратите внимание, что аргументы передаются в функцию по ссылке — это позволяет избежать вызова конструктора копирования.
 
        Добавьте реализацию метода InTriangle():
 
    bool Point::InTriangle(Triangle& tria) const { 
    ORIENT or1 = Classify(tria.Get_v1(), tria.Get_v2()); 
    ORIENT or2 = Classify(tria.Get_v2(), tria.Get_v3()); 
    ORIENT or3 = Classify(tria.Get_v3(), tria.Get_v1());
 
    if ((or1 == RIGHT || or1 == BETWEEN) 
    && (or2 == RIGHT || or2 == BETWEEN) 
    && (or3 == RIGHT || or3 == BETWEEN)) return true; 
    else return false;
    }
    2. Модуль Triangle.h: добавьте в классе Triangle объявление дружественной функции (все равно, в каком месте):
    friend bool TriaInTria(Triangle, Triangle); // Определить, 
    // входит ли один треугольник во второй
    3. Модуль Triangle.cpp: добавьте в конец файла реализацию внешней дружественной функции:
    // Определить, входит ли треугольник tria1 в треугольник tria2
    bool TriaInTria(Triangle tria1, Triangle tria2) {
    Point v1 = tria1.Get_v1(); 
    Point v2 = tria1.Get_v2(); 
    Point v3 = tria1.Get_v3(); 
    return (v1.InTriangle(tria2) && 
    v2.InTriangle(tria2) && 
    v3.InTriangle(tria2)); 
    return true;
    }
 
    Результат, возвращаемый функцией, основан на проверке вхождения каждой вершины первого треугольника (tria1) во второй треугольник (tria2).
    4. Модуль Main.cpp: замените заглушку функции IsIncluded() следующим кодом:
    // ——————————- определение отношения включения
    void IsIncluded(Triangle* p_tria[], int k) {
    cout << "======== Отношение включения ==========" << endl; 
    cout << "Введите номер 1-го треугольника (от 1 до " << k << "): "; 
    int i1 = GetNumber(1, k) - 1;
 
    cout << "Введите номер 2-го треугольника (от 1 до " << k << "): "; 
    int i2 = GetNumber(1, k) - 1;
 
    if (TriaInTria(*p_tria[i1], *p_tria[i2])) 
    cout << p_tria[i1]->GetName() << " - входит в - " 
    << p_tria[i2]->GetName() << endl; 
    else 
    cout << p_tria[i1]->GetName() << " - не входит в - " 
    << p_tria[i2]->GetName() << endl; 
    ExitBack();
    }
Он Проверяет включение одного треугольника в другой. У меня же проверка идет включение четырехугольников и прямоугольников(наследник класса четырехугольник). Можно код переделать? Полная ссылка http://opensource.com.ua/contents/978594723842p.html

Добавлено через 4 часа 30 минут
Блин помогите. Ведь четырехугольник это те же два треугольника можно так сказать. Не могу разобраться.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2013, 21:00     Можно ли переделать метод ?
Посмотрите здесь:

как переделать френдовые перегрузки ввода\вывода в метод класса? C++
Можно ли данную прогу переделать в справочную систему компонентов компьютерной техники?!!! C++
Можно ли так вызвать метод? C++
как можно переделать программу? C++
Переделать программу так что бы можно было нарисовать линиями C++
Можно ли переделать маcсив под вектор? C++
C++ На каком языке этот код и можно ли его переделать?
Переделать код так, чтобы значения можно было задавать с клавиатуры C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 02:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru