ACF $AcfVersion:0$
CAffine2d.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ACF-Commercial
2#pragma once
3
4
5// ACF includes
6#include <i2d/CVector2d.h>
7#include <i2d/CMatrix2d.h>
8
9
10namespace i2d
11{
12
13
18{
19public:
23 CAffine2d();
24
28 CAffine2d(const CAffine2d& transform);
29
33 explicit CAffine2d(const CMatrix2d& deform, const CVector2d& translation = CVector2d(0.0, 0.0));
34
38 explicit CAffine2d(const CVector2d& translation);
39
43 const CVector2d& GetTranslation() const;
44
48 void SetTranslation(const CVector2d& translation);
49
53 const CMatrix2d& GetDeformMatrix() const;
54
60
65
69 void SetDeformMatrix(const CMatrix2d& deform);
70
71 // internal access operations
72
77
82
83 // init operations
84
88 void Reset();
89
93 void Reset(const CVector2d& translation);
94
98 void Reset(const CVector2d& translation, double angle, double scale = 1.0);
99
103 void Reset(const CVector2d& translation, double angle, const CVector2d& scale);
104
108 CVector2d GetApply(const CVector2d& position) const;
109
113 void GetApply(const CVector2d& position, CVector2d& result) const;
114
119 CVector2d GetApplyToDelta(const CVector2d& delta) const;
120
125 void GetApplyToDelta(const CVector2d& delta, CVector2d& result) const;
126
132 CAffine2d GetApply(const CAffine2d& transform) const;
133
139 void GetApply(const CAffine2d& transform, CAffine2d& result) const;
140
145 void Apply(const CAffine2d& transform);
146
151 void ApplyLeft(const CAffine2d& transform);
152
156 CVector2d GetInvertedApply(const CVector2d& position) const;
157
161 bool GetInvertedApply(const CVector2d& position, CVector2d& result) const;
162
166 CAffine2d GetTranslated(const CVector2d& delta) const;
167
171 void GetTranslated(const CVector2d& delta, CAffine2d& result) const;
172
176 void Translate(const CVector2d& delta);
177
181 CAffine2d GetInverted() const;
182
186 bool GetInverted(CAffine2d& result) const;
187
191 bool Serialize(iser::IArchive& archive);
192
193 // operators
194 bool operator==(const CAffine2d& transform) const;
195 bool operator!=(const CAffine2d& transform) const;
196 CAffine2d& operator=(const CAffine2d& transform);
197
198 // static methods
199 static const CAffine2d& GetIdentity();
200
201private:
202 CVector2d m_translation;
203 CMatrix2d m_deformMatrix;
204
205 // static members
206 static CAffine2d s_identity;
207};
208
209
210// inline methods
211
213: m_translation(0.0, 0.0),
214 m_deformMatrix(CMatrix2d::GetIdentity())
215{
216}
217
218
219inline CAffine2d::CAffine2d(const CAffine2d& transform)
220: m_translation(transform.m_translation),
221 m_deformMatrix(transform.m_deformMatrix)
222{
223}
224
225
226// access to members
227
229{
230 return m_translation;
231}
232
233
234inline void CAffine2d::SetTranslation(const CVector2d& translation)
235{
236 m_translation = translation;
237}
238
239
241{
242 return m_deformMatrix;
243}
244
245
246inline void CAffine2d::SetDeformMatrix(const CMatrix2d& deform)
247{
248 m_deformMatrix = deform;
249}
250
251
252// internal access operations
253
255{
256 return m_translation;
257}
258
259
261{
262 return m_deformMatrix;
263}
264
265
266// operations
267
268inline CVector2d CAffine2d::GetApply(const CVector2d& position) const
269{
270 CVector2d result;
271 m_deformMatrix.GetMultiplied(position, result);
272
273 return result + m_translation;
274}
275
276
277inline void CAffine2d::GetApply(const CVector2d& position, CVector2d& result) const
278{
279 m_deformMatrix.GetMultiplied(position, result);
280 result += m_translation;
281}
282
283
285{
286 CVector2d retVal;
287
288 m_deformMatrix.GetMultiplied(delta, retVal);
289
290 return retVal;
291}
292
293
294inline void CAffine2d::GetApplyToDelta(const CVector2d& delta, CVector2d& result) const
295{
296 m_deformMatrix.GetMultiplied(delta, result);
297}
298
299
301{
302 return CAffine2d(m_deformMatrix, m_translation + vector);
303}
304
305
306inline void CAffine2d::GetTranslated(const CVector2d& vector, CAffine2d& result) const
307{
308 result.GetDeformMatrixRef() = m_deformMatrix;
309 result.GetTranslationRef() = m_translation + vector;
310}
311
312
313inline void CAffine2d::Translate(const CVector2d& vector)
314{
315 m_translation += vector;
316}
317
318
320{
321 CVector2d result;
322
323 GetInvertedApply(position, result);
324
325 return result;
326}
327
328
330{
331 CAffine2d result;
332
333 GetInverted(result);
334
335 return result;
336}
337
338
339// operators
340
341inline bool CAffine2d::operator==(const CAffine2d& transform) const
342{
343 return (m_translation == transform.m_translation) && (m_deformMatrix == transform.m_deformMatrix);
344}
345
346
347inline bool CAffine2d::operator!=(const CAffine2d& transform) const
348{
349 return (m_translation != transform.m_translation) || (m_deformMatrix != transform.m_deformMatrix);
350}
351
352
353// static methods
354
356{
357 return s_identity;
358}
359
360
361} // namespace i2d
362
363
364
365
This class defines an affine 2D-transformation.
Definition CAffine2d.h:18
const CVector2d & GetTranslation() const
Get translation part of this affine transformation.
Definition CAffine2d.h:228
CVector2d & GetTranslationRef()
Get internal reference to the translation vector.
Definition CAffine2d.h:254
CAffine2d & operator=(const CAffine2d &transform)
void Reset()
Set to identity transformation.
void ApplyLeft(const CAffine2d &transform)
Combine this transformation with another transformation on the left side.
CAffine2d GetTranslated(const CVector2d &delta) const
Get some transformation combined with translation.
Definition CAffine2d.h:300
bool operator!=(const CAffine2d &transform) const
Definition CAffine2d.h:347
void SetDeformMatrix(const CMatrix2d &deform)
Set rotation, skew and scale part of this affine transformation.
Definition CAffine2d.h:246
const CMatrix2d & GetDeformMatrix() const
Get rotation, skew and scale part of this affine transformation.
Definition CAffine2d.h:240
CVector2d GetScaleVector() const
Get scale vector of this affine transformation (right-hand side matrix-vector multiplication assumed,...
bool operator==(const CAffine2d &transform) const
Definition CAffine2d.h:341
bool GetInvertedApply(const CVector2d &position, CVector2d &result) const
Inverted operation to GetApply().
void Reset(const CVector2d &translation, double angle, double scale=1.0)
Set this transformation to a given translation, rotation and scaling.
CVector2d GetApplyToDelta(const CVector2d &delta) const
Get difference vector after this transformation.
Definition CAffine2d.h:284
CMatrix2d GetRotationMatrix() const
Get rotational part of this affine transformation.
void Reset(const CVector2d &translation, double angle, const CVector2d &scale)
Set this transformation to a given translation, rotation and both axis scaling.
void Reset(const CVector2d &translation)
Set this transformation to translation.
CVector2d GetApply(const CVector2d &position) const
Calculate transformed position.
Definition CAffine2d.h:268
CAffine2d()
Constructor, parameters will be not initialized.
Definition CAffine2d.h:212
void GetApply(const CAffine2d &transform, CAffine2d &result) const
Get combined transformation.
void Apply(const CAffine2d &transform)
Combine this transformation with another transformation.
static const CAffine2d & GetIdentity()
Definition CAffine2d.h:355
CAffine2d(const CMatrix2d &deform, const CVector2d &translation=CVector2d(0.0, 0.0))
Constructs a transform using specified deformation matrix and translation.
bool Serialize(iser::IArchive &archive)
Serialize transformation parameters into/from archive.
CAffine2d GetInverted() const
Get inverted transformation.
Definition CAffine2d.h:329
void Translate(const CVector2d &delta)
Combine this transformation with translation.
Definition CAffine2d.h:313
bool GetInverted(CAffine2d &result) const
Get inverted transformation.
void SetTranslation(const CVector2d &translation)
Set translation part of this affine transformation.
Definition CAffine2d.h:234
CMatrix2d & GetDeformMatrixRef()
Get internal reference to the transformation matrix.
Definition CAffine2d.h:260
CAffine2d GetApply(const CAffine2d &transform) const
Get combined transformation.
CVector2d GetInvertedApply(const CVector2d &position) const
Inverted operation to GetApply().
Definition CAffine2d.h:319
CAffine2d(const CVector2d &translation)
Constructs a transform with translation only.
2D matrix.
Definition CMatrix2d.h:19
CVector2d GetMultiplied(const CVector2d &position) const
Definition CMatrix2d.h:177
Definition of position or mathematical vector on 2D plane.
Definition CVector2d.h:29
Represents an input/output persistence archive for object serialization.
Definition IArchive.h:164
Contains the 2D objects.
Definition CAffine2d.h:11