9.11. Геометрические функции и операторы

Для геометрических типов point, box, lseg, line, path, polygon и circle разработан большой набор встроенных функций и операторов, представленный в Таблице 9.33, Таблице 9.34 и Таблице 9.35.

Внимание

Заметьте, что оператор «идентичности», ~=, представляет обычное сравнение на равенство значений point, box, polygon и circle. Для некоторых из этих типов определён также оператор =, но = проверяет только равенство площадей. Другие скалярные операторы сравнения (<= и т. д.) так же сравнивают площади значений этих типов.

Таблица 9.33. Геометрические операторы

ОператорОписаниеПример
+Сдвигbox '((0,0),(1,1))' + point '(2.0,0)'
-Сдвигbox '((0,0),(1,1))' - point '(2.0,0)'
*Масштабирование/поворотbox '((0,0),(1,1))' * point '(2.0,0)'
/Масштабирование/поворотbox '((0,0),(2,2))' / point '(2.0,0)'
#Точка или прямоугольник в пересеченииbox '((1,-1),(-1,1))' # box '((1,1),(-2,-2))'
#Число точек в пути или вершин в многоугольнике# path '((1,0),(0,1),(-1,0))'
@-@Длина, периметр или длина окружности@-@ path '((0,0),(1,0))'
@@Центр@@ circle '((0,0),10)'
##Точка, ближайшая к первому операнду и принадлежащая второмуpoint '(0,0)' ## lseg '((2,0),(0,2))'
<->Расстояние между операндамиcircle '((0,0),1)' <-> circle '((5,0),1)'
&&Пересекаются ли операнды? (Для положительного ответа достаточно одной общей точки.)box '((0,0),(1,1))' && box '((0,0),(2,2))'
<<Строго слева?circle '((0,0),1)' << circle '((5,0),1)'
>>Строго справа?circle '((5,0),1)' >> circle '((0,0),1)'
&<Не простирается правее?box '((0,0),(1,1))' &< box '((0,0),(2,2))'
&>Не простирается левее?box '((0,0),(3,3))' &> box '((0,0),(2,2))'
<<|Строго ниже?box '((0,0),(3,3))' <<| box '((3,4),(5,5))'
|>>Строго выше?box '((3,4),(5,5))' |>> box '((0,0),(3,3))'
&<|Не простирается выше?box '((0,0),(1,1))' &<| box '((0,0),(2,2))'
|&>Не простирается ниже?box '((0,0),(3,3))' |&> box '((0,0),(2,2))'
<^Ниже (может касаться)?circle '((0,0),1)' <^ circle '((0,5),1)'
>^Выше (может касаться)?circle '((0,5),1)' >^ circle '((0,0),1)'
?#Пересекает?lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'
?-Горизонтальный объект??- lseg '((-1,0),(1,0))'
?-Выровнены по горизонтали?point '(1,0)' ?- point '(0,0)'
?|Вертикальный объект??| lseg '((-1,0),(1,0))'
?|Выровнены по вертикали?point '(0,1)' ?| point '(0,0)'
?-|Перпендикулярны?lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'
?||Параллельны?lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'
@>Первый объект включает второй?circle '((0,0),2)' @> point '(1,1)'
<@Первый объект включён во второй?point '(1,1)' <@ circle '((0,0),2)'
~=Одинаковы?polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'

Примечание

До PostgreSQL 8.2 операторы включения @> и <@ назывались соответственно ~ и @. Эти имена по-прежнему доступны, но считаются устаревшими и в конце концов будут удалены.

Таблица 9.34. Геометрические функции

ФункцияТип результатаОписаниеПример
area(объект)double precisionплощадьarea(box '((0,0),(1,1))')
center(объект)pointцентрcenter(box '((0,0),(1,2))')
diameter(circle)double precisionдиаметр кругаdiameter(circle '((0,0),2.0)')
height(box)double precisionвертикальный размер прямоугольникаheight(box '((0,0),(1,1))')
isclosed(path)booleanзамкнутый путь?isclosed(path '((0,0),(1,1),(2,0))')
isopen(path)booleanоткрытый путь?isopen(path '[(0,0),(1,1),(2,0)]')
length(объект)double precisionдлинаlength(path '((-1,0),(1,0))')
npoints(path)intчисло точекnpoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon)intчисло точекnpoints(polygon '((1,1),(0,0))')
pclose(path)pathпреобразует путь в замкнутыйpclose(path '[(0,0),(1,1),(2,0)]')
popen(path)pathпреобразует путь в открытыйpopen(path '((0,0),(1,1),(2,0))')
radius(circle)double precisionрадиус окружностиradius(circle '((0,0),2.0)')
width(box)double precisionгоризонтальный размер прямоугольникаwidth(box '((0,0),(1,1))')

Таблица 9.35. Функции преобразования геометрических типов

ФункцияТип результатаОписаниеПример
box(circle)boxокружность в прямоугольникbox(circle '((0,0),2.0)')
box(point)boxточка в пустой прямоугольникbox(point '(0,0)')
box(point, point)boxточки в прямоугольникbox(point '(0,0)', point '(1,1)')
box(polygon)boxмногоугольник в прямоугольникbox(polygon '((0,0),(1,1),(2,0))')
bound_box(box, box)boxпрямоугольники в окружающий прямоугольникbound_box(box '((0,0),(1,1))', box '((3,3),(4,4))')
circle(box)circleпрямоугольник в окружностьcircle(box '((0,0),(1,1))')
circle(point, double precision)circleокружность из центра и радиусаcircle(point '(0,0)', 2.0)
circle(polygon)circleмногоугольник в окружностьcircle(polygon '((0,0),(1,1),(2,0))')
line(point, point)lineточки в прямуюline(point '(-1,0)', point '(1,0)')
lseg(box)lsegдиагональ прямоугольника в отрезокlseg(box '((-1,0),(1,0))')
lseg(point, point)lsegточки в отрезокlseg(point '(-1,0)', point '(1,0)')
path(polygon)pathмногоугольник в путьpath(polygon '((0,0),(1,1),(2,0))')
point(double precision, double precision)pointобразует точкуpoint(23.4, -44.5)
point(box)pointцентр прямоугольникаpoint(box '((-1,0),(1,0))')
point(circle)pointцентр окружностиpoint(circle '((0,0),2.0)')
point(lseg)pointцентр отрезкаpoint(lseg '((-1,0),(1,0))')
point(polygon)pointцентр многоугольникаpoint(polygon '((0,0),(1,1),(2,0))')
polygon(box)polygonпрямоугольник в многоугольник с 4 вершинамиpolygon(box '((0,0),(1,1))')
polygon(circle)polygonкруг в многоугольник с 12 вершинамиpolygon(circle '((0,0),2.0)')
polygon(число_точек, circle)polygonокружность с заданным числом_точекpolygon(12, circle '((0,0),2.0)')
polygon(path)polygonпуть в многоугольникpolygon(path '((0,0),(1,1),(2,0))')

К двум компонентам типа point (точка) можно обратиться, как к элементам массива с индексами 0 и 1. Например, если t.p — столбец типа point, SELECT p[0] FROM t вернёт координату X, а UPDATE t SET p[1] = ... изменит координату Y. Таким же образом, значение типа box или lseg можно воспринимать как массив двух значений типа point.

Функция area работает с типами box, circle и path. При этом для типа path заданный путь не должен быть самопересекающимся. Например, эта функция не примет значение типа path '((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATH, но примет визуально идентичный путь '((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATH. Если вы не вполне поняли, что здесь подразумевается под самопересечением пути, нарисуйте на бумаге две фигуры по приведённым координатам.

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy