ST_Affine

对meshgeom和sfmesh对象应用给定的仿射变换。

语法

meshgeom ST_Affine(meshgeom geom,float a,float b,float c,float d, float e,float f,float g,float h,float i, float xoff, float yoff,float zoff*);*
meshgeom ST_Affine(meshgeom geom, float[] p);
sfmesh ST_Affine(sfmesh sfmesh,float a,float b,float c,float d, float e,float f,float g,float h,float i, float xoff, float yoff,float zoff);
sfmesh ST_Affine(sfmesh sfmesh, float[] p);
sfmesh ST_Affine(float8[] p, float8[] p2);

参数

参数名称

描述

geom

meshgeom对象。

sfmeshObject

sfmesh对象。

a-i

参数值。

xoff

x偏移量。

yoff

y偏移量。

zoff

z偏移量。

p

16个仿射变换参数矩阵。

p2

16 个仿射变换参数矩阵

描述

  • ST_Affine生成仿射变换矩阵。

    / a b c xoff \
     | d e f yoff |
     | g h i zoff |
    \ 0 0 0   1 /
    / p[1]   p[2]  p[3]   p[4] \
     | p[5] p[6]  p[7]   p[8]  |
     | p[9]  p[10] p[11]  p[12] |
    \ p[13] p[14] p[15]  p[16] /
  • 对meshgeom和sfmesh对象的所有坐标点执行以下处理。

    x' = a*x + b*y + c*z + xoff
    y' = d*x + e*y + f*z + yoff
    z' = g*x + h*y + i*z + zoff
    x' = p[1]*x + p[2]*y + p[3]*z + p[4]
    y' = p[5]*x + p[6]*y + p[7]*z + p[8]
    z' = p[9]*x + p[10]*y + p[11]*z + p[12]

示例

select ST_asText(ST_Affine('MESHGEOM(PATCH(INDEXSURFACE(VERTEX(0 0,0 10,10 10,10 0), INDEX((0,1,2),(1,2,3)))))'::meshgeom,  cos(pi()), -sin(pi()), 0,  sin(pi()), cos(pi()), 0,  0, 0, 1,  0, 0, 0));

----------------------------------------------------------------------
 MESHGEOM(PATCH(INDEXSURFACE(VERTEX(0 0,0 -10,-10 -10,-10 0),INDEX((0,1,2),(1,2,3)))))

-- float array
select ST_asText(ST_Affine('MESHGEOM(PATCH(INDEXSURFACE(VERTEX(0 0,0 10,10 10,10 0), INDEX((0,1,2),(1,2,3)))))'::meshgeom,  ARRAY[cos(pi()), -sin(pi()), 0, 0,
sin(pi()), cos(pi()), 0, 0,
0, 0, 1, 0,
0, 0, 0, 0]::float8[]));

----------------------------------------------------------------------
 MESHGEOM(PATCH(INDEXSURFACE(VERTEX(0 0,0 -10,-10 -10,-10 0),INDEX((0,1,2),(1,2,3)))))

-- float array Affine float array
select st_affine('{-0.3583679495453059,-0.9335804264971996,0,72.60910593620417,0.9335804264971996,-0.3583679495453059,0,82.98262879309624,0,0,1,96.52,0,0,0,1}'::float8[], '{-0.3583679495453059,-0.9335804264971996,0,63.25570597150741,0.9335804264971996,-0.3583679495453059,0,107.3490699956786,0,0,1,87.92,0,0,0,1}'::float8[]);

----------------------------------------------------------------------
{-0.743144825477386,0.669130606358867,0,-50.2787022604891,-0.669130606358867,-0.743144825477386,0,103.566451652411,0,0,1,184.44,0,0,0,1}