9.9. 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))'
&< Surcharge ou à gauche de ?box '((0,0),(1,1))' &< box '((0,0),(2,2))'
&> Surcharge ou à droite 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épopen(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)circlepoint 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(circle)pointcentre d'un cerclepoint(circle '((0,0),2.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.