есть метод:
Код:
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
alexSo94 на форуме Сообщить модератору о нарушении Ответить с цитированием