9.10. Fonctions et opérateurs géométriques

Les types géométriques point, box, lseg, line, path, polygon et circle ont un large ensemble de support natif de fonctions et d'opérateurs, affichés dans Tableau 9-28, Tableau 9-29 et Tableau 9-30.

Tableau 9-28. Opérateurs géométriques

OpérateurDescriptionExemple
+ Translationbox '((0,0),(1,1))' + point '(2.0,0)'
- Translationbox '((0,0),(1,1))' - point '(2.0,0)'
* Échelle/rotationbox '((0,0),(1,1))' * point '(2.0,0)'
/ Échelle/rotationbox '((0,0),(2,2))' / point '(2.0,0)'
# Point ou boîte d'intersection'((1,-1),(-1,1))' # '((1,1),(-1,-1))'
# Nombre de points dans le chemin ou le polygone# '((1,0),(0,1),(-1,0))'
@-@ Longueur ou circonférence@-@ path '((0,0),(1,0))'
@@ Centre@@ circle '((0,0),10)'
## Point le plus proche entre le premier et le second opérandepoint '(0,0)' ## lseg '((2,0),(0,2))'
<-> Distance entrecircle '((0,0),1)' <-> circle '((5,0),1)'
&& Surcharge ?box '((0,0),(1,1))' && box '((0,0),(2,2))'
&< Ne s'étend pas à droite de ?box '((0,0),(1,1))' &< box '((0,0),(2,2))'
&> Ne s'étend pas à gauche de ?box '((0,0),(3,3))' &> box '((0,0),(2,2))'
<< À gauche de ?circle '((0,0),1)' << circle '((5,0),1)'
>> À droite de ?circle '((5,0),1)' >> circle '((0,0),1)'
<^ En dessous de ?circle '((0,0),1)' <^ circle '((0,5),1)'
>^ Au dessus de ?circle '((0,5),1)' >^ circle '((0,0),1)'
?# Intersection ?lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'
?- Horizontal ??- lseg '((-1,0),(1,0))'
?- Sont-ils alignés horizontalement ?point '(1,0)' ?- point '(0,0)'
?| Vertical ??| lseg '((-1,0),(1,0))'
?| Sont-ils verticalement alignés ?point '(0,1)' ?| point '(0,0)'
?-| Perpendiculaire ?lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'
?|| Parallèle ?lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'
~ Contient ?circle '((0,0),2)' ~ point '(1,1)'
@ Contenu ou contenant ?point '(1,1)' @ circle '((0,0),2)'
~= Identique à ?polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'

Tableau 9-29. Fonctions géométriques

FonctionType de retourDescriptionExemple
area (object)double precisionairearea(box '((0,0),(1,1))')
box_intersect(box, box)boxboîte d'intersectionbox_intersect(box '((0,0),(1,1))',box '((0.5,0.5),(2,2))')
center (object)pointcentrecenter(box '((0,0),(1,2))')
diameter(circle)double precisiondiamètre d'un cerclediameter(circle '((0,0),2.0)')
height(box)double precisiontaille verticale d'une boîteheight(box '((0,0),(1,1))')
isclosed(path)booleanun chemin fermé ?isclosed(path '((0,0),(1,1),(2,0))')
isopen(path)booleanun chemin ouvert ?isopen(path '[(0,0),(1,1),(2,0)]')
length(object)</ entry> double precisionlongueurlength(path '((-1,0),(1,0))')
npoints(path)integernombre de pointsnpoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon)integernombre de pointsnpoints(polygon '((1,1),(0,0))')
pclose(path)pathconvertit un chemin en chemin fermépclose(path '[(0,0),(1,1),(2,0)]')
popen(path)pathconvertit un chemin en chemin ouvertpopen(path '((0,0),(1,1),(2,0))')
radius(circle)double precisionradius d'un cercleradius(circle '((0,0),2.0)')
width(box)double precisiontaille horizontale d'une boîtewidth(box '((0,0),(1,1))')

Tableau 9-30. Fonctions de conversion d'un type géométrique

FonctionType de retourDescriptionExemple
box(circle)boxcercle vers boîtebox(circle '((0,0),2.0)')
box(point, point)boxpoints vers boîtebox(point '(0,0)', point '(1,1)')
box(polygon)boxpolygone vers boîtebox(polygon '((0,0),(1,1),(2,0))')
circle(box)circleboîte vers cerclecircle(box '((0,0),(1,1))')
circle(point, double precision)circlecentre et radius vers cerclecircle(point '(0,0)', 2.0)
lseg(box)lsegdiagonale d'une boîte vers un segment de lignelseg(box '((-1,0),(1,0))')
lseg(point, point)lsegpoints vers un segment de lignelseg(point '(-1,0)', point '(1,0)')
path(polygon)pointpolygone vers cheminpath(polygon '((0,0),(1,1),(2,0))')
point(double precision, double precision)pointpoint de constructionpoint(23.4, -44.5)
point(box)pointcentre de la boîtepoint(box '((-1,0),(1,0))')
point(circle)pointcentre d'un cerclepoint(circle '((0,0),2.0)')
point(lseg)pointcentre de lsegpoint(lseg '((-1,0),(1,0))')
point(lseg, lseg)pointintersectionpoint(lseg '((-1,0),(1,0))', lseg '((-2,-2),(2,2))')
point(polygon)pointcentre d'un polygonepoint(polygon '((0,0),(1,1),(2,0))')
polygon(box)polygonboîte vers polygone à quatre pointspolygon(box '((0,0),(1,1))')
polygon(circle)polygoncercle vers polygone à 12 pointspolygon(circle '((0,0),2.0)')
polygon(npts, circle)polygoncercle vers polygone npts-pointpolygon(12, circle '((0,0),2.0)')
polygon(path)polygonchemin vers polygonepolygon(path '((0,0),(1,1),(2,0))')

Il est possible d'accéder aux deux numéros composant d'un point comme si c'était un tableau avec les index 0 et 1. Par exemple, si t.p est une colonne de type point, alors SELECT p[0] FROM t récupère les coordonnées X et UPDATE t SET p[1] = ... modifie les coordonnées Y. De la même façon, une valeur de type box ou lseg pourrait être traitée comme un tableau de deux valeurs de type point.

La fonction area fonctionne pour les types box, circle et path. La fonction area fonctionne seulement pour le type de données path si les points dans le path ne se coupent pas. Par exemple, le path '((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATH ne fonctionne pas. Néanmoins, le path suivant, et visuellement identique, '((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATH fonctionnera. Si le concept d'intersection contre sans intersection du path est confus pour vous, dessinez les deux path ci-dessus côte-à-côte sur une partie d'un papier graphe.