15 #ifndef MOTIVE_MATH_COMPACT_SPLINE_NODE_H_
16 #define MOTIVE_MATH_COMPACT_SPLINE_NODE_H_
18 #include "motive/common.h"
19 #include "motive/math/curve.h"
27 typedef uint16_t CompactSplineXGrain;
32 typedef uint16_t CompactSplineYRung;
37 typedef int16_t CompactSplineAngle;
63 const CompactSplineAngle angle)
64 : x_(x), y_(y), angle_(angle) {}
68 const float x_granularity,
const Range& y_range) {
69 SetX(x, x_granularity);
71 SetDerivative(derivative);
77 void SetX(
const float x,
const float x_granularity) {
78 x_ = CompactX(x, x_granularity);
80 void SetY(
const float y,
const Range& y_range) { y_ = CompactY(y, y_range); }
81 void SetDerivative(
const float derivative) {
82 angle_ = CompactDerivative(derivative);
87 float X(
const float x_granularity)
const {
88 return static_cast<float>(x_) * x_granularity;
90 float Y(
const Range& y_range)
const {
return y_range.
Lerp(YPercent()); }
91 float Derivative()
const {
return tan(
Angle()); }
94 CompactSplineXGrain x()
const {
return x_; }
95 CompactSplineYRung y()
const {
return y_; }
96 CompactSplineAngle angle()
const {
return angle_; }
101 return x_ == rhs.x_ && y_ == rhs.y_ && angle_ == rhs.angle_;
104 return !operator==(rhs);
109 static int QuantizeX(
const float x,
const float x_granularity) {
110 return static_cast<int>(x / x_granularity + 0.5f);
113 static CompactSplineXGrain CompactX(
const float x,
114 const float x_granularity) {
115 const int x_quantized = QuantizeX(x, x_granularity);
116 assert(0 <= x_quantized && x_quantized <= kMaxX);
117 return static_cast<CompactSplineXGrain
>(x_quantized);
120 static CompactSplineYRung CompactY(
const float y,
const Range& y_range) {
123 const CompactSplineYRung compact_y =
124 static_cast<CompactSplineYRung
>(kMaxY * y_percent);
128 static CompactSplineAngle CompactDerivative(
const float derivative) {
129 const float angle_radians = atan(derivative);
130 const CompactSplineAngle angle =
131 static_cast<CompactSplineAngle
>(angle_radians / kAngleScale);
135 static CompactSplineXGrain MaxX() {
return kMaxX; }
138 static const CompactSplineXGrain kMaxX;
139 static const CompactSplineYRung kMaxY;
140 static const CompactSplineAngle kMinAngle;
141 static const float kYScale;
142 static const float kAngleScale;
144 float YPercent()
const {
return static_cast<float>(y_) * kYScale; }
145 float Angle()
const {
return static_cast<float>(angle_) * kAngleScale; }
150 CompactSplineXGrain x_;
153 CompactSplineYRung y_;
156 CompactSplineAngle angle_;
162 #endif // MOTIVE_MATH_COMPACT_SPLINE_NODE_H_
T Lerp(const float percent) const
Definition: range.h:87
bool Contains(const T x) const
Return true if x is in [start_, end_], i.e. the inclusive range.
Definition: range.h:229
Definition: compact_spline_node.h:55
Represent an angle in radians, uniquely in the range (-pi, pi].
Definition: angle.h:97
T PercentClamped(const T x) const
Definition: range.h:97
Represent an interval on a number line.
Definition: range.h:37