/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "Intersection_Tests.h" #include "LineParameters.h" // tests to verify that distance calculations are coded correctly const Cubic tests[] = { {{0, 0}, {1, 1}, {2, 2}, {0, 3}}, {{0, 0}, {1, 1}, {2, 2}, {3, 0}}, {{0, 0}, {5, 0}, {-2,4}, {3, 4}}, {{0, 2}, {1, 0}, {2, 0}, {3, 0}}, {{0, .2}, {1, 0}, {2, 0}, {3, 0}}, {{0, .02}, {1, 0}, {2, 0}, {3, 0}}, {{0, .002}, {1, 0}, {2, 0}, {3, 0}}, {{0, .0002}, {1, 0}, {2, 0}, {3, 0}}, {{0, .00002}, {1, 0}, {2, 0}, {3, 0}}, {{0, PointEpsilon * 2}, {1, 0}, {2, 0}, {3, 0}}, }; const double answers[][2] = { {1, 2}, {1, 2}, {4, 4}, {1.1094003924, 0.5547001962}, {0.133038021, 0.06651901052}, {0.0133330370, 0.006666518523}, {0.001333333037, 0.0006666665185}, {0.000133333333, 6.666666652e-05}, {1.333333333e-05, 6.666666667e-06}, {1.333333333e-06, 6.666666667e-07}, }; const size_t tests_count = sizeof(tests) / sizeof(tests[0]); static size_t firstLineParameterTest = 0; void LineParameter_Test() { for (size_t index = firstLineParameterTest; index < tests_count; ++index) { LineParameters lineParameters; const Cubic& cubic = tests[index]; lineParameters.cubicEndPoints(cubic); double denormalizedDistance[2]; denormalizedDistance[0] = lineParameters.controlPtDistance(cubic, 1); denormalizedDistance[1] = lineParameters.controlPtDistance(cubic, 2); double normalSquared = lineParameters.normalSquared(); size_t inner; for (inner = 0; inner < 2; ++inner) { double distSq = denormalizedDistance[inner]; distSq *= distSq; double answersSq = answers[index][inner]; answersSq *= answersSq; if (AlmostEqualUlps(distSq, normalSquared * answersSq)) { continue; } SkDebugf("%s [%d,%d] denormalizedDistance:%g != answer:%g" " distSq:%g answerSq:%g normalSquared:%g\n", __FUNCTION__, (int)index, (int)inner, denormalizedDistance[inner], answers[index][inner], distSq, answersSq, normalSquared); } lineParameters.normalize(); double normalizedDistance[2]; normalizedDistance[0] = lineParameters.controlPtDistance(cubic, 1); normalizedDistance[1] = lineParameters.controlPtDistance(cubic, 2); for (inner = 0; inner < 2; ++inner) { if (AlmostEqualUlps(fabs(normalizedDistance[inner]), answers[index][inner])) { continue; } SkDebugf("%s [%d,%d] normalizedDistance:%1.10g != answer:%g\n", __FUNCTION__, (int)index, (int)inner, normalizedDistance[inner], answers[index][inner]); } } }