×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

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

Геометрические типы данных point, box, lseg, line, path, polygon, и circle обладают обширным набором встроенных функций и операторов, представленных в Таблица 2.6.36, Таблица 2.6.37, и Таблица 2.6.38.

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

Оператор

Описание

Примеры

geometric_type + point → geometric_type

Прибавляет координаты второго аргумента point к координатам каждой точки первого аргумента, выполняя таким образом параллельный перенос. Доступно для point, box, path, circle.

box '(1,1),(0,0)' + point '(2,0)' → (3,1),(2,0)

path + path → path

Выполняет конкатенацию двух незамкнутых путей (возвращает NULL, если хотя бы один из путей является замкнутым).

path '[(0,0),(1,1)]' + path '[(2,2),(3,3),(4,4)]' → [(0,0),(1,1),(2,2),(3,3),(4,4)]

geometric_type - point → geometric_type

Вычитает координаты второго аргумента point из координат каждой точки первого аргумента, выполняя таким образом геометрический перенос. Доступно для point, box, path, circle.

box '(1,1),(0,0)' - point '(2,0)' → (-1,1),(-2,0)

geometric_type * point → geometric_type

Умножает каждую точку первого аргумента на второй аргумент point (рассматривая точку как комплексное число, представленное действительной и мнимой частями, с выполнением стандартного комплексного умножения). Если интерпретировать второй аргумент point как вектор, то данная операция эквивалентна масштабированию размера объекта и его расстояния от начала координат на длину вектора с последующим поворотом против часовой стрелки вокруг начала координат на угол наклона вектора относительно x оси. Доступно для point, box,[a] path, circle.

path '((0,0),(1,0),(1,1))' * point '(3.0,0)' → ((0,0),(3,0),(3,3))

path '((0,0),(1,0),(1,1))' * point(cosd(45), sind(45)) → ((0,0),​(0.7071067811865475,0.7071067811865475),​(0,1.414213562373095))

geometric_type / point → geometric_type

Данная операция делит координаты каждой точки первого аргумента на значение второго аргумента point (рассматривая точку как комплексное число, представленное действительной и мнимой частями, с выполнением стандартного комплексное деление). Если интерпретировать второй аргумент point как вектор, то данная операция эквивалентна масштабирование (уменьшение) размера объекта и его расстояния от начала координат на длину вектора с последующим поворотом объекта по часовой стрелке вокруг начала координат на угол наклона вектора относительно x оси. Доступно для point, box,[a] path, circle.

path '((0,0),(1,0),(1,1))' / point '(2.0,0)' → ((0,0),(0.5,0),(0.5,0.5))

path '((0,0),(1,0),(1,1))' / point(cosd(45), sind(45)) → ((0,0),​(0.7071067811865476,-0.7071067811865476),​(1.4142135623730951,0))

@-@ geometric_type → double precision

Вычисление полной длины. Доступно для lseg, path.

@-@ path '[(0,0),(1,0),(1,1)]' → 2

@@ geometric_type → point

Вычисление центральной точки. Доступно для box, lseg, polygon, circle.

@@ box '(2,2),(0,0)' → (1,1)

# geometric_type → integer

Возвращение количества точек. Доступно для path, polygon.

# path '((1,0),(0,1),(-1,0))' → 3

geometric_type # geometric_type → point

Вычисление точки пересечения; возвращает NULL, если точка пересечения отсутствует. Доступно для lseg, line.

lseg '[(0,0),(1,1)]' # lseg '[(1,0),(0,1)]' → (0.5,0.5)

box # box → box

Вычисление пересечения двух прямоугольников (box); возвращает NULL, если пересечение отсутствует.

box '(2,2),(-1,-1)' # box '(1,1),(-2,-2)' → (1,1),(-1,-1)

geometric_type ## geometric_type → point

Поиск на втором объекте точки, ближайшей к первому объекту. Доступно для следующих пар типов: (point, box), (point, lseg), (point, line), (lseg, box), (lseg, lseg), (line, lseg).

point '(0,0)' ## lseg '[(2,0),(0,2)]' → (1,1)

geometric_type <-> geometric_type → double precision

Вычисляет расстояние между объектами. Доступно для всех семи геометрических типов, для всех комбинаций из point с другими геометрическими типами, а также для следующих дополнительных пар типов: (box, lseg), (lseg, line), (polygon, circle) (включая коммутативные случаи).

circle '<(0,0),1>' <-> circle '<(5,0),1>' → 3

geometric_type @> geometric_type → boolean

Содержит ли первый объект второй? Доступно для следующих пар типов: (box, point), (box, box), (path, point), (polygon, point), (polygon, polygon), (circle, point), (circle, circle).

circle '<(0,0),2>' @> point '(1,1)' → t

geometric_type <@ geometric_type → boolean

Находится ли первый объект внутри второго или на его границе? Доступно для следующих пар типов: (point, box), (point, lseg), (point, line), (point, path), (point, polygon), (point, circle), (box, box), (lseg, box), (lseg, line), (polygon, polygon), (circle, circle).

point '(1,1)' <@ circle '<(0,0),2>' → t

geometric_type && geometric_type → boolean

Пересекаются ли данные объекты? (Для истинности выражения достаточно наличия одной общей точки.) Доступно для box, polygon, circle.

box '(1,1),(0,0)' && box '(2,2),(0,0)' → t

geometric_type << geometric_type → boolean

Находится ли первый объект строго слева от второго? Доступно для point, box, polygon, circle.

circle '<(0,0),1>' << circle '<(5,0),1>' → t

geometric_type >> geometric_type → boolean

Находится ли первый объект строго справа от второго? Доступно для point, box, polygon, circle.

circle '<(5,0),1>' >> circle '<(0,0),1>' → t

geometric_type &< geometric_type → boolean

Не выходит ли первый объект за правую границу второго? Доступно для box, polygon, circle.

box '(1,1),(0,0)' &< box '(2,2),(0,0)' → t

geometric_type &> geometric_type → boolean

Не выходит ли первый объект за левую границу второго? Доступно для box, polygon, circle.

box '(3,3),(0,0)' &> box '(2,2),(0,0)' → t

geometric_type <<| geometric_type → boolean

Находится ли первый объект строго ниже второго? Доступно для point, box, polygon, circle.

box '(3,3),(0,0)' <<| box '(5,5),(3,4)' → t

geometric_type |>> geometric_type → boolean

Находится ли первый объект строго выше второго? Доступно для point, box, polygon, circle.

box '(5,5),(3,4)' |>> box '(3,3),(0,0)' → t

geometric_type &<| geometric_type → boolean

Не выходит ли первый объект за верхнюю границу второго? Доступно для box, polygon, circle.

box '(1,1),(0,0)' &<| box '(2,2),(0,0)' → t

geometric_type |&> geometric_type → boolean

Не выходит ли первый объект за нижнюю границу второго? Доступно для box, polygon, circle.

box '(3,3),(0,0)' |&> box '(2,2),(0,0)' → t

box <^ box → boolean

Расположен ли первый объект ниже второго (допускается касание границ)?

box '((1,1),(0,0))' <^ box '((2,2),(1,1))' → t

box >^ box → boolean

Расположен ли первый объект выше второго (допускается касание границ)?

box '((2,2),(1,1))' >^ box '((1,1),(0,0))' → t

geometric_type ?# geometric_type → boolean

Пересекаются ли данные объекты? Доступно для следующих пар типов: (box, box), (lseg, box), (lseg, lseg), (lseg, line), (line, box), (line, line), (path, path).

lseg '[(-1,0),(1,0)]' ?# box '(2,2),(-2,-2)' → t

?- line → boolean

?- lseg → boolean

Является ли линия горизонтальной?

?- lseg '[(-1,0),(1,0)]' → t

point ?- point → boolean

Выровнены ли точки по горизонтали (имеют ли одинаковую координату y)?

point '(1,0)' ?- point '(0,0)' → t

?| line → boolean

?| lseg → boolean

Является ли линия вертикальной?

?| lseg '[(-1,0),(1,0)]' → f

point ?| point → boolean

Выровнены ли точки по вертикали (имеют ли одинаковую координату x)?

point '(0,1)' ?| point '(0,0)' → t

line ?-| line → boolean

lseg ?-| lseg → boolean

Являются ли линии перпендикулярными?

lseg '[(0,0),(0,1)]' ?-| lseg '[(0,0),(1,0)]' → t

line ?|| line → boolean

lseg ?|| lseg → boolean

Являются ли линии параллельными?

lseg '[(-1,0),(1,0)]' ?|| lseg '[(-1,2),(1,2)]' → t

geometric_type ~= geometric_type → boolean

Являются ли данные объекты идентичными? Доступно для point, box, polygon, circle.

polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))' → t

[a] «Вращение» объекта типа box с помощью данных операторов перемещает только его угловые точки: прямоугольник по-прежнему считается имеющим стороны, параллельные осям. Следовательно, для типа box исходный размер не сохраняется, в отличие от выполнения истинного поворота.


Внимание

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

Примечание

До версии Digital Q.DataBase 14, операторы сравнения «строго ниже» и «строго выше» для типа point point <<| point и point |>> point соответственно назывались <^ и >^. Данные имена по-прежнему доступны, однако они признаны устаревшими и в будущем будут удалены.

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

Функция

Описание

Примеры

area ( geometric_type ) → double precision

Вычисляет площадь. Доступно для box, path, circle. A path входной объект должен быть замкнутым, в противном случае возвращается значение NULL. Кроме того, если path является самопересекающимся, результат может быть неопределенным.

area(box '(2,2),(0,0)') → 4

center ( geometric_type ) → point

Вычисляет координаты центральной точки. Доступно для box, circle.

center(box '(1,2),(0,0)') → (0.5,1)

diagonal ( box ) → lseg

Возвращает диагональ прямоугольника в виде отрезка (аналогично функции lseg(box)).

diagonal(box '(1,2),(0,0)') → [(1,2),(0,0)]

diameter ( circle ) → double precision

Вычисляет диаметр круга.

diameter(circle '<(0,0),2>') → 4

height ( box ) → double precision

Вычисляет вертикальный размер прямоугольника (box).

height(box '(1,2),(0,0)') → 2

isclosed ( path ) → boolean

Проверяет, является ли путь замкнутым.

isclosed(path '((0,0),(1,1),(2,0))') → t

isopen ( path ) → boolean

Проверяет, является ли путь разомкнутым.

isopen(path '[(0,0),(1,1),(2,0)]') → t

длины ( geometric_type ) → double precision

Вычисление полной длины. Доступно для lseg, path.

length(path '((-1,0),(1,0))') → 4

npoints ( geometric_type ) → integer

Возвращение количества точек. Доступно для path, polygon.

npoints(path '[(0,0),(1,1),(2,0)]') → 3

pclose ( path ) → path

Преобразует путь в замкнутый.

pclose(path '[(0,0),(1,1),(2,0)]') → ((0,0),(1,1),(2,0))

popen ( path ) → path

Преобразование пути в незамкнутую форму.

popen(path '((0,0),(1,1),(2,0))') → [(0,0),(1,1),(2,0)]

radius ( circle ) → double precision

Вычисление радиуса окружности.

radius(circle '<(0,0),2>') → 2

slope ( point, point ) → double precision

Вычисление наклона прямой, проведенной через две точки.

slope(point '(0,0)', point '(2,1)') → 0.5

ширина ( box ) → double precision

Вычисление горизонтального размера прямоугольника.

width(box '(1,2),(0,0)') → 1


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

Функция

Описание

Примеры

box ( circle ) → box

Вычисление прямоугольника, вписанного в окружность.

box(circle '<(0,0),2>') → (1.414213562373095,1.414213562373095),​(-1.414213562373095,-1.414213562373095)

box ( point ) → box

Преобразование точки в пустой прямоугольник.

box(point '(1,0)') → (1,0),(1,0)

box ( point, point ) → box

Преобразование двух любых угловых точек в прямоугольник.

box(point '(0,1)', point '(1,0)') → (1,1),(0,0)

box ( polygon ) → box

Вычисляет ограничивающий прямоугольник для многоугольника.

box(polygon '((0,0),(1,1),(2,0))') → (2,1),(0,0)

bound_box ( box, box ) → box

Вычисляет ограничивающий прямоугольник для двух прямоугольников.

bound_box(box '(1,1),(0,0)', box '(4,4),(3,3)') → (4,4),(0,0)

circle ( box ) → circle

Вычисляет минимальную окружность, описывающую прямоугольник.

circle(box '(1,1),(0,0)') → <(0.5,0.5),0.7071067811865476>

circle ( point, double precision ) → circle

Формирует окружность по заданному центру и радиусу.

circle(point '(0,0)', 2.0) → <(0,0),2>

circle ( polygon ) → circle

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

circle(polygon '((0,0),(1,3),(2,0))') → <(1,1),1.6094757082487299>

line ( point, point ) → line

Строит прямую линию, проходящую через две точки.

line(point '(-1,0)', point '(1,0)') → {0,-1,0}

lseg ( box ) → lseg

Извлекает диагональ прямоугольника в виде сегмента прямой (отрезка).

lseg(box '(1,0),(-1,0)') → [(1,0),(-1,0)]

lseg ( point, point ) → lseg

Создает отрезок на основе двух конечных точек.

lseg(point '(-1,0)', point '(1,0)') → [(-1,0),(1,0)]

path ( polygon ) → path

Преобразует многоугольник в замкнутый контур с тем же списком точек.

path(polygon '((0,0),(1,1),(2,0))') → ((0,0),(1,1),(2,0))

point ( double precision, double precision ) → point

Создает точку на основе ее координат.

point(23.4, -44.5) → (23.4,-44.5)

point ( box ) → point

Вычисляет центр прямоугольника.

point(box '(1,0),(-1,0)') → (0,0)

point ( circle ) → point

Вычисляет центр окружности.

point(circle '<(0,0),2>') → (0,0)

point ( lseg ) → point

Вычисляет центр отрезка.

point(lseg '[(-1,0),(1,0)]') → (0,0)

point ( polygon ) → point

Вычисляет центр многоугольника (среднее значение позиций точек многоугольника).

point(polygon '((0,0),(1,1),(2,0))') → (1,0. 3333333333333333)

polygon ( box ) → polygon

Преобразует прямоугольник в многоугольник, состоящий из 4 точек.

polygon(box '(1,1),(0,0)') → ((0,0),(0,1),(1,1),(1,0))

polygon ( circle ) → polygon

Преобразует окружность в многоугольник, состоящий из 12 точек.

polygon(circle '<(0,0),2>') → ((-2,0),​(-1.7320508075688774,0. 9999999999999999),​(-1. 0000000000000002,1.7320508075688772),​(-1.2246063538223773e-16,2),​(0. 9999999999999996,1.7320508075688774),​(1.732050807568877,1. 0000000000000007),​(2,2.4492127076447545e-16),​(1.7320508075688776,-0. 9999999999999994),​(1. 0000000000000009,-1.7320508075688767),​(3.673819061467132e-16,-2),​(-0. 9999999999999987,-1.732050807568878),​(-1.7320508075688767,-1. 0000000000000009))

polygon ( integer, circle ) → polygon

Преобразует окружность в n-угольник.

polygon(4, circle '<(3,0),1>') → ((2,0),​(3,1),​(4,1.2246063538223773e-16),​(3,-1))

polygon ( path ) → polygon

Преобразует замкнутый контур в многоугольник с тем же набором точек.

polygon(path '((0,0),(1,1),(2,0))') → ((0,0),(1,1),(2,0))


Доступ к двум числовым компонентам значения типа point point можно осуществлять так, как если бы точка была массивом с индексами 0 и 1. Например, если t.p является point столбцом, то запрос SELECT p[0] FROM t извлекает координату X, а команда UPDATE t SET p[1] = ... изменяет координату Y. Аналогичным образом значение типа box или lseg может рассматриваться как массив из двух point значений.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению