6.9. Funções e operadores geométricos

Os tipos geométricos point, box, lseg, line, path, polygon e circle possuem um amplo conjunto de funções e operadores nativos para apoiá-los, mostrados na Tabela 6-20, na Tabela 6-21 e na Tabela 6-22.

Tabela 6-20. Operadores geométricos

OperadorDescriçãoUtilização
+ Translaçãobox '((0,0),(1,1))' + point '(2.0,0)'
- Translaçãobox '((0,0),(1,1))' - point '(2.0,0)'
* Escala/rotaçãobox '((0,0),(1,1))' * point '(2.0,0)'
/ Escala/rotaçãobox '((0,0),(2,2))' / point '(2.0,0)'
# Interseção'((1,-1),(-1,1))' # '((1,1),(-1,-1))'
# Número de pontos do caminho ou do polígono# '((1,0),(0,1),(-1,0))'
## Ponto mais próximopoint '(0,0)' ## lseg '((2,0),(0,2))'
&& Sobrepõe?box '((0,0),(1,1))' && box '((0,0),(2,2))'
&< Sobrepõe para esquerda?box '((0,0),(1,1))' &< box '((0,0),(2,2))'
&> Sobrepõe para direita?box '((0,0),(3,3))' &> box '((0,0),(2,2))'
<-> Distância entrecircle '((0,0),1)' <-> circle '((5,0),1)'
<< Está à esquerda de?circle '((0,0),1)' << circle '((5,0),1)'
<^ Está abaixo?circle '((0,0),1)' <^ circle '((0,5),1)'
>> Está à direita de?circle '((5,0),1)' >> circle '((0,0),1)'
>^ Está acima?circle '((0,5),1)' >^ circle '((0,0),1)'
?# Cruzamento ou sobreposiçãolseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'
?- É horizontal?point '(1,0)' ?- point '(0,0)'
?-| É perpendicular?lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'
@-@ Comprimento ou circunferência@-@ path '((0,0),(1,0))'
?| É vertical?point '(0,1)' ?| point '(0,0)'
?|| É paralela?lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'
@ Contida ou sobrepoint '(1,1)' @ circle '((0,0),2)'
@@ Centro de@@ circle '((0,0),10)'
~= O mesmo quepolygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'

Tabela 6-21. Funções geométricas

FunçãoRetornaDescriçãoExemplo
area(object)double precisionárea do objetoarea(box '((0,0),(1,1))')
box(box, box)boxretângulo de interseçãobox(box '((0,0),(1,1))',box '((0.5,0.5),(2,2))')
center(object)pointcentro do objetocenter(box '((0,0),(1,2))')
diameter(circle)double precisiondiâmetro do círculodiameter(circle '((0,0),2.0)')
height(box)double precisiontamanho vertical do retânguloheight(box '((0,0),(1,1))')
isclosed(path)booleané um caminho fechado?isclosed(path '((0,0),(1,1),(2,0))')
isopen(path)booleané um caminho aberto?isopen(path '[(0,0),(1,1),(2,0)]')
length(object)double precisioncomprimento do objetolength(path '((-1,0),(1,0))')
npoints(path)integernúmero de pontosnpoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon)integernúmero de pontosnpoints(polygon '((1,1),(0,0))')
pclose(path)pathconverte caminho em caminho fechadopopen(path '[(0,0),(1,1),(2,0)]')
popen(path)pathconverte caminho em caminho abertopopen(path '((0,0),(1,1),(2,0))')
radius(circle)double precisionraio do círculoradius(circle '((0,0),2.0)')
width(box)double precisiontamanho horizontalwidth(box '((0,0),(1,1))')

Tabela 6-22. Funções de conversão de tipo geométrico

FunçãoRetornaConversãoExemplo
box(circle)boxcírculo em retângulobox(circle '((0,0),2.0)')
box(point, point)boxponto em retângulobox(point '(0,0)', point '(1,1)')
box(polygon)boxpolígono em retângulobox(polygon '((0,0),(1,1),(2,0))')
circle(box)circleretângulo em círculocircle(box '((0,0),(1,1))')
circle(point, double precision)circleponto em círculocircle(point '(0,0)', 2.0)
lseg(box)lsegdiagonal do retângulo em lseglseg(box '((-1,0),(1,0))')
lseg(point, point)lsegponto em lseglseg(point '(-1,0)', point '(1,0)')
path(polygon)pointpolígono em caminhopath(polygon '((0,0),(1,1),(2,0))')
point(circle)pointcentropoint(circle '((0,0),2.0)')
point(lseg, lseg)pointinterseçãopoint(lseg '((-1,0),(1,0))', lseg '((-2,-2),(2,2))')
point(polygon)pointcentropoint(polygon '((0,0),(1,1),(2,0))')
polygon(box)polygonpolígono de 4 pontospolygon(box '((0,0),(1,1))')
polygon(circle)polygonpolígono de 12 pontospolygon(circle '((0,0),2.0)')
polygon(npts, circle)polygonpolígono de nptspolygon(12, circle '((0,0),2.0)')
polygon(path)polygoncaminho em polígonopolygon(path '((0,0),(1,1),(2,0))')

É possível acessar os dois números que compõem um ponto, como se fosse uma matriz com os índices 0 e 1. Por exemplo, se t.p for uma coluna do tipo point, então SELECT p[0] FROM t obtém a coordenada X; UPDATE t SET p[1] = ... altera a coordenada Y. Do mesmo modo, uma coluna do tipo box ou lseg pode ser tratada como sendo uma matriz contendo dois pontos.