supertux
bezier.hpp
1 // SuperTux
2 // Copyright (C) 2020 A. Semphris <semphris@protonmail.com>
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
16 
17 #ifndef HEADER_SUPERTUX_MATH_BEZIER_HPP
18 #define HEADER_SUPERTUX_MATH_BEZIER_HPP
19 
20 #include <math/vector.hpp>
21 
22 class Color;
23 class DrawingContext;
24 
25 class Bezier
26 {
27 public:
28  // p1 is first anchor, p2 is first handle, p3 is second handle, p4 is second anchor. T is progress from p1 towards p4.
29  static Vector get_point(const Vector& p1, const Vector& p2, const Vector& p3, const Vector& p4, float t);
30  // Same as above, but does not treat p1 == p2 && p3 == p4 as a special case
31  static Vector get_point_raw(const Vector& p1, const Vector& p2, const Vector& p3, const Vector& p4, float t);
32  // Calculates the full length of the bezier curve (approximated)
33  static float get_length(const Vector& p1, const Vector& p2, const Vector& p3, const Vector& p4, int steps = 100);
34  // Gets the point at the given length
35  static Vector get_point_at_length(const Vector& p1, const Vector& p2, const Vector& p3, const Vector& p4, float length, int steps = 100);
36  // Same as get_point but gets length-normalized
37  static Vector get_point_by_length(const Vector& p1, const Vector& p2, const Vector& p3, const Vector& p4, float t);
38  // FIXME: Move this to the Canvas object?
39  static void draw_curve(DrawingContext& context, const Vector& p1, const Vector& p2, const Vector& p3, const Vector& p4, int steps, Color color, int layer);
40 
41 private:
42  Bezier(const Bezier&) = delete;
43  Bezier& operator=(const Bezier&) = delete;
44 };
45 
46 #endif
47 
48 /* EOF */
Definition: bezier.hpp:25
Definition: color.hpp:26
This class provides functions for drawing things on screen.
Definition: drawing_context.hpp:42