| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FLUTTER_IMPELLER_GEOMETRY_WANGS_FORMULA_H_ |
| #define FLUTTER_IMPELLER_GEOMETRY_WANGS_FORMULA_H_ |
| |
| #include "impeller/geometry/path_component.h" |
| #include "impeller/geometry/point.h" |
| #include "impeller/geometry/scalar.h" |
| |
| // Skia GPU Ports |
| |
| // Wang's formula gives the minimum number of evenly spaced (in the parametric |
| // sense) line segments that a bezier curve must be chopped into in order to |
| // guarantee all lines stay within a distance of "1/precision" pixels from the |
| // true curve. Its definition for a bezier curve of degree "n" is as follows: |
| // |
| // maxLength = max([length(p[i+2] - 2p[i+1] + p[i]) for (0 <= i <= n-2)]) |
| // numParametricSegments = sqrt(maxLength * precision * n*(n - 1)/8) |
| // |
| // (Goldman, Ron. (2003). 5.6.3 Wang's Formula. "Pyramid Algorithms: A Dynamic |
| // Programming Approach to Curves and Surfaces for Geometric Modeling". Morgan |
| // Kaufmann Publishers.) |
| namespace impeller { |
| |
| /// Returns the minimum number of evenly spaced (in the parametric sense) line |
| /// segments that the cubic must be chopped into in order to guarantee all lines |
| /// stay within a distance of "1/intolerance" pixels from the true curve. |
| /// |
| /// The scale_factor should be the max basis XY of the current transform. |
| Scalar ComputeCubicSubdivisions(Scalar scale_factor, |
| Point p0, |
| Point p1, |
| Point p2, |
| Point p3); |
| |
| /// Returns the minimum number of evenly spaced (in the parametric sense) line |
| /// segments that the quadratic must be chopped into in order to guarantee all |
| /// lines stay within a distance of "1/intolerance" pixels from the true curve. |
| /// |
| /// The scale_factor should be the max basis XY of the current transform. |
| Scalar ComputeQuadradicSubdivisions(Scalar scale_factor, |
| Point p0, |
| Point p1, |
| Point p2); |
| |
| /// Returns the minimum number of evenly spaced (in the parametric sense) line |
| /// segments that the quadratic must be chopped into in order to guarantee all |
| /// lines stay within a distance of "1/intolerance" pixels from the true curve. |
| /// |
| /// The scale_factor should be the max basis XY of the current transform. |
| Scalar ComputeQuadradicSubdivisions(Scalar scale_factor, |
| const QuadraticPathComponent& quad); |
| |
| /// Returns the minimum number of evenly spaced (in the parametric sense) line |
| /// segments that the cubic must be chopped into in order to guarantee all lines |
| /// stay within a distance of "1/intolerance" pixels from the true curve. |
| /// |
| /// The scale_factor should be the max basis XY of the current transform. |
| Scalar ComputeCubicSubdivisions(float scale_factor, |
| const CubicPathComponent& cub); |
| } // namespace impeller |
| |
| #endif // FLUTTER_IMPELLER_GEOMETRY_WANGS_FORMULA_H_ |