Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_radian.h
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2011 Silvio Heinrich <plassy@web.de>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#ifndef H_KIS_RADIAN_H
8#define H_KIS_RADIAN_H
9
10#include <cmath>
11
12#define PI 3.14159265358979323846
13#define PI2 6.28318530717958647693 // PI * 2.0
14#define TO_DEG 57.2957795130823208768 // 180.0 / PI
15#define TO_RAD 0.01745329251994329577 // PI / 180.0
16#define RAD_360 6.28318530717958647693 // 360 = 2.0*PI
17#define RAD_270 4.71238898038468985769 // 270° = 3.0*PI / 2.0
18#define RAD_180 3.14159265358979323846 // 180° = PI
19#define RAD_90 1.57079632679489661923 // 90° = PI/2.0
20
21
22template<class TReal> class KisRadian;
23
24namespace _Private
25{
26struct Value
27{
28 template<class T>
29 inline static const T& get(const T& value) { return value; }
30
31 template<class T>
32 inline static const T& get(const KisRadian<T>& rad) { return rad.value(); }
33};
34}
35
36template<class TReal>
38{
39public:
40
42 m_value(TReal(0)) { }
43
44 template<class U>
46 m_value(rad.m_value) { }
47
48 template<class U>
49 KisRadian(const U& rad) {
51 }
52
53 static TReal normalizeRadians(TReal rad) {
54 rad = std::fmod((TReal)rad, (TReal)PI2);
55 return rad < TReal(0) ? (rad + PI2) : rad;
56 }
57
58 static TReal normalizeDegrees(TReal deg) {
59 deg = std::fmod(deg, TReal(360));
60 return deg < TReal(0) ? (deg + TReal(360)) : deg;
61 }
62
64 KisRadian rad;
65 rad.m_value = RAD_90;
66 return rad;
67 }
68
70 KisRadian rad;
71 rad.m_value = RAD_180;
72 return rad;
73 }
74
76 KisRadian rad;
77 rad.m_value = RAD_270;
78 return rad;
79 }
80
81 static KisRadian fromDegrees(const TReal& deg) { return KisRadian(deg * TO_RAD); }
82 static TReal toRadians (const TReal& deg) { return normalizeDegrees(deg) * TO_RAD; }
83 static TReal toDegrees (const TReal& rad) { return normalizeRadians(rad) * TO_DEG; }
84
85 const TReal& value () const { return m_value; }
86 TReal degrees() const { return m_value * TO_DEG; }
87
88 TReal scaled(const TReal& min, const TReal& max) const {
89 return min + (m_value / PI2) * (max - min);
90 }
91
92 // ------ operator = ---------------------------------------------------- //
93
94 template<class U>
95 KisRadian& operator = (const U& rad) {
97 return *this;
98 }
99
100 template<class U>
102 m_value = rad.m_value;
103 return *this;
104 }
105
106 // ------ operator + ---------------------------------------------------- //
107
108 template<class U>
109 KisRadian& operator += (const U& rad) {
111 return *this;
112 }
113
114
115 friend KisRadian operator + (const KisRadian& l, const KisRadian& r) {
116 KisRadian rad(l);
117 rad += r;
118 return rad;
119 }
120
121 // ------ operator - ---------------------------------------------------- //
122
123 template<class U>
124 KisRadian& operator -= (const U& rad) {
126 return *this;
127 }
128
129 friend KisRadian operator - (const KisRadian& l, const KisRadian& r) {
130 KisRadian rad(l);
131 rad -= r;
132 return rad;
133 }
134
135 // ------ operator * ---------------------------------------------------- //
136
137 template<class U>
138 KisRadian& operator *= (const U& rad) {
140 return *this;
141 }
142
143 friend KisRadian operator * (const KisRadian& l, const KisRadian& r) {
144 KisRadian rad(l);
145 rad *= r;
146 return rad;
147 }
148
149 // ------ operator / ---------------------------------------------------- //
150
151 template<class U>
152 KisRadian& operator /= (const U& rad) {
154 return *this;
155 }
156
157 friend KisRadian operator / (const KisRadian& l, const KisRadian& r) {
158 KisRadian rad(l);
159 rad /= r;
160 return rad;
161 }
162
163 // ------ operator % ---------------------------------------------------- //
164
165 template<class U>
166 KisRadian& operator %= (const U& rad) {
167 m_value = normalizeRadians(std::fmod(m_value, TReal(_Private::Value::get(rad))));
168 return *this;
169 }
170
171
172 friend KisRadian operator % (const KisRadian& l, const KisRadian& r) {
173 KisRadian rad(l);
174 rad %= r;
175 return rad;
176 }
177
178private:
179 TReal m_value;
180};
181
182#endif // H_KIS_RADIAN_H
float value(const T *src, size_t ch)
friend KisRadian operator/(const KisRadian &l, const KisRadian &r)
Definition kis_radian.h:157
const TReal & value() const
Definition kis_radian.h:85
static TReal normalizeDegrees(TReal deg)
Definition kis_radian.h:58
static TReal toDegrees(const TReal &rad)
Definition kis_radian.h:83
KisRadian & operator*=(const U &rad)
Definition kis_radian.h:138
TReal scaled(const TReal &min, const TReal &max) const
Definition kis_radian.h:88
static KisRadian from270Deg()
Definition kis_radian.h:75
TReal degrees() const
Definition kis_radian.h:86
static TReal normalizeRadians(TReal rad)
Definition kis_radian.h:53
KisRadian & operator=(const U &rad)
Definition kis_radian.h:95
friend KisRadian operator-(const KisRadian &l, const KisRadian &r)
Definition kis_radian.h:129
static TReal toRadians(const TReal &deg)
Definition kis_radian.h:82
friend KisRadian operator+(const KisRadian &l, const KisRadian &r)
Definition kis_radian.h:115
TReal m_value
Definition kis_radian.h:179
KisRadian(const KisRadian< U > &rad)
Definition kis_radian.h:45
static KisRadian fromDegrees(const TReal &deg)
Definition kis_radian.h:81
KisRadian & operator%=(const U &rad)
Definition kis_radian.h:166
friend KisRadian operator*(const KisRadian &l, const KisRadian &r)
Definition kis_radian.h:143
KisRadian & operator-=(const U &rad)
Definition kis_radian.h:124
static KisRadian from90Deg()
Definition kis_radian.h:63
KisRadian(const U &rad)
Definition kis_radian.h:49
friend KisRadian operator%(const KisRadian &l, const KisRadian &r)
Definition kis_radian.h:172
KisRadian & operator/=(const U &rad)
Definition kis_radian.h:152
static KisRadian from180Deg()
Definition kis_radian.h:69
KisRadian & operator+=(const U &rad)
Definition kis_radian.h:109
#define RAD_90
Definition kis_radian.h:19
#define PI2
Definition kis_radian.h:13
#define RAD_180
Definition kis_radian.h:18
#define TO_RAD
Definition kis_radian.h:15
#define RAD_270
Definition kis_radian.h:17
#define TO_DEG
Definition kis_radian.h:14
static const T & get(const T &value)
Definition kis_radian.h:29
static const T & get(const KisRadian< T > &rad)
Definition kis_radian.h:32