GRASS 8 Programmer's Manual
8.6.0dev(2026)-ddeab64dbf
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
*/
33
void
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
*/
60
void
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
}
AMI_STREAM
Definition
ami_stream.h:153
D2R
#define D2R(d)
Definition
rotate.c:18
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:60
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:33
x
#define x
lib
gis
rotate.c
Generated on Sun Apr 5 2026 06:59:57 for GRASS 8 Programmer's Manual by
1.9.8