[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
## [Gnash-dev] Re:Matrix math (strk)

**From**: |
zou lunkai |

**Subject**: |
[Gnash-dev] Re:Matrix math (strk) |

**Date**: |
Sun, 31 Aug 2008 21:50:36 +0800 |

>* So we now cache matrix parameters in the character class*
>* and recompute the matrix from all scales and a rotation*
>* when needed.*
>
>* Question now is: does it still make sense to have*
>* matrix methods: set_x_scale, set_y_scale, set_rotation ?*
>
>* The core only uses set_scale_rotation now...*
>
>* Only user of the others is the testcase, which fails.*
>* It seems to me that there's no way to tell original parameters*
>* from the matrix itself, while the final transformation might*
>* be good enough.*
>* See the testcase testsuite/libcore.all/MatrixTest.cpp*
>* There you see how setting scale to -scale fails to remember*
>* scale got negative and instead introduces a rotation of 180 degrees.*
>
>* So, should we take that as correct or expect the failure or*
>* drop those parameters setting methods ?*
>
I didn't do much research on the math itself when refactorying the
matrix class, all the math was borrowed from the old code IIRC.
This is the math from AGG, in file agg_trans_affine.cpp, you might
want to have a look.
//
// get the rotation from a matrix.
//
double trans_affine::rotation() const
{
double x1 = 0.0;
double y1 = 0.0;
double x2 = 1.0;
double y2 = 0.0;
transform(&x1, &y1);
transform(&x2, &y2);
return atan2(y2-y1, x2-x1);
}
//
//get the translation from a matrix
//
void trans_affine::translation(double* dx, double* dy) const
{
*dx = tx;
*dy = ty;
}
//
// get scaling x and y from a matrix.
//
void trans_affine::scaling(double* x, double* y) const
{
double x1 = 0.0;
double y1 = 0.0;
double x2 = 1.0;
double y2 = 1.0;
trans_affine t(*this);
t *= trans_affine_rotation(-rotation());
t.transform(&x1, &y1);
t.transform(&x2, &y2);
*x = x2 - x1;
*y = y2 - y1;
}
--zou

[Prev in Thread] |
**Current Thread** |
[Next in Thread] |

**[Gnash-dev] Re:Matrix math (strk)**,
*zou lunkai* **<=**