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.