mirror of
https://github.com/love2d/love.git
synced 2026-08-16 08:11:02 +02:00
[BezierCurve] Add getDerivative(), move(), rotate() and scale().
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
#include "BezierCurve.h"
|
||||
#include "common/Exception.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
|
||||
using namespace std;
|
||||
|
||||
@@ -87,6 +87,21 @@ BezierCurve::BezierCurve(const vector<Vector> &pts)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BezierCurve BezierCurve::getDerivative() const
|
||||
{
|
||||
if (getDegree() < 1)
|
||||
throw Exception("Cannot derive a curve of degree < 1.");
|
||||
// actually we can, it just doesn't make any sense.
|
||||
|
||||
vector<Vector> forward_differences(controlPoints.size()-1);
|
||||
float degree = float(getDegree());
|
||||
for (size_t i = 0; i < forward_differences.size(); ++i)
|
||||
forward_differences[i] = (controlPoints[i+1] - controlPoints[i]) * degree;
|
||||
|
||||
return BezierCurve(forward_differences);
|
||||
}
|
||||
|
||||
const Vector &BezierCurve::getControlPoint(int i) const
|
||||
{
|
||||
if (i < 0)
|
||||
@@ -120,6 +135,29 @@ void BezierCurve::insertControlPoint(const Vector &point, int pos)
|
||||
controlPoints.insert(controlPoints.begin() + pos, point);
|
||||
}
|
||||
|
||||
void BezierCurve::translate(const Vector &t)
|
||||
{
|
||||
for (size_t i = 0; i < controlPoints.size(); ++i)
|
||||
controlPoints[i] += t;
|
||||
}
|
||||
|
||||
void BezierCurve::rotate(double phi, const Vector ¢er)
|
||||
{
|
||||
float c = cos(phi), s = sin(phi);
|
||||
for (size_t i = 0; i < controlPoints.size(); ++i)
|
||||
{
|
||||
Vector v = controlPoints[i] - center;
|
||||
controlPoints[i].x = c * v.x - s * v.y + center.x;
|
||||
controlPoints[i].y = s * v.x + c * v.y + center.y;
|
||||
}
|
||||
}
|
||||
|
||||
void BezierCurve::scale(double s, const Vector ¢er)
|
||||
{
|
||||
for (size_t i = 0; i < controlPoints.size(); ++i)
|
||||
controlPoints[i] = (controlPoints[i] - center) * s + center;
|
||||
}
|
||||
|
||||
Vector BezierCurve::eval(double t) const
|
||||
{
|
||||
if (t < 0 || t > 1)
|
||||
|
||||
Reference in New Issue
Block a user