GRASS GIS 7 Programmer's Manual
7.8.4(2020)-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
*/
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
}
x
#define x
D2R
#define D2R(d)
Definition:
rotate.c:18
G_rotate_around_point
void G_rotate_around_point(double X0, double Y0, double *X1, double *Y1, double angle)
Rotate point (double version)
Definition:
rotate.c:35
G_rotate_around_point_int
void G_rotate_around_point_int(int X0, int Y0, int *X1, int *Y1, double angle)
Rotate point (int version)
Definition:
rotate.c:62
gis
rotate.c
Generated on Mon Oct 5 2020 08:56:03 for GRASS GIS 7 Programmer's Manual by
1.8.20