From 1cc34640cabcb32b4f062673cce1d6b1819d492d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 22 Apr 2020 21:32:38 -0400 Subject: [PATCH] Doc: improve description of geometric multiplication/division. David Johnston reminded me that the per-point calculations being done by these operators are equivalent to complex multiplication/division. (Once I would've recognized that immediately, but it's been too long since I did any of that sort of math.) Also put in a footnote mentioning that "rotation" of a box doesn't do what you might expect, as I'd griped about in the referenced thread. Discussion: https://postgr.es/m/158110996889.1089.4224139874633222837@wrigleys.postgresql.org --- doc/src/sgml/func.sgml | 46 ++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 90a2582dfd1..63b870de048 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -9506,21 +9506,19 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple geometric_type Multiplies each point of the first argument by the second - pointFor this purpose, the - product of two points - (x1,y1) and - (x2,y2) is - defined as - (x1*x2 - - y1*y2, - x1*y2 + - y1*x2).. - Interpreting the point as a vector, this is equivalent to + point (treating a point as being a complex number + represented by real and imaginary parts, and performing standard + complex multiplication). If one interprets + the second point as a vector, this is equivalent to scaling the object's size and distance from the origin by the length of the vector, and rotating it counterclockwise around the origin by the vector's angle from the x axis. - Available for point, box, path, - circle. + Available for point, box,Rotating a + box with these operators only moves its corner points: the box is + still considered to have sides parallel to the axes. Hence the box's + size is not preserved, as a true rotation would do. + path, circle. path '((0,0),(1,0),(1,1))' * point '(3.0,0)' ((0,0),(3,0),(3,3)) @@ -9535,26 +9533,16 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple geometric_type / point geometric_type - Divides each point of the first argument by the - second pointFor this purpose, the - quotient of two points - (x1,y1) and - (x2,y2) is - defined as - ((x1*x2 + - y1*y2) / - L, - (y1*x2 - - x1*y2) / - L), - where L = - x2*x2 + - y2*y2.. - Interpreting the point as a vector, this is equivalent to + Divides each point of the first argument by the second + point (treating a point as being a complex number + represented by real and imaginary parts, and performing standard + complex division). If one interprets + the second point as a vector, this is equivalent to scaling the object's size and distance from the origin down by the length of the vector, and rotating it clockwise around the origin by the vector's angle from the x axis. - Available for point, box, path, + Available for point, box, path, circle. path '((0,0),(1,0),(1,1))' / point '(2.0,0)'