gpt4 book ai didi

sql - 缩放运算符 (*) 在 PostgreSQL 中如何工作?

转载 作者:太空狗 更新时间:2023-10-30 01:56:58 25 4
gpt4 key购买 nike

我刚开始学习 PostgreSQL,我不知道缩放运算符如何处理几何类型。

例如 select '((1, 1), (0, 0))'::box * '(2, 0)'::point; 返回 ((2 ,2),(0,0))

选择'((1, 1), (0, 0))'::box * '(0, 2)'::point;返回((0, 2),(-2,0))

所以在这两种情况下,框都按 2 倍缩放(对于两个轴),但是框移动的方式对我来说毫无意义。

Official documentation仅展示了该运算符的一个用法示例,并未说明其工作原理。

如果有人知道学习 PostgreSQL 的更好资源,请分享。

提前致谢。

最佳答案

这里是函数 box_mul 的实现留在*(box, point)后面运算符(来自 https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/geo_ops.c ):

static inline void
point_mul_point(Point *result, Point *pt1, Point *pt2)
{
point_construct(result,
float8_mi(float8_mul(pt1->x, pt2->x),
float8_mul(pt1->y, pt2->y)),
float8_pl(float8_mul(pt1->x, pt2->y),
float8_mul(pt1->y, pt2->x)));
}

Datum
box_mul(PG_FUNCTION_ARGS)
{
BOX *box = PG_GETARG_BOX_P(0);
Point *p = PG_GETARG_POINT_P(1);
BOX *result;
Point high,
low;

result = (BOX *) palloc(sizeof(BOX));

point_mul_point(&high, &box->high, p);
point_mul_point(&low, &box->low, p);

box_construct(result, &high, &low);

PG_RETURN_BOX_P(result);
}

或翻译成更“人性化”的语言:

((x<sub>1</sub>, y<sub>1</sub>), (x<sub>2</sub>, y<sub>2</sub>)) * (x, y) :- ((x<sub>1</sub>*x - y<sub>1</sub>*y, x<sub>1</sub>*y + y<sub>1</sub>*x), (x<sub>2</sub>*x - y<sub>2</sub>*y, x<sub>2</sub>*y + y<sub>2</sub>*x))

以你为例

((1,1),(0,0)) * (0,2) = ((1*0 - 1*2, 1*2 + 1*0), (0*0 - 0*2, 0*2 + 0 * 0)) = ((-2,2),(0,0))

最后是 box_construct()将其转换为 (0,2),(-2,0) (只需检查 select '((-2,2),(0,0))'::box; )

如果您知道/记得这些变换的几何意义 - 请在此处发布您的最终答案。

关于sql - 缩放运算符 (*) 在 PostgreSQL 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52066345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com