From: <J.B...@ew...> - 2009-08-31 20:06:24
|
Looking at the code, it seems that it used to be possible to specify the "numerical tolerance". Shall we put this back in? > -----Original Message----- > From: J.B...@ew... > [mailto:J.B...@ew...] > Sent: maandag 31 augustus 2009 9:57 > To: lib...@li... > Cc: tav...@fr... > Subject: [Lib2geom-devel] FW: [Inkscape-devel] Broken feImage > and lib2geommatrix inversion > > Hi guys, > > See the email below. > > > -----Original Message----- > > From: Tavmjong Bah [mailto:tav...@fr...] > > Sent: Sunday, August 30, 2009 13:10 > > To: Inkscape Devel List > > Subject: [Inkscape-devel] Broken feImage and lib2geom > matrix inversion > > > > > > > > Hi, > > > > I've traced the problem with the broken feImage filter > primitive (see > > https://bugs.launchpad.net/inkscape/+bug/382313 ) to a problem with > > lib2geom. More specifically, > > Geom::Matrix.inverse() returns an incorrect matrix. I run > this simple > > test program: > > > > #include <iostream> > > #include <2geom/matrix.h> > > > > int main() { > > > > Geom::Matrix test_matrix1( 0.003333, 0.000000, 0.000000, > 0.003333, > > 0.083333, 0.083333 ); > > > > Geom::Matrix test_inverse1 = test_matrix1.inverse(); > > > > std::cout << "Test input" << std::endl; > > std::cout << test_matrix1 << std::endl; > > > > std::cout << "Test output" << std::endl; > > std::cout << test_inverse1 << std::endl; > > > > Geom::Matrix test_matrix2( 0.003077, 0.000000, 0.000000, > 0.003077, > > 0.076923, 0.076923 ); > > > > Geom::Matrix test_inverse2 = test_matrix2.inverse(); > > > > std::cout << "Test input" << std::endl; > > std::cout << test_matrix2 << std::endl; > > > > std::cout << "Test output" << std::endl; > > std::cout << test_inverse2 << std::endl; } > > > > The output I see is: > > > > Test input > > A: 0.003333 C: 0 E: 0.083333 > > B: 0 D: 0.003333 F: 0.083333 > > > > Test output > > A: 300.03 C: -0 E: -25.0024 > > B: -0 D: 300.03 F: -25.0024 > > > > Test input > > A: 0.003077 C: 0 E: 0.076923 > > B: 0 D: 0.003077 F: 0.076923 > > > > Test output > > A: 1 C: 0 E: 0 > > B: 0 D: 1 F: 0 > > > > You can see that the first matrix inversion is correct but > the second > > is wrong. This was tested with SVN as of yesterday on Linux. > > > > A bit more info. > > > > In Geom::Matrix::inverse() the matrix determinate is calculated and > > then compared to the constant EPSILON which is defined as 10^-5 (in > > coord.h). > > If it is less than EPSILON the matrix is set to unity. This > EPSILON is > > clearly way too large for use in inverse(). For some reason > a value of > > 10^-18 in commented out in coord.h. My guess is that the > value 10^-5 > > was selected for comparing pixel positions to each other but it is > > being used for other purposes in the lib2geom library. > > > > Tav > > > > -------------------------------------------------------------- > ---------------- > Let Crystal Reports handle the reporting - Free Crystal > Reports 2008 30-Day > trial. Simplify your report design, integration and > deployment - and focus on > what you do best, core application coding. Discover what's new with > Crystal Reports now. http://p.sf.net/sfu/bobj-july > _______________________________________________ > Lib2geom-devel mailing list > Lib...@li... > https://lists.sourceforge.net/lists/listinfo/lib2geom-devel > |