Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes15kdownloads
functions-geometry.html886 linesDownload Raw Back to html
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>9.11. Geometric Functions and Operators</title><link rel="stylesheet" type="text/css" href="stylesheet.css" /><link rev="made" href="pgsql-docs@lists.postgresql.org" /><meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" /><link rel="prev" href="functions-enum.html" title="9.10. Enum Support Functions" /><link rel="next" href="functions-net.html" title="9.12. Network Address Functions and Operators" /></head><body id="docContent" class="container-fluid col-10"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center">9.11. Geometric Functions and Operators</th></tr><tr><td width="10%" align="left"><a accesskey="p" href="functions-enum.html" title="9.10. Enum Support Functions">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="functions.html" title="Chapter 9. Functions and Operators">Up</a></td><th width="60%" align="center">Chapter 9. Functions and Operators</th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 16.3 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="functions-net.html" title="9.12. Network Address Functions and Operators">Next</a></td></tr></table><hr /></div><div class="sect1" id="FUNCTIONS-GEOMETRY"><div class="titlepage"><div><div><h2 class="title" style="clear: both">9.11. Geometric Functions and Operators <a href="#FUNCTIONS-GEOMETRY" class="id_link">#</a></h2></div></div></div><p>3    The geometric types <code class="type">point</code>, <code class="type">box</code>,4    <code class="type">lseg</code>, <code class="type">line</code>, <code class="type">path</code>,5    <code class="type">polygon</code>, and <code class="type">circle</code> have a large set of6    native support functions and operators, shown in <a class="xref" href="functions-geometry.html#FUNCTIONS-GEOMETRY-OP-TABLE" title="Table 9.36. Geometric Operators">Table 9.36</a>, <a class="xref" href="functions-geometry.html#FUNCTIONS-GEOMETRY-FUNC-TABLE" title="Table 9.37. Geometric Functions">Table 9.37</a>, and <a class="xref" href="functions-geometry.html#FUNCTIONS-GEOMETRY-CONV-TABLE" title="Table 9.38. Geometric Type Conversion Functions">Table 9.38</a>.7   </p><div class="table" id="FUNCTIONS-GEOMETRY-OP-TABLE"><p class="title"><strong>Table 9.36. Geometric Operators</strong></p><div class="table-contents"><table class="table" summary="Geometric Operators" border="1"><colgroup><col /></colgroup><thead><tr><th class="func_table_entry"><p class="func_signature">8        Operator9       </p>10       <p>11        Description12       </p>13       <p>14        Example(s)15       </p></th></tr></thead><tbody><tr><td class="func_table_entry"><p class="func_signature">16        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">+</code> <code class="type">point</code>17        → <code class="returnvalue"><em class="replaceable"><code>geometric_type</code></em></code>18       </p>19       <p>20        Adds the coordinates of the second <code class="type">point</code> to those of each21        point of the first argument, thus performing translation.22        Available for <code class="type">point</code>, <code class="type">box</code>, <code class="type">path</code>,23        <code class="type">circle</code>.24       </p>25       <p>26        <code class="literal">box '(1,1),(0,0)' + point '(2,0)'</code>27        → <code class="returnvalue">(3,1),(2,0)</code>28       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">29        <code class="type">path</code> <code class="literal">+</code> <code class="type">path</code>30        → <code class="returnvalue">path</code>31       </p>32       <p>33        Concatenates two open paths (returns NULL if either path is closed).34       </p>35       <p>36        <code class="literal">path '[(0,0),(1,1)]' + path '[(2,2),(3,3),(4,4)]'</code>37        → <code class="returnvalue">[(0,0),(1,1),(2,2),(3,3),(4,4)]</code>38       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">39        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">-</code> <code class="type">point</code>40        → <code class="returnvalue"><em class="replaceable"><code>geometric_type</code></em></code>41       </p>42       <p>43        Subtracts the coordinates of the second <code class="type">point</code> from those44        of each point of the first argument, thus performing translation.45        Available for <code class="type">point</code>, <code class="type">box</code>, <code class="type">path</code>,46        <code class="type">circle</code>.47       </p>48       <p>49        <code class="literal">box '(1,1),(0,0)' - point '(2,0)'</code>50        → <code class="returnvalue">(-1,1),(-2,0)</code>51       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">52        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">*</code> <code class="type">point</code>53        → <code class="returnvalue"><em class="replaceable"><code>geometric_type</code></em></code>54       </p>55       <p>56        Multiplies each point of the first argument by the second57        <code class="type">point</code> (treating a point as being a complex number58        represented by real and imaginary parts, and performing standard59        complex multiplication).  If one interprets60        the second <code class="type">point</code> as a vector, this is equivalent to61        scaling the object's size and distance from the origin by the length62        of the vector, and rotating it counterclockwise around the origin by63        the vector's angle from the <em class="replaceable"><code>x</code></em> axis.64        Available for <code class="type">point</code>, <code class="type">box</code>,<a href="#ftn.FUNCTIONS-GEOMETRY-ROTATION-FN" class="footnote"><sup class="footnote" id="FUNCTIONS-GEOMETRY-ROTATION-FN">[a]</sup></a>65        <code class="type">path</code>, <code class="type">circle</code>.66       </p>67       <p>68        <code class="literal">path '((0,0),(1,0),(1,1))' * point '(3.0,0)'</code>69        → <code class="returnvalue">((0,0),(3,0),(3,3))</code>70       </p>71       <p>72        <code class="literal">path '((0,0),(1,0),(1,1))' * point(cosd(45), sind(45))</code>73        → <code class="returnvalue">((0,0),​(0.7071067811865475,0.7071067811865475),​(0,1.414213562373095))</code>74       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">75        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">/</code> <code class="type">point</code>76        → <code class="returnvalue"><em class="replaceable"><code>geometric_type</code></em></code>77       </p>78       <p>79        Divides each point of the first argument by the second80        <code class="type">point</code> (treating a point as being a complex number81        represented by real and imaginary parts, and performing standard82        complex division).  If one interprets83        the second <code class="type">point</code> as a vector, this is equivalent to84        scaling the object's size and distance from the origin down by the85        length of the vector, and rotating it clockwise around the origin by86        the vector's angle from the <em class="replaceable"><code>x</code></em> axis.87        Available for <code class="type">point</code>, <code class="type">box</code>,<a href="functions-geometry.html#ftn.FUNCTIONS-GEOMETRY-ROTATION-FN" class="footnoteref"><sup class="footnoteref">[a]</sup></a> <code class="type">path</code>,88        <code class="type">circle</code>.89       </p>90       <p>91        <code class="literal">path '((0,0),(1,0),(1,1))' / point '(2.0,0)'</code>92        → <code class="returnvalue">((0,0),(0.5,0),(0.5,0.5))</code>93       </p>94       <p>95        <code class="literal">path '((0,0),(1,0),(1,1))' / point(cosd(45), sind(45))</code>96        → <code class="returnvalue">((0,0),​(0.7071067811865476,-0.7071067811865476),​(1.4142135623730951,0))</code>97       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">98        <code class="literal">@-@</code> <em class="replaceable"><code>geometric_type</code></em>99        → <code class="returnvalue">double precision</code>100       </p>101       <p>102        Computes the total length.103        Available for <code class="type">lseg</code>, <code class="type">path</code>.104       </p>105       <p>106        <code class="literal">@-@ path '[(0,0),(1,0),(1,1)]'</code>107        → <code class="returnvalue">2</code>108       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">109        <code class="literal">@@</code> <em class="replaceable"><code>geometric_type</code></em>110        → <code class="returnvalue">point</code>111       </p>112       <p>113        Computes the center point.114        Available for <code class="type">box</code>, <code class="type">lseg</code>,115        <code class="type">polygon</code>, <code class="type">circle</code>.116       </p>117       <p>118        <code class="literal">@@ box '(2,2),(0,0)'</code>119        → <code class="returnvalue">(1,1)</code>120       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">121        <code class="literal">#</code> <em class="replaceable"><code>geometric_type</code></em>122        → <code class="returnvalue">integer</code>123       </p>124       <p>125        Returns the number of points.126        Available for <code class="type">path</code>, <code class="type">polygon</code>.127       </p>128       <p>129        <code class="literal"># path '((1,0),(0,1),(-1,0))'</code>130        → <code class="returnvalue">3</code>131       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">132        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">#</code> <em class="replaceable"><code>geometric_type</code></em>133        → <code class="returnvalue">point</code>134       </p>135       <p>136        Computes the point of intersection, or NULL if there is none.137        Available for <code class="type">lseg</code>, <code class="type">line</code>.138       </p>139       <p>140        <code class="literal">lseg '[(0,0),(1,1)]' # lseg '[(1,0),(0,1)]'</code>141        → <code class="returnvalue">(0.5,0.5)</code>142       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">143        <code class="type">box</code> <code class="literal">#</code> <code class="type">box</code>144        → <code class="returnvalue">box</code>145       </p>146       <p>147        Computes the intersection of two boxes, or NULL if there is none.148       </p>149       <p>150        <code class="literal">box '(2,2),(-1,-1)' # box '(1,1),(-2,-2)'</code>151        → <code class="returnvalue">(1,1),(-1,-1)</code>152       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">153        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">##</code> <em class="replaceable"><code>geometric_type</code></em>154        → <code class="returnvalue">point</code>155       </p>156       <p>157        Computes the closest point to the first object on the second object.158        Available for these pairs of types:159        (<code class="type">point</code>, <code class="type">box</code>),160        (<code class="type">point</code>, <code class="type">lseg</code>),161        (<code class="type">point</code>, <code class="type">line</code>),162        (<code class="type">lseg</code>, <code class="type">box</code>),163        (<code class="type">lseg</code>, <code class="type">lseg</code>),164        (<code class="type">line</code>, <code class="type">lseg</code>).165       </p>166       <p>167        <code class="literal">point '(0,0)' ## lseg '[(2,0),(0,2)]'</code>168        → <code class="returnvalue">(1,1)</code>169       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">170        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&lt;-&gt;</code> <em class="replaceable"><code>geometric_type</code></em>171        → <code class="returnvalue">double precision</code>172       </p>173       <p>174        Computes the distance between the objects.175        Available for all seven geometric types, for all combinations176        of <code class="type">point</code> with another geometric type, and for177        these additional pairs of types:178        (<code class="type">box</code>, <code class="type">lseg</code>),179        (<code class="type">lseg</code>, <code class="type">line</code>),180        (<code class="type">polygon</code>, <code class="type">circle</code>)181        (and the commutator cases).182       </p>183       <p>184        <code class="literal">circle '&lt;(0,0),1&gt;' &lt;-&gt; circle '&lt;(5,0),1&gt;'</code>185        → <code class="returnvalue">3</code>186       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">187        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">@&gt;</code> <em class="replaceable"><code>geometric_type</code></em>188        → <code class="returnvalue">boolean</code>189       </p>190       <p>191        Does first object contain second?192        Available for these pairs of types:193        (<code class="literal">box</code>, <code class="literal">point</code>),194        (<code class="literal">box</code>, <code class="literal">box</code>),195        (<code class="literal">path</code>, <code class="literal">point</code>),196        (<code class="literal">polygon</code>, <code class="literal">point</code>),197        (<code class="literal">polygon</code>, <code class="literal">polygon</code>),198        (<code class="literal">circle</code>, <code class="literal">point</code>),199        (<code class="literal">circle</code>, <code class="literal">circle</code>).200       </p>201       <p>202        <code class="literal">circle '&lt;(0,0),2&gt;' @&gt; point '(1,1)'</code>203        → <code class="returnvalue">t</code>204       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">205        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&lt;@</code> <em class="replaceable"><code>geometric_type</code></em>206        → <code class="returnvalue">boolean</code>207       </p>208       <p>209        Is first object contained in or on second?210        Available for these pairs of types:211        (<code class="literal">point</code>, <code class="literal">box</code>),212        (<code class="literal">point</code>, <code class="literal">lseg</code>),213        (<code class="literal">point</code>, <code class="literal">line</code>),214        (<code class="literal">point</code>, <code class="literal">path</code>),215        (<code class="literal">point</code>, <code class="literal">polygon</code>),216        (<code class="literal">point</code>, <code class="literal">circle</code>),217        (<code class="literal">box</code>, <code class="literal">box</code>),218        (<code class="literal">lseg</code>, <code class="literal">box</code>),219        (<code class="literal">lseg</code>, <code class="literal">line</code>),220        (<code class="literal">polygon</code>, <code class="literal">polygon</code>),221        (<code class="literal">circle</code>, <code class="literal">circle</code>).222       </p>223       <p>224        <code class="literal">point '(1,1)' &lt;@ circle '&lt;(0,0),2&gt;'</code>225        → <code class="returnvalue">t</code>226       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">227        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&amp;&amp;</code> <em class="replaceable"><code>geometric_type</code></em>228        → <code class="returnvalue">boolean</code>229       </p>230       <p>231        Do these objects overlap?  (One point in common makes this true.)232        Available for <code class="type">box</code>, <code class="type">polygon</code>,233        <code class="type">circle</code>.234       </p>235       <p>236        <code class="literal">box '(1,1),(0,0)' &amp;&amp; box '(2,2),(0,0)'</code>237        → <code class="returnvalue">t</code>238       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">239        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&lt;&lt;</code> <em class="replaceable"><code>geometric_type</code></em>240        → <code class="returnvalue">boolean</code>241       </p>242       <p>243        Is first object strictly left of second?244        Available for <code class="type">point</code>, <code class="type">box</code>,245        <code class="type">polygon</code>, <code class="type">circle</code>.246       </p>247       <p>248        <code class="literal">circle '&lt;(0,0),1&gt;' &lt;&lt; circle '&lt;(5,0),1&gt;'</code>249        → <code class="returnvalue">t</code>250       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">251        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&gt;&gt;</code> <em class="replaceable"><code>geometric_type</code></em>252        → <code class="returnvalue">boolean</code>253       </p>254       <p>255        Is first object strictly right of second?256        Available for <code class="type">point</code>, <code class="type">box</code>,257        <code class="type">polygon</code>, <code class="type">circle</code>.258       </p>259       <p>260        <code class="literal">circle '&lt;(5,0),1&gt;' &gt;&gt; circle '&lt;(0,0),1&gt;'</code>261        → <code class="returnvalue">t</code>262       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">263        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&amp;&lt;</code> <em class="replaceable"><code>geometric_type</code></em>264        → <code class="returnvalue">boolean</code>265       </p>266       <p>267        Does first object not extend to the right of second?268        Available for <code class="type">box</code>, <code class="type">polygon</code>,269        <code class="type">circle</code>.270       </p>271       <p>272        <code class="literal">box '(1,1),(0,0)' &amp;&lt; box '(2,2),(0,0)'</code>273        → <code class="returnvalue">t</code>274       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">275        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&amp;&gt;</code> <em class="replaceable"><code>geometric_type</code></em>276        → <code class="returnvalue">boolean</code>277       </p>278       <p>279        Does first object not extend to the left of second?280        Available for <code class="type">box</code>, <code class="type">polygon</code>,281        <code class="type">circle</code>.282       </p>283       <p>284        <code class="literal">box '(3,3),(0,0)' &amp;&gt; box '(2,2),(0,0)'</code>285        → <code class="returnvalue">t</code>286       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">287        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&lt;&lt;|</code> <em class="replaceable"><code>geometric_type</code></em>288        → <code class="returnvalue">boolean</code>289       </p>290       <p>291        Is first object strictly below second?292        Available for <code class="type">point</code>, <code class="type">box</code>, <code class="type">polygon</code>,293        <code class="type">circle</code>.294       </p>295       <p>296        <code class="literal">box '(3,3),(0,0)' &lt;&lt;| box '(5,5),(3,4)'</code>297        → <code class="returnvalue">t</code>298       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">299        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">|&gt;&gt;</code> <em class="replaceable"><code>geometric_type</code></em>300        → <code class="returnvalue">boolean</code>301       </p>302       <p>303        Is first object strictly above second?304        Available for <code class="type">point</code>, <code class="type">box</code>, <code class="type">polygon</code>,305        <code class="type">circle</code>.306       </p>307       <p>308        <code class="literal">box '(5,5),(3,4)' |&gt;&gt; box '(3,3),(0,0)'</code>309        → <code class="returnvalue">t</code>310       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">311        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">&amp;&lt;|</code> <em class="replaceable"><code>geometric_type</code></em>312        → <code class="returnvalue">boolean</code>313       </p>314       <p>315        Does first object not extend above second?316        Available for <code class="type">box</code>, <code class="type">polygon</code>,317        <code class="type">circle</code>.318       </p>319       <p>320        <code class="literal">box '(1,1),(0,0)' &amp;&lt;| box '(2,2),(0,0)'</code>321        → <code class="returnvalue">t</code>322       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">323        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">|&amp;&gt;</code> <em class="replaceable"><code>geometric_type</code></em>324        → <code class="returnvalue">boolean</code>325       </p>326       <p>327        Does first object not extend below second?328        Available for <code class="type">box</code>, <code class="type">polygon</code>,329        <code class="type">circle</code>.330       </p>331       <p>332        <code class="literal">box '(3,3),(0,0)' |&amp;&gt; box '(2,2),(0,0)'</code>333        → <code class="returnvalue">t</code>334       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">335        <code class="type">box</code> <code class="literal">&lt;^</code> <code class="type">box</code>336        → <code class="returnvalue">boolean</code>337       </p>338       <p>339        Is first object below second (allows edges to touch)?340       </p>341       <p>342        <code class="literal">box '((1,1),(0,0))' &lt;^ box '((2,2),(1,1))'</code>343        → <code class="returnvalue">t</code>344       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">345        <code class="type">box</code> <code class="literal">&gt;^</code> <code class="type">box</code>346        → <code class="returnvalue">boolean</code>347       </p>348       <p>349        Is first object above second (allows edges to touch)?350       </p>351       <p>352        <code class="literal">box '((2,2),(1,1))' &gt;^ box '((1,1),(0,0))'</code>353        → <code class="returnvalue">t</code>354       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">355        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">?#</code> <em class="replaceable"><code>geometric_type</code></em>356        → <code class="returnvalue">boolean</code>357       </p>358       <p>359        Do these objects intersect?360        Available for these pairs of types:361        (<code class="type">box</code>, <code class="type">box</code>),362        (<code class="type">lseg</code>, <code class="type">box</code>),363        (<code class="type">lseg</code>, <code class="type">lseg</code>),364        (<code class="type">lseg</code>, <code class="type">line</code>),365        (<code class="type">line</code>, <code class="type">box</code>),366        (<code class="type">line</code>, <code class="type">line</code>),367        (<code class="type">path</code>, <code class="type">path</code>).368       </p>369       <p>370        <code class="literal">lseg '[(-1,0),(1,0)]' ?# box '(2,2),(-2,-2)'</code>371        → <code class="returnvalue">t</code>372       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">373        <code class="literal">?-</code> <code class="type">line</code>374        → <code class="returnvalue">boolean</code>375       </p>376       <p class="func_signature">377        <code class="literal">?-</code> <code class="type">lseg</code>378        → <code class="returnvalue">boolean</code>379       </p>380       <p>381        Is line horizontal?382       </p>383       <p>384        <code class="literal">?- lseg '[(-1,0),(1,0)]'</code>385        → <code class="returnvalue">t</code>386       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">387        <code class="type">point</code> <code class="literal">?-</code> <code class="type">point</code>388        → <code class="returnvalue">boolean</code>389       </p>390       <p>391        Are points horizontally aligned (that is, have same y coordinate)?392       </p>393       <p>394        <code class="literal">point '(1,0)' ?- point '(0,0)'</code>395        → <code class="returnvalue">t</code>396       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">397        <code class="literal">?|</code> <code class="type">line</code>398        → <code class="returnvalue">boolean</code>399       </p>400       <p class="func_signature">401        <code class="literal">?|</code> <code class="type">lseg</code>402        → <code class="returnvalue">boolean</code>403       </p>404       <p>405        Is line vertical?406       </p>407       <p>408        <code class="literal">?| lseg '[(-1,0),(1,0)]'</code>409        → <code class="returnvalue">f</code>410       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">411        <code class="type">point</code> <code class="literal">?|</code> <code class="type">point</code>412        → <code class="returnvalue">boolean</code>413       </p>414       <p>415        Are points vertically aligned (that is, have same x coordinate)?416       </p>417       <p>418        <code class="literal">point '(0,1)' ?| point '(0,0)'</code>419        → <code class="returnvalue">t</code>420       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">421        <code class="type">line</code> <code class="literal">?-|</code> <code class="type">line</code>422        → <code class="returnvalue">boolean</code>423       </p>424       <p class="func_signature">425        <code class="type">lseg</code> <code class="literal">?-|</code> <code class="type">lseg</code>426        → <code class="returnvalue">boolean</code>427       </p>428       <p>429        Are lines perpendicular?430       </p>431       <p>432        <code class="literal">lseg '[(0,0),(0,1)]' ?-| lseg '[(0,0),(1,0)]'</code>433        → <code class="returnvalue">t</code>434       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">435        <code class="type">line</code> <code class="literal">?||</code> <code class="type">line</code>436        → <code class="returnvalue">boolean</code>437       </p>438       <p class="func_signature">439        <code class="type">lseg</code> <code class="literal">?||</code> <code class="type">lseg</code>440        → <code class="returnvalue">boolean</code>441       </p>442       <p>443        Are lines parallel?444       </p>445       <p>446        <code class="literal">lseg '[(-1,0),(1,0)]' ?|| lseg '[(-1,2),(1,2)]'</code>447        → <code class="returnvalue">t</code>448       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">449        <em class="replaceable"><code>geometric_type</code></em> <code class="literal">~=</code> <em class="replaceable"><code>geometric_type</code></em>450        → <code class="returnvalue">boolean</code>451       </p>452       <p>453        Are these objects the same?454        Available for <code class="type">point</code>, <code class="type">box</code>,455        <code class="type">polygon</code>, <code class="type">circle</code>.456       </p>457       <p>458        <code class="literal">polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'</code>459        → <code class="returnvalue">t</code>460       </p></td></tr></tbody><tbody class="footnotes"><tr><td colspan="1"><div id="ftn.FUNCTIONS-GEOMETRY-ROTATION-FN" class="footnote"><p><a href="#FUNCTIONS-GEOMETRY-ROTATION-FN" class="para"><sup class="para">[a] </sup></a><span class="quote">“<span class="quote">Rotating</span>”</span> a461        box with these operators only moves its corner points: the box is462        still considered to have sides parallel to the axes.  Hence the box's463        size is not preserved, as a true rotation would do.</p></div></td></tr></tbody></table></div></div><br class="table-break" /><div class="caution"><h3 class="title">Caution</h3><p>464     Note that the <span class="quote">“<span class="quote">same as</span>”</span> operator, <code class="literal">~=</code>,465     represents the usual notion of equality for the <code class="type">point</code>,466     <code class="type">box</code>, <code class="type">polygon</code>, and <code class="type">circle</code> types.467     Some of the geometric types also have an <code class="literal">=</code> operator, but468     <code class="literal">=</code> compares for equal <span class="emphasis"><em>areas</em></span> only.469     The other scalar comparison operators (<code class="literal">&lt;=</code> and so470     on), where available for these types, likewise compare areas.471    </p></div><div class="note"><h3 class="title">Note</h3><p>472     Before <span class="productname">PostgreSQL</span> 14, the point473     is strictly below/above comparison operators <code class="type">point</code>474     <code class="literal">&lt;&lt;|</code> <code class="type">point</code> and <code class="type">point</code>475     <code class="literal">|&gt;&gt;</code> <code class="type">point</code> were respectively476     called <code class="literal">&lt;^</code> and <code class="literal">&gt;^</code>.  These477     names are still available, but are deprecated and will eventually be478     removed.479    </p></div><div class="table" id="FUNCTIONS-GEOMETRY-FUNC-TABLE"><p class="title"><strong>Table 9.37. Geometric Functions</strong></p><div class="table-contents"><table class="table" summary="Geometric Functions" border="1"><colgroup><col /></colgroup><thead><tr><th class="func_table_entry"><p class="func_signature">480        Function481       </p>482       <p>483        Description484       </p>485       <p>486        Example(s)487       </p></th></tr></thead><tbody><tr><td class="func_table_entry"><p class="func_signature">488        <a id="id-1.5.8.17.6.2.2.1.1.1.1" class="indexterm"></a>489        <code class="function">area</code> ( <em class="replaceable"><code>geometric_type</code></em> )490        → <code class="returnvalue">double precision</code>491       </p>492       <p>493        Computes area.494        Available for <code class="type">box</code>, <code class="type">path</code>, <code class="type">circle</code>.495        A <code class="type">path</code> input must be closed, else NULL is returned.496        Also, if the <code class="type">path</code> is self-intersecting, the result may be497        meaningless.498       </p>499       <p>500        <code class="literal">area(box '(2,2),(0,0)')</code>501        → <code class="returnvalue">4</code>502       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">503        <a id="id-1.5.8.17.6.2.2.2.1.1.1" class="indexterm"></a>504        <code class="function">center</code> ( <em class="replaceable"><code>geometric_type</code></em> )505        → <code class="returnvalue">point</code>506       </p>507       <p>508        Computes center point.509        Available for <code class="type">box</code>, <code class="type">circle</code>.510       </p>511       <p>512        <code class="literal">center(box '(1,2),(0,0)')</code>513        → <code class="returnvalue">(0.5,1)</code>514       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">515        <a id="id-1.5.8.17.6.2.2.3.1.1.1" class="indexterm"></a>516        <code class="function">diagonal</code> ( <code class="type">box</code> )517        → <code class="returnvalue">lseg</code>518       </p>519       <p>520        Extracts box's diagonal as a line segment521        (same as <code class="function">lseg(box)</code>).522       </p>523       <p>524        <code class="literal">diagonal(box '(1,2),(0,0)')</code>525        → <code class="returnvalue">[(1,2),(0,0)]</code>526       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">527        <a id="id-1.5.8.17.6.2.2.4.1.1.1" class="indexterm"></a>528        <code class="function">diameter</code> ( <code class="type">circle</code> )529        → <code class="returnvalue">double precision</code>530       </p>531       <p>532        Computes diameter of circle.533       </p>534       <p>535        <code class="literal">diameter(circle '&lt;(0,0),2&gt;')</code>536        → <code class="returnvalue">4</code>537       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">538        <a id="id-1.5.8.17.6.2.2.5.1.1.1" class="indexterm"></a>539        <code class="function">height</code> ( <code class="type">box</code> )540        → <code class="returnvalue">double precision</code>541       </p>542       <p>543        Computes vertical size of box.544       </p>545       <p>546        <code class="literal">height(box '(1,2),(0,0)')</code>547        → <code class="returnvalue">2</code>548       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">549        <a id="id-1.5.8.17.6.2.2.6.1.1.1" class="indexterm"></a>550        <code class="function">isclosed</code> ( <code class="type">path</code> )551        → <code class="returnvalue">boolean</code>552       </p>553       <p>554        Is path closed?555       </p>556       <p>557        <code class="literal">isclosed(path '((0,0),(1,1),(2,0))')</code>558        → <code class="returnvalue">t</code>559       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">560        <a id="id-1.5.8.17.6.2.2.7.1.1.1" class="indexterm"></a>561        <code class="function">isopen</code> ( <code class="type">path</code> )562        → <code class="returnvalue">boolean</code>563       </p>564       <p>565        Is path open?566       </p>567       <p>568        <code class="literal">isopen(path '[(0,0),(1,1),(2,0)]')</code>569        → <code class="returnvalue">t</code>570       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">571        <a id="id-1.5.8.17.6.2.2.8.1.1.1" class="indexterm"></a>572        <code class="function">length</code> ( <em class="replaceable"><code>geometric_type</code></em> )573        → <code class="returnvalue">double precision</code>574       </p>575       <p>576        Computes the total length.577        Available for <code class="type">lseg</code>, <code class="type">path</code>.578       </p>579       <p>580        <code class="literal">length(path '((-1,0),(1,0))')</code>581        → <code class="returnvalue">4</code>582       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">583        <a id="id-1.5.8.17.6.2.2.9.1.1.1" class="indexterm"></a>584        <code class="function">npoints</code> ( <em class="replaceable"><code>geometric_type</code></em> )585        → <code class="returnvalue">integer</code>586       </p>587       <p>588        Returns the number of points.589        Available for <code class="type">path</code>, <code class="type">polygon</code>.590       </p>591       <p>592        <code class="literal">npoints(path '[(0,0),(1,1),(2,0)]')</code>593        → <code class="returnvalue">3</code>594       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">595        <a id="id-1.5.8.17.6.2.2.10.1.1.1" class="indexterm"></a>596        <code class="function">pclose</code> ( <code class="type">path</code> )597        → <code class="returnvalue">path</code>598       </p>599       <p>600        Converts path to closed form.601       </p>602       <p>603        <code class="literal">pclose(path '[(0,0),(1,1),(2,0)]')</code>604        → <code class="returnvalue">((0,0),(1,1),(2,0))</code>605       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">606        <a id="id-1.5.8.17.6.2.2.11.1.1.1" class="indexterm"></a>607        <code class="function">popen</code> ( <code class="type">path</code> )608        → <code class="returnvalue">path</code>609       </p>610       <p>611        Converts path to open form.612       </p>613       <p>614        <code class="literal">popen(path '((0,0),(1,1),(2,0))')</code>615        → <code class="returnvalue">[(0,0),(1,1),(2,0)]</code>616       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">617        <a id="id-1.5.8.17.6.2.2.12.1.1.1" class="indexterm"></a>618        <code class="function">radius</code> ( <code class="type">circle</code> )619        → <code class="returnvalue">double precision</code>620       </p>621       <p>622        Computes radius of circle.623       </p>624       <p>625        <code class="literal">radius(circle '&lt;(0,0),2&gt;')</code>626        → <code class="returnvalue">2</code>627       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">628        <a id="id-1.5.8.17.6.2.2.13.1.1.1" class="indexterm"></a>629        <code class="function">slope</code> ( <code class="type">point</code>, <code class="type">point</code> )630        → <code class="returnvalue">double precision</code>631       </p>632       <p>633        Computes slope of a line drawn through the two points.634       </p>635       <p>636        <code class="literal">slope(point '(0,0)', point '(2,1)')</code>637        → <code class="returnvalue">0.5</code>638       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">639        <a id="id-1.5.8.17.6.2.2.14.1.1.1" class="indexterm"></a>640        <code class="function">width</code> ( <code class="type">box</code> )641        → <code class="returnvalue">double precision</code>642       </p>643       <p>644        Computes horizontal size of box.645       </p>646       <p>647        <code class="literal">width(box '(1,2),(0,0)')</code>648        → <code class="returnvalue">1</code>649       </p></td></tr></tbody></table></div></div><br class="table-break" /><div class="table" id="FUNCTIONS-GEOMETRY-CONV-TABLE"><p class="title"><strong>Table 9.38. Geometric Type Conversion Functions</strong></p><div class="table-contents"><table class="table" summary="Geometric Type Conversion Functions" border="1"><colgroup><col /></colgroup><thead><tr><th class="func_table_entry"><p class="func_signature">650        Function651       </p>652       <p>653        Description654       </p>655       <p>656        Example(s)657       </p></th></tr></thead><tbody><tr><td class="func_table_entry"><p class="func_signature">658        <a id="id-1.5.8.17.7.2.2.1.1.1.1" class="indexterm"></a>659        <code class="function">box</code> ( <code class="type">circle</code> )660        → <code class="returnvalue">box</code>661       </p>662       <p>663        Computes box inscribed within the circle.664       </p>665       <p>666        <code class="literal">box(circle '&lt;(0,0),2&gt;')</code>667        → <code class="returnvalue">(1.414213562373095,1.414213562373095),​(-1.414213562373095,-1.414213562373095)</code>668       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">669        <code class="function">box</code> ( <code class="type">point</code> )670        → <code class="returnvalue">box</code>671       </p>672       <p>673        Converts point to empty box.674       </p>675       <p>676        <code class="literal">box(point '(1,0)')</code>677        → <code class="returnvalue">(1,0),(1,0)</code>678       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">679        <code class="function">box</code> ( <code class="type">point</code>, <code class="type">point</code> )680        → <code class="returnvalue">box</code>681       </p>682       <p>683        Converts any two corner points to box.684       </p>685       <p>686        <code class="literal">box(point '(0,1)', point '(1,0)')</code>687        → <code class="returnvalue">(1,1),(0,0)</code>688       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">689        <code class="function">box</code> ( <code class="type">polygon</code> )690        → <code class="returnvalue">box</code>691       </p>692       <p>693        Computes bounding box of polygon.694       </p>695       <p>696        <code class="literal">box(polygon '((0,0),(1,1),(2,0))')</code>697        → <code class="returnvalue">(2,1),(0,0)</code>698       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">699        <a id="id-1.5.8.17.7.2.2.5.1.1.1" class="indexterm"></a>700        <code class="function">bound_box</code> ( <code class="type">box</code>, <code class="type">box</code> )701        → <code class="returnvalue">box</code>702       </p>703       <p>704        Computes bounding box of two boxes.705       </p>706       <p>707        <code class="literal">bound_box(box '(1,1),(0,0)', box '(4,4),(3,3)')</code>708        → <code class="returnvalue">(4,4),(0,0)</code>709       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">710        <a id="id-1.5.8.17.7.2.2.6.1.1.1" class="indexterm"></a>711        <code class="function">circle</code> ( <code class="type">box</code> )712        → <code class="returnvalue">circle</code>713       </p>714       <p>715        Computes smallest circle enclosing box.716       </p>717       <p>718        <code class="literal">circle(box '(1,1),(0,0)')</code>719        → <code class="returnvalue">&lt;(0.5,0.5),0.7071067811865476&gt;</code>720       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">721        <code class="function">circle</code> ( <code class="type">point</code>, <code class="type">double precision</code> )722        → <code class="returnvalue">circle</code>723       </p>724       <p>725        Constructs circle from center and radius.726       </p>727       <p>728        <code class="literal">circle(point '(0,0)', 2.0)</code>729        → <code class="returnvalue">&lt;(0,0),2&gt;</code>730       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">731        <code class="function">circle</code> ( <code class="type">polygon</code> )732        → <code class="returnvalue">circle</code>733       </p>734       <p>735        Converts polygon to circle.  The circle's center is the mean of the736        positions of the polygon's points, and the radius is the average737        distance of the polygon's points from that center.738       </p>739       <p>740        <code class="literal">circle(polygon '((0,0),(1,3),(2,0))')</code>741        → <code class="returnvalue">&lt;(1,1),1.6094757082487299&gt;</code>742       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">743        <a id="id-1.5.8.17.7.2.2.9.1.1.1" class="indexterm"></a>744        <code class="function">line</code> ( <code class="type">point</code>, <code class="type">point</code> )745        → <code class="returnvalue">line</code>746       </p>747       <p>748        Converts two points to the line through them.749       </p>750       <p>751        <code class="literal">line(point '(-1,0)', point '(1,0)')</code>752        → <code class="returnvalue">{0,-1,0}</code>753       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">754        <a id="id-1.5.8.17.7.2.2.10.1.1.1" class="indexterm"></a>755        <code class="function">lseg</code> ( <code class="type">box</code> )756        → <code class="returnvalue">lseg</code>757       </p>758       <p>759        Extracts box's diagonal as a line segment.760       </p>761       <p>762        <code class="literal">lseg(box '(1,0),(-1,0)')</code>763        → <code class="returnvalue">[(1,0),(-1,0)]</code>764       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">765        <code class="function">lseg</code> ( <code class="type">point</code>, <code class="type">point</code> )766        → <code class="returnvalue">lseg</code>767       </p>768       <p>769        Constructs line segment from two endpoints.770       </p>771       <p>772        <code class="literal">lseg(point '(-1,0)', point '(1,0)')</code>773        → <code class="returnvalue">[(-1,0),(1,0)]</code>774       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">775        <a id="id-1.5.8.17.7.2.2.12.1.1.1" class="indexterm"></a>776        <code class="function">path</code> ( <code class="type">polygon</code> )777        → <code class="returnvalue">path</code>778       </p>779       <p>780        Converts polygon to a closed path with the same list of points.781       </p>782       <p>783        <code class="literal">path(polygon '((0,0),(1,1),(2,0))')</code>784        → <code class="returnvalue">((0,0),(1,1),(2,0))</code>785       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">786        <a id="id-1.5.8.17.7.2.2.13.1.1.1" class="indexterm"></a>787        <code class="function">point</code> ( <code class="type">double precision</code>, <code class="type">double precision</code> )788        → <code class="returnvalue">point</code>789       </p>790       <p>791        Constructs point from its coordinates.792       </p>793       <p>794        <code class="literal">point(23.4, -44.5)</code>795        → <code class="returnvalue">(23.4,-44.5)</code>796       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">797        <code class="function">point</code> ( <code class="type">box</code> )798        → <code class="returnvalue">point</code>799       </p>800       <p>801        Computes center of box.802       </p>803       <p>804        <code class="literal">point(box '(1,0),(-1,0)')</code>805        → <code class="returnvalue">(0,0)</code>806       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">807        <code class="function">point</code> ( <code class="type">circle</code> )808        → <code class="returnvalue">point</code>809       </p>810       <p>811        Computes center of circle.812       </p>813       <p>814        <code class="literal">point(circle '&lt;(0,0),2&gt;')</code>815        → <code class="returnvalue">(0,0)</code>816       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">817        <code class="function">point</code> ( <code class="type">lseg</code> )818        → <code class="returnvalue">point</code>819       </p>820       <p>821        Computes center of line segment.822       </p>823       <p>824        <code class="literal">point(lseg '[(-1,0),(1,0)]')</code>825        → <code class="returnvalue">(0,0)</code>826       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">827        <code class="function">point</code> ( <code class="type">polygon</code> )828        → <code class="returnvalue">point</code>829       </p>830       <p>831        Computes center of polygon (the mean of the832        positions of the polygon's points).833       </p>834       <p>835        <code class="literal">point(polygon '((0,0),(1,1),(2,0))')</code>836        → <code class="returnvalue">(1,0.3333333333333333)</code>837       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">838        <a id="id-1.5.8.17.7.2.2.18.1.1.1" class="indexterm"></a>839        <code class="function">polygon</code> ( <code class="type">box</code> )840        → <code class="returnvalue">polygon</code>841       </p>842       <p>843        Converts box to a 4-point polygon.844       </p>845       <p>846        <code class="literal">polygon(box '(1,1),(0,0)')</code>847        → <code class="returnvalue">((0,0),(0,1),(1,1),(1,0))</code>848       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">849        <code class="function">polygon</code> ( <code class="type">circle</code> )850        → <code class="returnvalue">polygon</code>851       </p>852       <p>853        Converts circle to a 12-point polygon.854       </p>855       <p>856        <code class="literal">polygon(circle '&lt;(0,0),2&gt;')</code>857        → <code class="returnvalue">((-2,0),​(-1.7320508075688774,0.9999999999999999),​(-1.0000000000000002,1.7320508075688772),​(-1.2246063538223773e-16,2),​(0.9999999999999996,1.7320508075688774),​(1.732050807568877,1.0000000000000007),​(2,2.4492127076447545e-16),​(1.7320508075688776,-0.9999999999999994),​(1.0000000000000009,-1.7320508075688767),​(3.673819061467132e-16,-2),​(-0.9999999999999987,-1.732050807568878),​(-1.7320508075688767,-1.0000000000000009))</code>858       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">859        <code class="function">polygon</code> ( <code class="type">integer</code>, <code class="type">circle</code> )860        → <code class="returnvalue">polygon</code>861       </p>862       <p>863        Converts circle to an <em class="replaceable"><code>n</code></em>-point polygon.864       </p>865       <p>866        <code class="literal">polygon(4, circle '&lt;(3,0),1&gt;')</code>867        → <code class="returnvalue">((2,0),​(3,1),​(4,1.2246063538223773e-16),​(3,-1))</code>868       </p></td></tr><tr><td class="func_table_entry"><p class="func_signature">869        <code class="function">polygon</code> ( <code class="type">path</code> )870        → <code class="returnvalue">polygon</code>871       </p>872       <p>873        Converts closed path to a polygon with the same list of points.874       </p>875       <p>876        <code class="literal">polygon(path '((0,0),(1,1),(2,0))')</code>877        → <code class="returnvalue">((0,0),(1,1),(2,0))</code>878       </p></td></tr></tbody></table></div></div><br class="table-break" /><p>879     It is possible to access the two component numbers of a <code class="type">point</code>880     as though the point were an array with indexes 0 and 1.  For example, if881     <code class="literal">t.p</code> is a <code class="type">point</code> column then882     <code class="literal">SELECT p[0] FROM t</code> retrieves the X coordinate and883     <code class="literal">UPDATE t SET p[1] = ...</code> changes the Y coordinate.884     In the same way, a value of type <code class="type">box</code> or <code class="type">lseg</code> can be treated885     as an array of two <code class="type">point</code> values.886    </p></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="functions-enum.html" title="9.10. Enum Support Functions">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="functions.html" title="Chapter 9. Functions and Operators">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="functions-net.html" title="9.12. Network Address Functions and Operators">Next</a></td></tr><tr><td width="40%" align="left" valign="top">9.10. Enum Support Functions </td><td width="20%" align="center"><a accesskey="h" href="index.html" title="PostgreSQL 16.3 Documentation">Home</a></td><td width="40%" align="right" valign="top"> 9.12. Network Address Functions and Operators</td></tr></table></div></body></html>
codekingpro/portable-devtools · Team Ai