几何函数和操作符#

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

小心

请注意”相同”操作符~=表示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 都画在纸上,你就明白了。