9.11. ÐеомеÑÑиÑеÑкие ÑÑнкÑии и опеÑаÑоÑÑ
ÐÐ»Ñ Ð³ÐµÐ¾Ð¼ÐµÑÑиÑеÑкиÑ
Ñипов point, box, lseg, line, path, polygon и circle ÑазÑабоÑан болÑÑой Ð½Ð°Ð±Ð¾Ñ Ð²ÑÑÑоеннÑÑ
ÑÑнкÑий и опеÑаÑоÑов, пÑедÑÑавленнÑй в ТаблиÑе 9.34, ТаблиÑе 9.35 и ТаблиÑе 9.36.
Ðнимание
ÐамеÑÑÑе, ÑÑо опеÑаÑÐ¾Ñ Â«Ð¸Ð´ÐµÐ½ÑиÑноÑÑи», ~=, пÑедÑÑавлÑÐµÑ Ð¾Ð±ÑÑное ÑÑавнение на ÑавенÑÑво знаÑений point, box, polygon и circle. ÐÐ»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
из ÑÑиÑ
Ñипов опÑеделÑн Ñакже опеÑаÑÐ¾Ñ =, но = пÑовеÑÑÐµÑ ÑолÑко ÑавенÑÑво плоÑадей. ÐÑÑгие ÑкалÑÑнÑе опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ (<= и Ñ. д.) Ñак же ÑÑавниваÑÑ Ð¿Ð»Ð¾Ñади знаÑений ÑÑиÑ
Ñипов.
ТаблиÑа 9.34. ÐеомеÑÑиÑеÑкие опеÑаÑоÑÑ
| ÐпеÑаÑÐ¾Ñ | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ |
|---|---|---|
+ | Сдвиг | 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)' |
# | ТоÑка или пÑÑмоÑголÑник в пеÑеÑеÑении | box '((1,-1),(-1,1))' # box '((1,1),(-2,-2))' |
# | ЧиÑло ÑоÑек в пÑÑи или веÑÑин в многоÑголÑнике | # path '((1,0),(0,1),(-1,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))' |
<^ | Ðиже (Ð¼Ð¾Ð¶ÐµÑ ÐºÐ°ÑаÑÑÑÑ)? | 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))' |
ÐÑимеÑание
Ðо PostgreSQL 8.2 опеÑаÑоÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ @> и <@ назÑвалиÑÑ ÑооÑвеÑÑÑвенно ~ и @. ÐÑи имена по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð´Ð¾ÑÑÑпнÑ, но ÑÑиÑаÑÑÑÑ ÑÑÑаÑевÑими и в конÑе конÑов бÑдÑÑ ÑдаленÑ.
ТаблиÑа 9.35. ÐеомеÑÑиÑеÑкие ÑÑнкÑии
| ФÑнкÑÐ¸Ñ | Тип ÑезÑлÑÑаÑа | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ |
|---|---|---|---|
| double precision | плоÑÐ°Ð´Ñ | area(box '((0,0),(1,1))') |
| point | ÑенÑÑ | center(box '((0,0),(1,2))') |
| double precision | диамеÑÑ ÐºÑÑга | diameter(circle '((0,0),2.0)') |
| double precision | веÑÑикалÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ð¿ÑÑмоÑголÑника | height(box '((0,0),(1,1))') |
| boolean | замкнÑÑÑй пÑÑÑ? | isclosed(path '((0,0),(1,1),(2,0))') |
| boolean | оÑкÑÑÑÑй пÑÑÑ? | isopen(path '[(0,0),(1,1),(2,0)]') |
| double precision | длина | length(path '((-1,0),(1,0))') |
| int | ÑиÑло ÑоÑек | npoints(path '[(0,0),(1,1),(2,0)]') |
| int | ÑиÑло ÑоÑек | npoints(polygon '((1,1),(0,0))') |
| path | пÑеобÑазÑÐµÑ Ð¿ÑÑÑ Ð² замкнÑÑÑй | pclose(path '[(0,0),(1,1),(2,0)]') |
| path | пÑеобÑазÑÐµÑ Ð¿ÑÑÑ Ð² оÑкÑÑÑÑй | popen(path '((0,0),(1,1),(2,0))') |
| double precision | ÑадиÑÑ Ð¾ÐºÑÑжноÑÑи | radius(circle '((0,0),2.0)') |
| double precision | гоÑизонÑалÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ð¿ÑÑмоÑголÑника | width(box '((0,0),(1,1))') |
ТаблиÑа 9.36. ФÑнкÑии пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³ÐµÐ¾Ð¼ÐµÑÑиÑеÑÐºÐ¸Ñ Ñипов
РдвÑм компоненÑам Ñипа 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. ÐÑи ÑÑом Ð´Ð»Ñ Ñипа path заданнÑй пÑÑÑ Ð½Ðµ должен бÑÑÑ ÑамопеÑеÑекаÑÑимÑÑ. ÐапÑимеÑ, ÑÑа ÑÑнкÑÐ¸Ñ Ð½Ðµ пÑÐ¸Ð¼ÐµÑ Ð·Ð½Ð°Ñение Ñипа path '((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATH, но пÑÐ¸Ð¼ÐµÑ Ð²Ð¸Ð·ÑалÑно иденÑиÑнÑй пÑÑÑ '((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATH. ÐÑли Ð²Ñ Ð½Ðµ вполне понÑли, ÑÑо здеÑÑ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ Ð¿Ð¾Ð´ ÑамопеÑеÑеÑением пÑÑи, наÑиÑÑйÑе на бÑмаге две ÑигÑÑÑ Ð¿Ð¾ пÑиведÑннÑм кооÑдинаÑам.