GRASS GIS 8 Programmer's Manual  8.2.2dev(2023)-3d2c704037
rotate.c
Go to the documentation of this file.
1 /*!
2  * \file lib/gis/rotate.c
3  *
4  * \brief GIS Library - rotate
5  *
6  * (C) 2001-2014 by the GRASS Development Team
7  *
8  * This program is free software under the GNU General Public
9  * License (>=v2). Read the file COPYING that comes with GRASS
10  * for details.
11  *
12  * \author Hamish Bowman, Glynn Clements
13  */
14 
15 #include <math.h>
16 
17 # define RpD ((2 * M_PI) / 360.) /* radians/degree */
18 # define D2R(d) (double)(d * RpD) /* degrees->radians */
19 # define R2D(d) (double)(d / RpD) /* radians->degrees */
20 
21 
22 
23 /*!
24  * \brief Rotate point (double version)
25  *
26  * Given a point, angle, and origin, rotate the point around the origin
27  * by the given angle. Coordinates and results are double prec floating point.
28  *
29  * \param X0 X component of origin (center of circle)
30  * \param Y0 Y component of origin (center of circle)
31  * \param[out] X1 X component of point to be rotated (variable is modified!)
32  * \param[out] Y1 Y component of point to be rotated (variable is modified!)
33  * \param angle in degrees, measured CCW from east
34  */
35 void G_rotate_around_point(double X0, double Y0, double *X1, double *Y1,
36  double angle)
37 {
38  double dx = *X1 - X0;
39  double dy = *Y1 - Y0;
40  double c = cos(D2R(angle));
41  double s = sin(D2R(angle));
42  double dx1 = dx * c - dy * s;
43  double dy1 = dx * s + dy * c;
44 
45  *X1 = X0 + dx1;
46  *Y1 = Y0 + dy1;
47 }
48 
49 /*!
50  * \brief Rotate point (int version)
51  *
52  * Given a point, angle, and origin, rotate the point around the origin
53  * by the given angle. Coordinates are given in integer and results are rounded
54  * back to integer.
55  *
56  * \param X0 X component of origin (center of circle)
57  * \param Y0 Y component of origin (center of circle)
58  * \param[out] X1 X component of point to be rotated (variable is modified!)
59  * \param[out] Y1 Y component of point to be rotated (variable is modified!)
60  * \param angle in degrees, measured CCW from east
61  */
62 void G_rotate_around_point_int(int X0, int Y0, int *X1, int *Y1, double angle)
63 {
64  double x = (double)*X1;
65  double y = (double)*Y1;
66 
67  if (angle == 0.0)
68  return;
69 
70  G_rotate_around_point((double)X0, (double)Y0, &x, &y, angle);
71 
72  *X1 = (int)floor(x + 0.5);
73  *Y1 = (int)floor(y + 0.5);
74 }
void G_rotate_around_point(double X0, double Y0, double *X1, double *Y1, double angle)
Rotate point (double version)
Definition: rotate.c:35
#define x
#define D2R(d)
Definition: rotate.c:18
void G_rotate_around_point_int(int X0, int Y0, int *X1, int *Y1, double angle)
Rotate point (int version)
Definition: rotate.c:62