19 #ifndef AGG_TRANS_AFFINE_INCLUDED 20 #define AGG_TRANS_AFFINE_INCLUDED 23 #include "agg_basics.h" 27 const double affine_epsilon = 1e-14;
89 double sx, shy, shx, sy, tx, ty;
94 sx(1.0), shy(0.0), shx(0.0), sy(1.0), tx(0.0), ty(0.0)
99 double v3,
double v4,
double v5) :
100 sx(v0), shy(v1), shx(v2), sy(v3), tx(v4), ty(v5)
105 sx(m[0]), shy(m[1]), shx(m[2]), sy(m[3]), tx(m[4]), ty(m[5])
109 trans_affine(
double x1,
double y1,
double x2,
double y2,
112 rect_to_parl(x1, y1, x2, y2, parl);
117 double x1,
double y1,
double x2,
double y2)
119 parl_to_rect(parl, x1, y1, x2, y2);
125 parl_to_parl(src, dst);
143 double x2,
double y2,
147 double x1,
double y1,
148 double x2,
double y2);
186 void store_to(
double* m)
const 188 *m++ = sx; *m++ = shy; *m++ = shx; *m++ = sy; *m++ = tx; *m++ = ty;
194 sx = *m++; shy = *m++; shx = *m++; sy = *m++; tx = *m++; ty = *m++;
209 return multiply_inv(m);
236 return is_equal(m, affine_epsilon);
242 return !is_equal(m, affine_epsilon);
247 void transform(
double* x,
double* y)
const;
250 void transform_2x2(
double* x,
double* y)
const;
255 void inverse_transform(
double* x,
double* y)
const;
259 double determinant()
const 261 return sx * sy - shy * shx;
265 double determinant_reciprocal()
const 267 return 1.0 / (sx * sy - shy * shx);
273 double scale()
const;
276 bool is_valid(
double epsilon = affine_epsilon)
const;
279 bool is_identity(
double epsilon = affine_epsilon)
const;
282 bool is_equal(
const trans_affine& m,
double epsilon = affine_epsilon)
const;
286 double rotation()
const;
287 void translation(
double* dx,
double* dy)
const;
288 void scaling(
double* x,
double* y)
const;
289 void scaling_abs(
double* x,
double* y)
const;
293 inline void trans_affine::transform(
double* x,
double* y)
const 296 *x = tmp * sx + *y * shx + tx;
297 *y = tmp * shy + *y * sy + ty;
301 inline void trans_affine::transform_2x2(
double* x,
double* y)
const 304 *x = tmp * sx + *y * shx;
305 *y = tmp * shy + *y * sy;
309 inline void trans_affine::inverse_transform(
double* x,
double* y)
const 311 double d = determinant_reciprocal();
312 double a = (*x - tx) * d;
313 double b = (*y - ty) * d;
314 *x = a * sy - b * shx;
315 *y = b * sx - a * shy;
319 inline double trans_affine::scale()
const 321 double x = 0.707106781 * sx + 0.707106781 * shx;
322 double y = 0.707106781 * shy + 0.707106781 * sy;
323 return std::sqrt(x*x + y*y);
327 inline const trans_affine& trans_affine::translate(
double x,
double y)
335 inline const trans_affine& trans_affine::rotate(
double a)
337 double ca = std::cos(a);
338 double sa = std::sin(a);
339 double t0 = sx * ca - shy * sa;
340 double t2 = shx * ca - sy * sa;
341 double t4 = tx * ca - ty * sa;
342 shy = sx * sa + shy * ca;
343 sy = shx * sa + sy * ca;
344 ty = tx * sa + ty * ca;
352 inline const trans_affine& trans_affine::scale(
double x,
double y)
366 inline const trans_affine& trans_affine::scale(
double s)
382 return *
this = t.multiply(*
this);
398 return *
this = t.multiply(*
this);
402 inline void trans_affine::scaling_abs(
double* x,
double* y)
const 407 *x = std::sqrt(sx * sx + shx * shx);
408 *y = std::sqrt(shy * shy + sy * sy);
420 trans_affine(std::cos(a), std::sin(a), -std::sin(a), std::cos(a), 0.0, 0.0)
454 trans_affine(1.0, std::tan(y), std::tan(x), 1.0, 0.0, 0.0)