В сети есть такое решение этой задачи.
http://algolist.manual.ru/maths/geom/datastruct.phpКод:
class Point {
public:
double x;
double у;
Point(double _x = 0.0, double _y =0.0);
// Опустим ненужные элементы класса
.......
enum {LEFT, RIGHT, BEYOND, BEHIND, BETWEEN, ORIGIN, DESTINATION};
// СЛЕВА, СПРАВА, ВПЕРЕДИ, ПОЗАДИ, МЕЖДУ, НАЧАЛО, КОНЕЦ
int Point::classify(Point &p0, Point &pl)
{
Point p2 = *this;
Point a = p1 - pO; // 1
Point b = p2 - pO; // 2
double sa = a. x * b.y - b.x * a.y; // 3
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 BEYOND;
if (pO == p2)
return ORIGIN;
if (p1 == p2)
return DESTINATION;
return BETWEEN;
}
Point Point::operator- (Point &p)
{
return Point (x - р.х, у - p. у);
}
Я знаю, что чтобы определить положение точки слева или справа относительно прямой, достаточно подставить координаты этой точки в уравнение прямой и посмотреть на результат. Если он отрицателен, то точка лежит слева, если положителен, то точка лежит справа. Если же результат равен нулю, то точка принадлежит прямой. Как я понимаю, в это куске кода делается нечто похожее.
1)
Код:
Point a = p1 - pO;
Point b = p2 - pO;
Векторы
и
начинаются в начале координат и заканчиваются в точках
и
. В результате вычитания мы получаем новый вектор
. Аналогично с вектором
. Я правильно понял смысл этих двух строк?
Начало и конец векторов рисовал специально, чтобы не накладывались друг на друга, иначе не видно направления вектора.
2)
Код:
double sa = a. x * b.y - b.x * a.y;
Я не пойму, что делает этот код. Напоминает уравнение прямой в виде
пожалуйста, помогите разобраться.