Геометрические функции и операторы
Для геометрических типов point (точка), box (прямоугольник), lseg (отрезок), line (прямая), path (путь), polygon (многоугольник) и circle (окружность) существует большой набор встроенных вспомогательных функций и операторов, приведенных в Таблице 35, Таблице 36 и Таблице 37.
Таблица 35. Геометрические операторы
Оператор |
||
---|---|---|
Описание Пример(ы) |
||
геометрический_тип + point → геометрический_тип |
||
Добавляет координаты второго аргумента типа point к координатам каждой точки первого аргумента, тем самым осуществляя перенос объекта. Имеется для типов point, box, path, circle.
|
||
path + path → path |
||
Конкатенирует два открытых пути (возвращает NULL, если один из путей замкнут).
|
||
геометрический_тип - point → геометрический_тип |
||
Вычитает координаты второго аргумента типа point из координат каждой точки первого аргумента, тем самым осуществляя перенос объекта. Имеется для типов point, box, path, circle.
|
||
геометрический_тип * point → геометрический_тип |
||
Умножает каждую точку первого аргумента на второй аргумент типа point (воспринимая точки как комплексные числа, представленные действительной и мнимой частями, и проводя стандартное комплексное умножение). Если интерпретировать второй аргумент типа point как вектор, это будет равнозначно увеличению размера этого объекта и расстояния от начала координат при помощи длины этого вектора с поворотом объекта против часовой стрелки относительно начала координат на угол, равный углу между вектором и осью x. Имеется для типов point, box,[a] path, circle.
|
||
геометрический_тип / point → геометрический_тип |
||
Делит каждую точку первого аргумента на второй аргумент типа point (воспринимая точки как комплексные числа, представленные действительной и мнимой частями, и проводя стандартное комплексное деление). Если интерпретировать второй аргумент типа point как вектор, это будет равнозначно уменьшению размера этого объекта и расстояния от начала координат при помощи длины этого вектора с поворотом объекта по часовой стрелки относительно начала координат на угол, равный углу между вектором и осью x. Имеется для типов point, box,[a] path, circle.
|
||
@-@ геометрический_тип → double precision |
||
Вычисляет общую длину. Имеется для типов lseg, path.
|
||
@@ геометрический_тип → point |
||
Вычисляет центральную точку. Имеется для типов box, lseg, polygon, circle.
|
||
box # box → box |
||
Вычисляет пересечение двух прямоугольников или возвращает NULL, если такого пересечения нет.
|
||
геометрический_тип ## геометрический_тип → point |
||
Вычисляет ближайшую к первому объекту точку на втором объекте. Имеется для этих пар типов: (point, box), (point, lseg), (point, line), (lseg, box), (lseg, lseg), (line, lseg).
|
||
геометрический_тип <-> геометрический_тип → double precision |
||
Вычисляет расстояние между объектами. Имеется для всех геометрических типов, кроме polygon, для всех сочетаний типа point с другим геометрическим типом, а также для этих пар типов: (box, lseg), (lseg, line), (polygon, circle) (и для этих пар в обратном порядке).
|
||
геометрический_тип @> геометрический_тип → boolean |
||
Первый объект содержит второй? Имеется для этих пар типов: (box, point), (box, box), (path, point), (polygon, point), (polygon, polygon), (circle, point), (circle, circle).
|
||
геометрический_тип <@ геометрический_тип → boolean |
||
Первый объект содержится в (находится на) втором? Имеется для этих пар типов: (point, box), (point, lseg), (point, line), (point, path), (point, polygon), (point, circle), (box, box), (lseg, box), (lseg, line), (polygon, polygon), (circle, circle).
|
||
геометрический_тип && геометрический_тип → boolean |
||
Эти объекты пересекаются? (Для результата true достаточно одной общей точки.) Имеется для типов box, polygon, circle.
|
||
геометрический_тип << геометрический_тип → boolean |
||
Первый объект строго слева от второго? Имеется для типов point, box, polygon, circle.
|
||
геометрический_тип >> геометрический_тип → boolean |
||
Первый объект строго справа от второго? Имеется для типов point, box, polygon, circle.
|
||
геометрический_тип &< геометрический_тип → boolean |
||
Первый объект не простирается правее второго? Имеется для типов box, polygon, circle.
|
||
геометрический_тип &> геометрический_тип → boolean |
||
Первый объект не простирается левее второго? Имеется для типов box, polygon, circle.
|
||
геометрический_тип <<| геометрический_тип → boolean |
||
Первый объект строго ниже второго? Имеется для типов point, box, polygon, circle.
|
||
геометрический_тип |>> геометрический_тип → boolean |
||
Первый объект строго выше второго? Имеется для типов point, box, polygon, circle.
|
||
геометрический_тип &<| геометрический_тип → boolean |
||
Первый объект не простирается выше второго? Имеется для типов box, polygon, circle.
|
||
геометрический_тип |&> геометрический_тип → boolean |
||
Первый объект не простирается ниже второго? Имеется для типов box, polygon, circle.
|
||
box <^ box → boolean |
||
Первый объект ниже второго (объекты могут соприкасаться краями)?
|
||
box >^ box → boolean |
||
Первый объект выше второго (объекты могут соприкасаться краями)?
|
||
геометрический_тип ?# геометрический_тип → boolean |
||
Эти объекты пересекаются? Имеется для этих пар типов: (box, box), (lseg, box), (lseg, lseg), (lseg, line), (line, box), (line, line), (path, path).
|
||
?- line → boolean ?- lseg → boolean |
||
Линия горизонтальна?
|
||
point ?- point → boolean |
||
Точки выровнены по горизонтали (то есть имеют одинаковую координату по y)?
|
||
?| line → boolean ?| lseg → boolean |
||
Линия вертикальна?
|
||
point ?| point → boolean |
||
Точки выровнены по вертикали (то есть имеют одинаковую координату по x)?
|
||
line ?-| line → boolean lseg ?-| lseg → boolean |
||
Линии перпендикулярны?
|
||
line ?|| line → boolean lseg ?|| lseg → boolean |
||
Линии параллельны?
|
||
геометрический_тип ~= геометрический_тип → boolean |
||
Эти объекты совпадают? Имеется для типов point, box, polygon, circle.
|
||
[a] При «повороте» прямоугольника с помощью этих операторов перемещаются только его угловые точки: стороны этого прямоугольника по-прежнему считаются параллельными осям. Как следствие, в отличие от истинного поворота, при этой операции размер прямоугольника меняется. |
Внимание!
Обратите внимание, что оператор «тождественности»,~=
, представляет собой обычную проверку равенства для типов point, box, polygon и circle. Для некоторых геометрических типов также имеется оператор=
, но=
проверяет только равенство площадей. Другие скалярные операторы сравнения (<=
и т. п.) для тех типов, для которых они имеются, также сравнивают площади.
Таблица 36. Геометрические функции
Функция |
||
---|---|---|
Описание Пример(ы) |
||
area ( геометрический_тип ) → double precision |
||
Вычисляет площадь. Имеется для типов box, path, circle. Входное значение типа path должно быть замкнутым, иначе возвращается NULL. Кроме того, если этот путь является самопересекающимся, результат может не иметь смысла.
|
||
center ( геометрический_тип ) → point |
||
Вычисляет центральную точку. Имеется для типов box, circle.
|
||
diagonal ( box ) → lseg |
||
Извлекает диагональ прямоугольника в виде отрезка (аналогично lseg(box)).
|
||
diameter ( circle ) → double precision |
||
Вычисляет диаметр окружности.
|
||
height ( box ) → double precision |
||
Вычисляет вертикальный размер прямоугольника.
|
||
isclosed ( path ) → boolean |
||
Путь замкнутый?
|
||
isopen ( path ) → boolean |
||
Путь открытый?
|
||
length ( геометрический_тип ) → double precision |
||
Вычисляет общую длину. Имеется для типов lseg, path.
|
||
npoints ( геометрический_тип ) → integer |
||
Возвращает количество точек. Имеется для типов path, polygon.
|
||
pclose ( path ) → path |
||
Преобразует путь в замкнутую форму.
|
||
popen ( path ) → path |
||
Преобразует путь в открытую форму.
|
||
radius ( circle ) → double precision |
||
Вычисляет радиус окружности.
|
||
slope ( point, point ) → double precision |
||
Вычисляет наклон линии, проведенной через две точки.
|
||
width ( box ) → double precision |
||
Вычисляет горизонтальный размер прямоугольника.
|
Таблица 37. Функции преобразования геометрических типов
Функция |
||
---|---|---|
Описание Пример(ы) |
||
box ( circle ) → box |
||
Вычисляет прямоугольник, вписанный в окружность.
|
||
box ( point ) → box |
||
Преобразует точку в пустой прямоугольник.
|
||
box ( point, point ) → box |
||
Преобразует любые две угловые точки в прямоугольник.
|
||
box ( polygon ) → box |
||
Вычисляет окружающий прямоугольник для многоугольника.
|
||
bound_box ( box, box ) → box |
||
Вычисляет окружающий прямоугольник для двух прямоугольников.
|
||
circle ( box ) → circle |
||
Вычисляет наименьшую окружность, вмещающую прямоугольник.
|
||
circle ( point, double precision ) → circle |
||
Строит окружность по центру и радиусу.
|
||
circle ( polygon ) → circle |
||
Преобразует многоугольник в окружность. Центром окружности является среднее арифметическое координат вершин многоугольника, а радиусом — среднее расстояние от вершин многоугольника до этого центра.
|
||
line ( point, point ) → line |
||
Преобразует две точки в проходящую через них линию.
|
||
lseg ( box ) → lseg |
||
Извлекает диагональ прямоугольника в виде отрезка.
|
||
lseg ( point, point ) → lseg |
||
Строит отрезок по двум конечным точкам.
|
||
path ( polygon ) → path |
||
Преобразует многоугольник в замкнутый путь с тем же списком точек.
|
||
point ( double precision, double precision ) → point |
||
Строит точку по заданным координатам.
|
||
point ( box ) → point |
||
Вычисляет центр прямоугольника.
|
||
point ( circle ) → point |
||
Вычисляет центр окружности.
|
||
point ( lseg ) → point |
||
Вычисляет центр отрезка.
|
||
point ( polygon ) → point |
||
Вычисляет центр многоугольника (среднее арифметическое координат его вершин).
|
||
polygon ( box ) → polygon |
||
Преобразует прямоугольник в многоугольник с 4 вершинами.
|
||
polygon ( circle ) → polygon |
||
Преобразует окружность в многоугольник с 12 вершинами.
|
||
polygon ( integer, circle ) → polygon |
||
Преобразует окружность в многоугольник с n вершинами.
|
||
polygon ( path ) → polygon |
||
Преобразует замкнутый путь в многоугольник с тем же списком вершин.
|
К двум числам, составляющим значение типа point можно обратиться как к элементам
массива с индексами 0 и 1. Например, если t.p — столбец типа point, то
SELECT p[0] FROM t
возвращает координату X, а UPDATE t SET p[1] = ...
изменяет
координату Y. Таким же образом значение типа box или lseg можно рассматривать
как массив из двух значений типа point.