PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ vector_rotate()

void vector_rotate ( const POINT3D v1,
const POINT3D v2,
double  angle,
POINT3D n 
)

Rotates v1 through an angle (in radians) within the plane defined by v1/v2, returns the rotated vector in n.

Definition at line 569 of file lwgeodetic.c.

References normalize(), unit_normal(), POINT3D::x, POINT3D::y, and POINT3D::z.

Referenced by test_vector_rotate().

570 {
571  POINT3D u;
572  double cos_a = cos(angle);
573  double sin_a = sin(angle);
574  double uxuy, uyuz, uxuz;
575  double ux2, uy2, uz2;
576  double rxx, rxy, rxz, ryx, ryy, ryz, rzx, rzy, rzz;
577 
578  /* Need a unit vector normal to rotate around */
579  unit_normal(v1, v2, &u);
580 
581  uxuy = u.x * u.y;
582  uxuz = u.x * u.z;
583  uyuz = u.y * u.z;
584 
585  ux2 = u.x * u.x;
586  uy2 = u.y * u.y;
587  uz2 = u.z * u.z;
588 
589  rxx = cos_a + ux2 * (1 - cos_a);
590  rxy = uxuy * (1 - cos_a) - u.z * sin_a;
591  rxz = uxuz * (1 - cos_a) + u.y * sin_a;
592 
593  ryx = uxuy * (1 - cos_a) + u.z * sin_a;
594  ryy = cos_a + uy2 * (1 - cos_a);
595  ryz = uyuz * (1 - cos_a) - u.x * sin_a;
596 
597  rzx = uxuz * (1 - cos_a) - u.y * sin_a;
598  rzy = uyuz * (1 - cos_a) + u.x * sin_a;
599  rzz = cos_a + uz2 * (1 - cos_a);
600 
601  n->x = rxx * v1->x + rxy * v1->y + rxz * v1->z;
602  n->y = ryx * v1->x + ryy * v1->y + ryz * v1->z;
603  n->z = rzx * v1->x + rzy * v1->y + rzz * v1->z;
604 
605  normalize(n);
606 }
void normalize(POINT3D *p)
Normalize to a unit vector.
Definition: lwgeodetic.c:611
double y
Definition: liblwgeom.h:340
double x
Definition: liblwgeom.h:340
double z
Definition: liblwgeom.h:340
void unit_normal(const POINT3D *P1, const POINT3D *P2, POINT3D *normal)
Calculates the unit normal to two vectors, trying to avoid problems with over-narrow or over-wide cas...
Definition: lwgeodetic.c:537
Here is the call graph for this function:
Here is the caller graph for this function: