Flutter Engine
The Flutter Engine
wangs_formula.h
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef FLUTTER_IMPELLER_GEOMETRY_WANGS_FORMULA_H_
6#define FLUTTER_IMPELLER_GEOMETRY_WANGS_FORMULA_H_
7
11
12// Skia GPU Ports
13
14// Wang's formula gives the minimum number of evenly spaced (in the parametric
15// sense) line segments that a bezier curve must be chopped into in order to
16// guarantee all lines stay within a distance of "1/precision" pixels from the
17// true curve. Its definition for a bezier curve of degree "n" is as follows:
18//
19// maxLength = max([length(p[i+2] - 2p[i+1] + p[i]) for (0 <= i <= n-2)])
20// numParametricSegments = sqrt(maxLength * precision * n*(n - 1)/8)
21//
22// (Goldman, Ron. (2003). 5.6.3 Wang's Formula. "Pyramid Algorithms: A Dynamic
23// Programming Approach to Curves and Surfaces for Geometric Modeling". Morgan
24// Kaufmann Publishers.)
25namespace impeller {
26
27/// Returns the minimum number of evenly spaced (in the parametric sense) line
28/// segments that the cubic must be chopped into in order to guarantee all lines
29/// stay within a distance of "1/intolerance" pixels from the true curve.
30///
31/// The scale_factor should be the max basis XY of the current transform.
33 Point p0,
34 Point p1,
35 Point p2,
36 Point p3);
37
38/// Returns the minimum number of evenly spaced (in the parametric sense) line
39/// segments that the quadratic must be chopped into in order to guarantee all
40/// lines stay within a distance of "1/intolerance" pixels from the true curve.
41///
42/// The scale_factor should be the max basis XY of the current transform.
44 Point p0,
45 Point p1,
46 Point p2);
47
48/// Returns the minimum number of evenly spaced (in the parametric sense) line
49/// segments that the quadratic must be chopped into in order to guarantee all
50/// lines stay within a distance of "1/intolerance" pixels from the true curve.
51///
52/// The scale_factor should be the max basis XY of the current transform.
54 const QuadraticPathComponent& quad);
55
56/// Returns the minimum number of evenly spaced (in the parametric sense) line
57/// segments that the cubic must be chopped into in order to guarantee all lines
58/// stay within a distance of "1/intolerance" pixels from the true curve.
59///
60/// The scale_factor should be the max basis XY of the current transform.
61Scalar ComputeCubicSubdivisions(float scale_factor,
62 const CubicPathComponent& cub);
63} // namespace impeller
64
65#endif // FLUTTER_IMPELLER_GEOMETRY_WANGS_FORMULA_H_
float Scalar
Definition: scalar.h:18
TPoint< Scalar > Point
Definition: point.h:322
Scalar ComputeQuadradicSubdivisions(Scalar scale_factor, Point p0, Point p1, Point p2)
Scalar ComputeCubicSubdivisions(Scalar scale_factor, Point p0, Point p1, Point p2, Point p3)