几何函数和操作符

几何类型point, box, lseg, line, path, polygon, circle 有许多内置函数和操作符支持,在 表.几何操作符表.几何函数表.几何类型转换函数 中展示。

Caution

请注意”相同”操作符~=表示point,box, polygon,circle类型在一般意义上相同。 这些类型有些还有一个=操作符,不过它只是比较相同的 面积 。 其它的标量比较操作符(<=等)也是为这些类型比较面积。

表.几何操作符

操作符 描述 例子
+ 平移 box ‘((0,0),(1,1))’ + point ‘(2.0,0)’
- 平移 box ‘((0,0),(1,1))’ - point ‘(2.0,0)’
* 伸缩/旋转 box ‘((0,0),(1,1))’ * point ‘(2.0,0)’
/ 伸缩/旋转 box ‘((0,0),(2,2))’ / point ‘(2.0,0)’
@-@ 长度或者周长 @-@ path ‘((0,0),(1,0))’
@@ 中心 @@ circle ‘((0,0),10)’
## 第一个操作数相对第二个操作数的最近点 point ‘(0,0)’ ## lseg ‘((2,0),(0,2))’
<-> 间距 circle ‘((0,0),1)’ <-> circle ‘((5,0),1)’
&& 重叠? box ‘((0,0),(1,1))’ && box ‘((0,0),(2,2))’
<< 是否严格在左? circle ‘((0,0),1)’ << circle ‘((5,0),1)’
>> 是否严格在右? circle ‘((5,0),1)’ >> circle ‘((0,0),1)’
&< 是否没有延伸到右边? box ‘((0,0),(1,1))’ &< box ‘((0,0),(2,2))’
&> 是否没有延伸到左边? box ‘((0,0),(3,3))’ &> box ‘((0,0),(2,2))’
<<| 是否严格在下? box ‘((0,0),(3,3))’ <<| box ‘((3,4),(5,5))’
|>> 是否严格在上? box ‘((3,4),(5,5))’ |>> box ‘((0,0),(3,3))’
&<| 是否延伸到上面? box ‘((0,0),(1,1))’ &<| box ‘((0,0),(2,2))’
|&> 是否延伸到下面? box ‘((0,0),(3,3))’ |&> box ‘((0,0),(2,2))’
?# 相交? lseg ‘((-1,0),(1,0))’ ?# box ‘((-2,-2),(2,2))’
?- 水平? ?- lseg ‘((-1,0),(1,0))’
?- 水平对齐? point ‘(1,0)’ ?- point ‘(0,0)’
?| 竖直? ?| lseg ‘((-1,0),(1,0))’
?| 竖直对齐? point ‘(0,1)’ ?| point ‘(0,0)’
?-| 垂直? lseg ‘((0,0),(0,1))’ ?-| lseg ‘((0,0),(1,0))’
?|| 平行? lseg ‘((-1,0),(1,0))’ ?|| lseg ‘((-1,2),(1,2))’
@> 包含? circle ‘((0,0),2)’ @> point ‘(1,1)’
<@ 包含或在…上? point ‘(1,1)’ <@ circle ‘((0,0),2)’
~= 与…相同? polygon ‘((0,0),(1,1))’ ~= polygon ‘((1,1),(0,0))’

表.几何函数

函数 返回类型 描述 例子
area(object) double precision 面积 area(box ‘((0,0),(1,1))’)
center(object) point 中心 center(box ‘((0,0),(1,2))’)
diameter(circle) double precision 圆直径 diameter(circle ‘((0,0),2.0)’)
height(box) double precision 矩形的竖直高度 height(box ‘((0,0),(1,1))’)
isclosed(path) boolean 闭合路径? isclosed(path ‘((0,0),(1,1),(2,0))’)
isopen(path) boolean 开路径? isopen(path ‘[(0,0),(1,1),(2,0)]’)
length(object) double precision 长度 length(path ‘((-1,0),(1,0))’)
npoints(path) int 点数 npoints(path ‘[(0,0),(1,1),(2,0)]’)
npoints(polygon) int 点数 npoints(polygon ‘((1,1),(0,0))’)
pclose(path) path 把路径转换为闭合 pclose(path ‘[(0,0),(1,1),(2,0)]’)
popen(path) path 把路径转换为开放 popen(path ‘((0,0),(1,1),(2,0))’)
radius(circle) double precision 圆半径 radius(circle ‘((0,0),2.0)’)
width(box) double precision 矩形的水平尺寸 width(box ‘((0,0),(1,1))’)

表.几何类型转换函数

函数 返回类型 描述 例子
box(circle) box 将圆转换成矩形 box(circle ‘((0,0),2.0)’)
box(point, point) box 将点转换成矩形 box(point ‘(0,0)’, point ‘(1,1)’)
box(polygon) box 将多边形转换成矩形 box(polygon ‘((0,0),(1,1),(2,0))’)
circle(box) circle 矩形转换成圆 circle(box ‘((0,0),(1,1))’)
circle(point, double precision) circle 将圆心和半径转换成圆 circle(point ‘(0,0)’, 2.0)
circle(polygon) circle 将多边形转换成圆 circle(polygon ‘((0,0),(1,1),(2,0))’)
lseg(box) lseg box 矩形对角线转化成线段 lseg(box ‘((-1,0),(1,0))’)
lseg(point, point) lseg 点转换成线段 lseg(point ‘(-1,0)’, point ‘(1,0)’)
path(polygon) point 多边形转换成路径 path(polygon ‘((0,0),(1,1),(2,0))’)
point(double precision, double precision) point 构造点 point(23.4, -44.5)
point(box) point 矩形的中心 point(box ‘((-1,0),(1,0))’)
point(circle) point 圆心 point(circle ‘((0,0),2.0)’)
point(lseg) point 线段的中心 point(lseg ‘((-1,0),(1,0))’)
point(polygon) point 多边形的中心 point(polygon ‘((0,0),(1,1),(2,0))’)
polygon(box) polygon 矩形转换成 4 点多边形 polygon(box ‘((0,0),(1,1))’)
polygon(circle) polygon 圆转换成 12 点多边形 polygon(circle ‘((0,0),2.0)’)
polygon(npts, circle) polygon 圆转换成 12 点多边形 polygon(12, circle ‘((0,0),2.0)’)
polygon(path) polygon 路径转换成多边形 polygon(path ‘((0,0),(1,1),(2,0))’)

我们可以把一个point的两个组成部分当作索引分别为 0 和 1 的数组元素进行访问。比如,如果t.p是一个point字段,那么SELECT p[0] FROM t 检索 X 座标而UPDATE t SET p[1] = …改变 Y 座标。同样, box或lseg的值可以当作两个point的数组值看待。

area函数可以用于box, circle, path类型。area函数操作path数据类型的时候, 只有在path的点没有交叉的情况下才可用。比如,path ‘((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))’::PATH是不行的, 而下面的视觉等效path ‘((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))’::PATH 就可以。如果交叉和不交叉的path概念让你糊涂,那么把上面两个path 都画在纸上,你就明白了。