// David Eberly, Geometric Tools, Redmond WA 98052 // Copyright (c) 1998-2020 // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt // https://www.geometrictools.com/License/Boost/LICENSE_1_0.txt // Version: 4.0.2019.08.13 #pragma once #include #include // The queries consider the arc to be a 1-dimensional object. namespace WwiseGTE { template class TIQuery, Arc2> { public: struct Result { bool intersect; }; Result operator()(Line2 const& line, Arc2 const& arc) { Result result; FIQuery, Arc2> laQuery; auto laResult = laQuery(line, arc); result.intersect = laResult.intersect; return result; } }; template class FIQuery, Arc2> { public: struct Result { bool intersect; int numIntersections; std::array parameter; std::array, 2> point; }; Result operator()(Line2 const& line, Arc2 const& arc) { Result result; FIQuery, Circle2> lcQuery; Circle2 circle(arc.center, arc.radius); auto lcResult = lcQuery(line, circle); if (lcResult.intersect) { // Test whether line-circle intersections are on the arc. result.numIntersections = 0; for (int i = 0; i < lcResult.numIntersections; ++i) { if (arc.Contains(lcResult.point[i])) { result.intersect = true; result.parameter[result.numIntersections] = lcResult.parameter[i]; result.point[result.numIntersections++] = lcResult.point[i]; } } } else { result.intersect = false; result.numIntersections = 0; } return result; } }; }