9.10. 幾何函數和操作符

有許多內置函數和操作符支援 幾何類型pointboxlseglinepathpolygoncircle 等, 在Table 9-28Table 9-29,和 Table 9-30

Table 9-28. 幾何函數和操作符

操作符描述例子
+平移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)'
#交點或者交面'((1,-1),(-1,1))' # '((1,1),(-1,-1))'
#路徑或多邊形頂點數# '((1,0),(0,1),(-1,0))'
@[email protected] 長度或者周長@[email protected] 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))'
&<是否沒有延伸到右邊?box '((0,0),(1,1))' &< box '((0,0),(2,2))'
&>是否沒有延伸到左邊?box '((0,0),(3,3))' &> box '((0,0),(2,2))'
<<在左邊?circle '((0,0),1)' << circle '((5,0),1)'
>> 在右邊?circle '((5,0),1)' >> circle '((0,0),1)'
<^低於?circle '((0,0),1)' <^ circle '((0,5),1)'
>^高於?circle '((0,5),1)' >^ circle '((0,0),1)'
?#相交?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))'

Table 9-29. 幾何函數

函數返回類型描述例子
area(object)double precision目標的面積area(box '((0,0),(1,1))')
box_intersect(box, box)box方的交box_intersect(box '((0,0),(1,1))',box '((0.5,0.5),(2,2))')
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(polygon)integer點數npoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon)integer點數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))')

Table 9-30. 幾何類型轉換函數

函數返回類型描述例子
box(circle)box將圓轉換成長方形box(cricle '((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)
lseg(box)lseg長方形對角線轉化成線段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(circle)point圓心point(circle '((0,0),2.0)')
point(lseg, lseg)point轉換成點(相交)point(lseg '((-1,0),(1,0))', lseg '((-2,-2),(2,2))')
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圓轉換成npts 點多邊形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 可以用於類型 boxcircle,和 patharea 函數操作 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 都畫在一張紙上,您就明白了。