Расстояния на плоскости

Во всех функциях этого раздела вычисленное расстояние будет отрицательным, если точка находится внутри фигуры, и положительным, если точка находится вне фигуры.

Расстояние от точки до границы окружности:

double getDistance ( const Circle2d & circle, const Vector2d & point );

Расстояние от точки до границы эллипса:

double getDistanceElp ( double a, double b, const Vector2d & p, Vector2d & r );

double getDistanceElp ( double a, double b, const Vector2d & p );
Здесь a и b - это параметры эллипса заданного в виде ( x / a )2 + ( y / b )2 = 1,
p - заданная точка,
r - ближайшая точка на границе эллипса.

Шаблон функций tempDist2 вычисляет квадрат расстояния от заданной точки до границы многоугольника:

template <class Scalar, class Vector> 
bool tempDist2 ( CArrRef<Vector> vert, const Vector & point,
                 Scalar & dist, unsigned int & index, bool & isBone );
Здесь vert - ссылка на массив вершин, point - заданная точка, dist - вычисленное значение квадрата расстояния, index - номер ближайшей вершины или ребра, isBone - индикатор того, что ближе - точка на ребре или вершина.
В качестве параметра Vector можно брать классы Vector2i, Vector2f, Vector2d. В случае, если используется класс Vector2i, то в качестве Scalar целесообразно брать тип double.
Предусмотрены следующие вырожденные случаи:
1) если к-во вершин равно нулю, то функция возвращает значение false и переменные dist, index и isBone не меняются;
2) если к-во вершин равно 1, то переменная dist равна расстоянию между двумя точками ( функция возвращает значение true, index = 0, isBone = false );
3) если к-во вершин равно 2, то переменная dist равна расстоянию между точкой и отрезком ( функция возвращает значение true, index = 0 или 1, isBone = false или true ).
В других случаях начинаем поиск ближайшей точки на границе многоугольника. Этой точкой может быть вершина ( isBone = false ) или точка на ребре ( isBone = true ).

На основе этого шаблона сделана функция distance. Вначале ищется квадрат расстояния от заданной точки до границы многоугольника, а затем проверяется, где лежит точка. Если она находится внутри многоугольника, то вычисленное значение будет отрицательным. Обход вершин многоугольника задан против часовой стрелки:

bool distance ( CArrRef<Vector2d> vert, const Vector2d & point,
                double & dist, unsigned int & index, bool & isBone )
{
    if ( ! tempDist2 ( vert, point, dist, index, isBone ) ) return false;
    if ( dist > 0 )
    {
        dist = sqrt ( dist );
        if ( isIntersect ( point, vert ) ) dist = - dist;
    }
    return true;
}

В файле func2d.h есть также функции с сокращённым набором параметров:

inline 
bool distance ( CArrRef<Vector2d> vert, const Vector2d & point,
                double & dist, unsigned int & index )
{
    bool isBone;
    return distance ( vert, point, dist, index, isBone );
}

inline 
bool distance ( CArrRef<Vector2d> vert, const Vector2d & point,
                double & dist )
{
    bool isBone;
    unsigned int index;
    return distance ( vert, point, dist, index, isBone );
}

Описание класса Vector2d находится здесь.
Описание шаблона CArrRef смотрите в разделе Массивы.

Исходники алгоритмов находятся в func2d.cpp

Наверх