Index: experimental/Intersection/CubicToQuadratics_Test.cpp |
diff --git a/experimental/Intersection/CubicToQuadratics_Test.cpp b/experimental/Intersection/CubicToQuadratics_Test.cpp |
deleted file mode 100644 |
index b7e1252a46ccb5759e481289e3bb799653ce81ac..0000000000000000000000000000000000000000 |
--- a/experimental/Intersection/CubicToQuadratics_Test.cpp |
+++ /dev/null |
@@ -1,269 +0,0 @@ |
-#include "CubicIntersection_TestData.h" |
-#include "CubicUtilities.h" |
-#include "Intersection_Tests.h" |
-#include "QuadraticIntersection_TestData.h" |
-#include "TestUtilities.h" |
-#include "SkGeometry.h" |
- |
-static void test(const Cubic* cubics, const char* name, int firstTest, size_t testCount) { |
- SkTDArray<Quadratic> quads; |
- for (size_t index = firstTest; index < testCount; ++index) { |
- const Cubic& cubic = cubics[index]; |
- double precision = calcPrecision(cubic); |
- (void) cubic_to_quadratics(cubic, precision, quads); |
- if (quads.count() != 1) { |
- printf("%s [%d] cubic to quadratics failed count=%d\n", name, (int) index, |
- quads.count()); |
- } |
- } |
-} |
- |
-static void test(const Quadratic* quadTests, const char* name, int firstTest, size_t testCount) { |
- SkTDArray<Quadratic> quads; |
- for (size_t index = firstTest; index < testCount; ++index) { |
- const Quadratic& quad = quadTests[index]; |
- Cubic cubic; |
- quad_to_cubic(quad, cubic); |
- double precision = calcPrecision(cubic); |
- (void) cubic_to_quadratics(cubic, precision, quads); |
- if (quads.count() != 1) { |
- printf("%s [%d] cubic to quadratics failed count=%d\n", name, (int) index, |
- quads.count()); |
- } |
- } |
-} |
- |
-static void testC(const Cubic* cubics, const char* name, int firstTest, size_t testCount) { |
- SkTDArray<Quadratic> quads; |
- // test if computed line end points are valid |
- for (size_t index = firstTest; index < testCount; ++index) { |
- const Cubic& cubic = cubics[index]; |
- double precision = calcPrecision(cubic); |
- int order = cubic_to_quadratics(cubic, precision, quads); |
- SkASSERT(order != 4); |
- if (order < 3) { |
- continue; |
- } |
- if (!AlmostEqualUlps(cubic[0].x, quads[0][0].x) |
- || !AlmostEqualUlps(cubic[0].y, quads[0][0].y)) { |
- printf("[%d] unmatched start\n", (int) index); |
- } |
- int last = quads.count() - 1; |
- if (!AlmostEqualUlps(cubic[3].x, quads[last][2].x) |
- || !AlmostEqualUlps(cubic[3].y, quads[last][2].y)) { |
- printf("[%d] unmatched end\n", (int) index); |
- } |
- } |
-} |
- |
-static void testC(const Cubic(* cubics)[2], const char* name, int firstTest, size_t testCount) { |
- SkTDArray<Quadratic> quads; |
- for (size_t index = firstTest; index < testCount; ++index) { |
- for (int idx2 = 0; idx2 < 2; ++idx2) { |
- const Cubic& cubic = cubics[index][idx2]; |
- double precision = calcPrecision(cubic); |
- int order = cubic_to_quadratics(cubic, precision, quads); |
- SkASSERT(order != 4); |
- if (order < 3) { |
- continue; |
- } |
- if (!AlmostEqualUlps(cubic[0].x, quads[0][0].x) |
- || !AlmostEqualUlps(cubic[0].y, quads[0][0].y)) { |
- printf("[%d][%d] unmatched start\n", (int) index, idx2); |
- } |
- int last = quads.count() - 1; |
- if (!AlmostEqualUlps(cubic[3].x, quads[last][2].x) |
- || !AlmostEqualUlps(cubic[3].y, quads[last][2].y)) { |
- printf("[%d][%d] unmatched end\n", (int) index, idx2); |
- } |
- } |
- } |
-} |
- |
-void CubicToQuadratics_Test() { |
- enum { |
- RunAll, |
- RunPointDegenerates, |
- RunNotPointDegenerates, |
- RunLines, |
- RunNotLines, |
- RunModEpsilonLines, |
- RunLessEpsilonLines, |
- RunNegEpsilonLines, |
- RunQuadraticLines, |
- RunQuadraticModLines, |
- RunComputedLines, |
- RunComputedTests, |
- RunNone |
- } run = RunAll; |
- int firstTestIndex = 0; |
-#if 0 |
- run = RunComputedLines; |
- firstTestIndex = 18; |
-#endif |
- int firstPointDegeneratesTest = run == RunAll ? 0 : run == RunPointDegenerates ? firstTestIndex : SK_MaxS32; |
- int firstNotPointDegeneratesTest = run == RunAll ? 0 : run == RunNotPointDegenerates ? firstTestIndex : SK_MaxS32; |
- int firstLinesTest = run == RunAll ? 0 : run == RunLines ? firstTestIndex : SK_MaxS32; |
- int firstNotLinesTest = run == RunAll ? 0 : run == RunNotLines ? firstTestIndex : SK_MaxS32; |
- int firstModEpsilonTest = run == RunAll ? 0 : run == RunModEpsilonLines ? firstTestIndex : SK_MaxS32; |
- int firstLessEpsilonTest = run == RunAll ? 0 : run == RunLessEpsilonLines ? firstTestIndex : SK_MaxS32; |
- int firstNegEpsilonTest = run == RunAll ? 0 : run == RunNegEpsilonLines ? firstTestIndex : SK_MaxS32; |
- int firstQuadraticLineTest = run == RunAll ? 0 : run == RunQuadraticLines ? firstTestIndex : SK_MaxS32; |
- int firstQuadraticModLineTest = run == RunAll ? 0 : run == RunQuadraticModLines ? firstTestIndex : SK_MaxS32; |
- int firstComputedLinesTest = run == RunAll ? 0 : run == RunComputedLines ? firstTestIndex : SK_MaxS32; |
- int firstComputedCubicsTest = run == RunAll ? 0 : run == RunComputedTests ? firstTestIndex : SK_MaxS32; |
- |
- test(pointDegenerates, "pointDegenerates", firstPointDegeneratesTest, pointDegenerates_count); |
- test(notPointDegenerates, "notPointDegenerates", firstNotPointDegeneratesTest, notPointDegenerates_count); |
- test(lines, "lines", firstLinesTest, lines_count); |
- test(notLines, "notLines", firstNotLinesTest, notLines_count); |
- test(modEpsilonLines, "modEpsilonLines", firstModEpsilonTest, modEpsilonLines_count); |
- test(lessEpsilonLines, "lessEpsilonLines", firstLessEpsilonTest, lessEpsilonLines_count); |
- test(negEpsilonLines, "negEpsilonLines", firstNegEpsilonTest, negEpsilonLines_count); |
- test(quadraticLines, "quadraticLines", firstQuadraticLineTest, quadraticLines_count); |
- test(quadraticModEpsilonLines, "quadraticModEpsilonLines", firstQuadraticModLineTest, |
- quadraticModEpsilonLines_count); |
- testC(lines, "computed lines", firstComputedLinesTest, lines_count); |
- testC(tests, "computed tests", firstComputedCubicsTest, tests_count); |
- printf("%s end\n", __FUNCTION__); |
-} |
- |
-static Cubic locals[] = { |
-{{0, 1}, {1.9274705288631189e-19, 1.0000000000000002}, {0.0017190297609673323, 0.99828097023903239}, |
- {0.0053709083094631276, 0.99505672974365911}}, |
- |
- {{14.5975863, 41.632436}, {16.3518929, 26.2639684}, {18.5165519, 7.68775139}, {8.03767257, 89.1628526}}, |
- {{69.7292014, 38.6877352}, {24.7648688, 23.1501713}, {84.9283191, 90.2588441}, {80.392774, 61.3533852}}, |
- {{ |
- 60.776536520932126, |
- 71.249307306133829 |
- }, { |
- 87.107894191103014, |
- 22.377669868235323 |
- }, { |
- 1.4974754310666936, |
- 68.069569937917208 |
- }, { |
- 45.261946574441133, |
- 17.536076632112298 |
- }}, |
-}; |
- |
-static size_t localsCount = sizeof(locals) / sizeof(locals[0]); |
- |
-#define DEBUG_CRASH 0 |
-#define TEST_AVERAGE_END_POINTS 0 // must take const off to test |
-extern const bool AVERAGE_END_POINTS; |
- |
-static void oneOff(size_t x) { |
- const Cubic& cubic = locals[x]; |
- const SkPoint skcubic[4] = {{(float) cubic[0].x, (float) cubic[0].y}, |
- {(float) cubic[1].x, (float) cubic[1].y}, {(float) cubic[2].x, (float) cubic[2].y}, |
- {(float) cubic[3].x, (float) cubic[3].y}}; |
- SkScalar skinflect[2]; |
- int skin = SkFindCubicInflections(skcubic, skinflect); |
- SkDebugf("%s %d %1.9g\n", __FUNCTION__, skin, skinflect[0]); |
- SkTDArray<Quadratic> quads; |
- double precision = calcPrecision(cubic); |
- (void) cubic_to_quadratics(cubic, precision, quads); |
- SkDebugf("%s quads=%d\n", __FUNCTION__, quads.count()); |
-} |
- |
-void CubicsToQuadratics_OneOffTests() { |
- for (size_t x = 0; x < localsCount; ++x) { |
- oneOff(x); |
- } |
-} |
- |
-void CubicsToQuadratics_OneOffTest() { |
- oneOff(0); |
-} |
- |
-void CubicsToQuadratics_RandTest() { |
- srand(0); |
- const int arrayMax = 8; |
- const int sampleMax = 10; |
- const int tests = 1000000; // 10000000; |
- int quadDist[arrayMax]; |
- bzero(quadDist, sizeof(quadDist)); |
- Cubic samples[arrayMax][sampleMax]; |
- int sampleCount[arrayMax]; |
- bzero(sampleCount, sizeof(sampleCount)); |
- for (int x = 0; x < tests; ++x) { |
- Cubic cubic; |
- for (int i = 0; i < 4; ++i) { |
- cubic[i].x = (double) rand() / RAND_MAX * 100; |
- cubic[i].y = (double) rand() / RAND_MAX * 100; |
- } |
- #if DEBUG_CRASH |
- char str[1024]; |
- sprintf(str, "{{%1.9g, %1.9g}, {%1.9g, %1.9g}, {%1.9g, %1.9g}, {%1.9g, %1.9g}},\n", |
- cubic[0].x, cubic[0].y, cubic[1].x, cubic[1].y, cubic[2].x, cubic[2].y, |
- cubic[3].x, cubic[3].y); |
- #endif |
- SkTDArray<Quadratic> quads; |
- double precision = calcPrecision(cubic); |
- (void) cubic_to_quadratics(cubic, precision, quads); |
- int count = quads.count(); |
- SkASSERT(count > 0); |
- SkASSERT(--count < arrayMax); |
- quadDist[count]++; |
- int sCount = sampleCount[count]; |
- if (sCount < sampleMax) { |
- memcpy(samples[count][sCount], cubic, sizeof(Cubic)); |
- sampleCount[count]++; |
- } |
- } |
- for (int x = 0; x < arrayMax; ++x) { |
- if (!quadDist[x]) { |
- continue; |
- } |
- SkDebugf("%d %1.9g%%\n", x + 1, (double) quadDist[x] / tests * 100); |
- } |
- SkDebugf("\n"); |
- for (int x = 0; x < arrayMax; ++x) { |
- for (int y = 0; y < sampleCount[x]; ++y) { |
-#if TEST_AVERAGE_END_POINTS |
- for (int w = 0; w < 2; ++w) { |
- AVERAGE_END_POINTS = w; |
-#else |
- int w = 0; |
-#endif |
- SkDebugf("<div id=\"cubic%dx%d%s\">\n", x + 1, y, w ? "x" : ""); |
- const Cubic& cubic = samples[x][y]; |
- SkDebugf("{{%1.9g, %1.9g}, {%1.9g, %1.9g}, {%1.9g, %1.9g}, {%1.9g, %1.9g}},\n", |
- cubic[0].x, cubic[0].y, cubic[1].x, cubic[1].y, cubic[2].x, cubic[2].y, |
- cubic[3].x, cubic[3].y); |
- SkTDArray<Quadratic> quads; |
- double precision = calcPrecision(cubic); |
- (void) cubic_to_quadratics(cubic, precision, quads); |
- for (int z = 0; z < quads.count(); ++z) { |
- const Quadratic& quad = quads[z]; |
- SkDebugf("{{%1.9g, %1.9g}, {%1.9g, %1.9g}, {%1.9g, %1.9g}},\n", |
- quad[0].x, quad[0].y, quad[1].x, quad[1].y, quad[2].x, quad[2].y); |
- } |
- SkDebugf("</div>\n\n"); |
-#if TEST_AVERAGE_END_POINTS |
- } |
-#endif |
- } |
- } |
- SkDebugf("</div>\n\n"); |
- SkDebugf("<script type=\"text/javascript\">\n\n"); |
- SkDebugf("var testDivs = [\n"); |
- for (int x = 0; x < arrayMax; ++x) { |
- for (int y = 0; y < sampleCount[x]; ++y) { |
-#if TEST_AVERAGE_END_POINTS |
- for (int w = 0; w < 2; ++w) { |
-#else |
- int w = 0; |
-#endif |
- SkDebugf(" cubic%dx%d%s,\n", x + 1, y, w ? "x" : ""); |
-#if TEST_AVERAGE_END_POINTS |
- } |
-#endif |
- } |
- } |
- SkDebugf("\n\n\n"); |
- SkDebugf("%s end\n", __FUNCTION__); |
-} |