GRASS GIS 8 Programmer's Manual 8.4.1(2025)-45ca3179ab
Loading...
Searching...
No Matches
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 * \brief Rotate point (double version)
23 *
24 * Given a point, angle, and origin, rotate the point around the origin
25 * by the given angle. Coordinates and results are double prec floating point.
26 *
27 * \param X0 X component of origin (center of circle)
28 * \param Y0 Y component of origin (center of circle)
29 * \param[out] X1 X component of point to be rotated (variable is modified!)
30 * \param[out] Y1 Y component of point to be rotated (variable is modified!)
31 * \param angle in degrees, measured CCW from east
32 */
33void G_rotate_around_point(double X0, double Y0, double *X1, double *Y1,
34 double angle)
35{
36 double dx = *X1 - X0;
37 double dy = *Y1 - Y0;
38 double c = cos(D2R(angle));
39 double s = sin(D2R(angle));
40 double dx1 = dx * c - dy * s;
41 double dy1 = dx * s + dy * c;
42
43 *X1 = X0 + dx1;
44 *Y1 = Y0 + dy1;
45}
46
47/*!
48 * \brief Rotate point (int version)
49 *
50 * Given a point, angle, and origin, rotate the point around the origin
51 * by the given angle. Coordinates are given in integer and results are rounded
52 * back to integer.
53 *
54 * \param X0 X component of origin (center of circle)
55 * \param Y0 Y component of origin (center of circle)
56 * \param[out] X1 X component of point to be rotated (variable is modified!)
57 * \param[out] Y1 Y component of point to be rotated (variable is modified!)
58 * \param angle in degrees, measured CCW from east
59 */
60void G_rotate_around_point_int(int X0, int Y0, int *X1, int *Y1, double angle)
61{
62 double x = (double)*X1;
63 double y = (double)*Y1;
64
65 if (angle == 0.0)
66 return;
67
68 G_rotate_around_point((double)X0, (double)Y0, &x, &y, angle);
69
70 *X1 = (int)floor(x + 0.5);
71 *Y1 = (int)floor(y + 0.5);
72}
#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:60
void G_rotate_around_point(double X0, double Y0, double *X1, double *Y1, double angle)
Rotate point (double version)
Definition rotate.c:33
#define x