# [postgis-users] ST_RotateX with pointOrigin!

Bob and Deb bobdebm at gmail.com
Sat Dec 14 22:56:59 PST 2013

```So you don't like to do linear algebra? :-)  Well, you might be interested
in using Quaternion math for your rotations.  You can even do rotations on
an arbitrary axis. Take a look at this:  http://3dgep.com/?p=1815

-Bob
On Dec 14, 2013 7:57 PM, "Stephen Mather" <stephen at smathermather.com> wrote:

> Ahem-- bugs fixed:
>
> -- Function: st_rotatex(geometry, double precision, geometry)
> CREATE OR REPLACE FUNCTION ST_RotateX(geomA geometry, rotRadians
> double precision, pointOrigin geometry)
>   RETURNS geometry AS
> \$BODY\$
>
> ----- Transform geometry to nullsville (0,0,0) so rotRadians will take
> place around the pointOrigin
> WITH transformed AS (
>     SELECT ST_Translate(geomA, -1 * ST_X(pointOrigin), -1 *
> ST_Y(pointOrigin), -1 * ST_Z(pointOrigin)) AS the_geom
>     ),
> ----- Rotate in place
> rotated AS (
>     SELECT ST_RotateX(the_geom, rotRadians) AS the_geom FROM transformed
>     ),
> ----- Translate back home
> rotTrans AS (
>     SELECT ST_Translate(the_geom, ST_X(pointOrigin),
> ST_Y(pointOrigin), ST_Z(pointOrigin)) AS the_geom
>     FROM rotated
>     )
> ----- profit
> SELECT the_geom from rotTrans
>
> ;
>
> \$BODY\$
>   LANGUAGE sql VOLATILE
>   COST 100;
>
>
> On Sat, Dec 14, 2013 at 8:37 PM, Stephen Mather
> <stephen at smathermather.com> wrote:
> > Hi All,
> >
> > I think I avoided doing linear algebra, which is good since I never
> > studied it... .
> >
> > This is my cludgy patch for making a version of
> >
> > geometry ST_RotateX(geometry geomA, float rotRadians, geometry
> pointOrigin)
> >
> > It's not pretty enough to be a real patch ('cause my brain couldn't do
> > that whole linear algebra thing, and hence why it's here and not the
> > developers list), but thought I'd share it anyway and get impressions,
> > and have some brighter minds make sure I don't have some major logic
> > failure here:
> >
> > -------
> >
> > DROP FUNCTION st_rotatex(geometry,double precision,geometry);
> >
> > CREATE OR REPLACE FUNCTION ST_RotateX(geomA geometry, rotRadians
> > double precision, pointOrigin geometry)
> >   RETURNS geometry AS
> > \$BODY\$
> >
> > ----- Transform geometry to nullsville (0,0,0) so rotRadians will take
> > place around the pointOrigin
> > WITH transformed AS (
> >     SELECT ST_Translate(geomA, -1 * ST_X(pointOrigin), -1 *
> > ST_Y(pointOrigin), -1 * ST_Z(pointOrigin)) AS the_geom
> >     ),
> > ----- Rotate in place
> > rotated AS (
> >     SELECT ST_RotateX(the_geom, rotRadians) FROM transformed
> >     ),
> > ----- Translate back home
> > rotTrans AS (
> >     SELECT ST_Translate(geomA, ST_X(pointOrigin), ST_Y(pointOrigin),
> > ST_Z(pointOrigin)) AS the_geom
> >     )
> > ----- profit
> > SELECT the_geom from rotTrans
> >
> > ;
> >
> > \$BODY\$
> >   LANGUAGE sql VOLATILE
> >   COST 100;
> _______________________________________________
> postgis-users mailing list
> postgis-users at lists.osgeo.org
> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20131214/abe8b9b4/attachment.html>
```