9.10. 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 9-30, na Tabela 9-31 e na Tabela 9-32.

Tabela 9-30. Operadores geométricos

Operador Descrição Exemplo
+ Translação box '((0,0),(1,1))' + point '(2.0,0)'
- Translação box '((0,0),(1,1))' - point '(2.0,0)'
* Escala/rotação box '((0,0),(1,1))' * point '(2.0,0)'
/ Escala/rotação box '((0,0),(2,2))' / point '(2.0,0)'
# Ponto ou caixa de 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))'
@-@ Comprimento ou circunferência @-@ path '((0,0),(1,0))'
@@ Centro @@ circle '((0,0),10)'
## Ponto mais próximo do primeiro operando no segundo operando point '(0,0)' ## lseg '((2,0),(0,2))'
<-> Distância entre circle '((0,0),1)' <-> circle '((5,0),1)'
&& Se sobrepõem? box '((0,0),(1,1))' && box '((0,0),(2,2))'
&< Não se estende à direita de? box '((0,0),(1,1))' &< box '((0,0),(2,2))'
&> Não se estende à esquerda de? box '((0,0),(3,3))' &> box '((0,0),(2,2))'
<< Está à esquerda? circle '((0,0),1)' << circle '((5,0),1)'
>> Está à direita? circle '((5,0),1)' >> circle '((0,0),1)'
<^ Está abaixo? circle '((0,0),1)' <^ circle '((0,5),1)'
>^ Está acima? circle '((0,5),1)' >^ circle '((0,0),1)'
?# Se intersectam? lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'
?- É horizontal? ?- lseg '((-1,0),(1,0))'
?- São alinhados horizontalmente? point '(1,0)' ?- point '(0,0)'
?| É vertical? ?| lseg '((-1,0),(1,0))'
?| São alinhados verticalmente point '(0,1)' ?| point '(0,0)'
?-| São perpendiculares? lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'
?|| São paralelos? lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'
~ Contém? circle '((0,0),2)' ~ point '(1,1)'
@ Está contido ou sobre? point '(1,1)' @ circle '((0,0),2)'
~= O mesmo que? polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'

Tabela 9-31. Funções geométricas

Função Tipo retornado Descrição Exemplo
area(object) double precision área area(box '((0,0),(1,1))')
box_intersect(box, box) box caixa de interseção box_intersect(box '((0,0),(1,1))',box '((0.5,0.5),(2,2))')
center(object) point centro center(box '((0,0),(1,2))')
diameter(circle) double precision diâmetro do círculo diameter(circle '((0,0),2.0)')
height(box) double precision tamanho vertical da caixa height(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 precision comprimento length(path '((-1,0),(1,0))')
npoints(path) integer número de pontos npoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon) integer número de pontos npoints(polygon '((1,1),(0,0))')
pclose(path) path converte o caminho em caminho fechado pclose(path '[(0,0),(1,1),(2,0)]')
popen(path) path converte o caminho em caminho aberto popen(path '((0,0),(1,1),(2,0))')
radius(circle) double precision raio do círculo radius(circle '((0,0),2.0)')
width(box) double precision tamanho horizontal da caixa width(box '((0,0),(1,1))')

Tabela 9-32. Funções de conversão de tipo geométrico

Função Tipo retornado Descrição Exemplo
box(circle) box círculo em caixa box(circle '((0,0),2.0)')
box(point, point) box pontos em caixa box(point '(0,0)', point '(1,1)')
box(polygon) box polígono em caixa box(polygon '((0,0),(1,1),(2,0))')
circle(box) circle caixa em círculo circle(box '((0,0),(1,1))')
circle(point, double precision) circle centro e raio em círculo circle(point '(0,0)', 2.0)
lseg(box) lseg diagonal de caixa em segmento de linha lseg(box '((-1,0),(1,0))')
lseg(point, point) lseg ponto em segmento de linha lseg(point '(-1,0)', point '(1,0)')
path(polygon) point polígono em caminho path(polygon '((0,0),(1,1),(2,0))')
point(double precision, double precision) point constrói ponto point(23.4, -44.5)
point(box) point centro da caixa point(box '((-1,0),(1,0))')
point(circle) point centro do círculo point(circle '((0,0),2.0)')
point(lseg) point centro do segmento de linha point(lseg '((-1,0),(1,0))')
point(lseg, lseg) point intersecção point(lseg '((-1,0),(1,0))', lseg '((-2,-2),(2,2))')
point(polygon) point centro do polígono point(polygon '((0,0),(1,1),(2,0))')
polygon(box) polygon caixa em polígono de 4 pontos polygon(box '((0,0),(1,1))')
polygon(circle) polygon círculo em polígono de 12 pontos polygon(circle '((0,0),2.0)')
polygon(npts, circle) polygon círculo em polígono de npts-pontos polygon(12, circle '((0,0),2.0)')
polygon(path) polygon caminho em polígono polygon(path '((0,0),(1,1),(2,0))')

É possível acessar os dois números que compõem um point como se este 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 retorna a coordenada X, e UPDATE t SET p[1] = ... altera a coordenada Y. Do mesmo modo, um valor do tipo box ou lseg pode ser tratado como sendo uma matriz contendo dois valores do tipo point.

As funções area operam sobre os tipos box, circle e path. A função area somente opera sobre o tipo de dado path se os pontos em path não se intersectarem. Por exemplo, não opera sobre o path '((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATH, entretanto opera sobre o path visualmente idêntico '((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATH. Se o conceito de path que intersecta e que não intersecta estiver confuso, desenhe os dois caminhos acima lado a lado em uma folha de papel gráfico.

SourceForge.net Logo CSS válido!