GRASS GIS 8 Programmer's Manual 8.2.1(2023)-exported
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 */
35void 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 */
62void 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}
#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
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