Skip to content

Instantly share code, notes, and snippets.

@elvircrn
Last active December 25, 2016 16:56
Show Gist options
  • Save elvircrn/0a3865f9a360b5e8c7be647b8056f7d8 to your computer and use it in GitHub Desktop.
Save elvircrn/0a3865f9a360b5e8c7be647b8056f7d8 to your computer and use it in GitHub Desktop.
SplineInterpolator::SplineInterpolator(std::vector<GMath::Point2D> data) : cache(0)
{
DataSizeCheck(data);
sort(data.begin(), data.end());
for (auto& elem : data)
{
x.push_back(elem.first);
y.push_back(elem.second);
}
SameXCheck(data);
r.resize(data.size(), 0);
s.resize(data.size(), 0);
q.resize(data.size(), 0);
int n = GetSize();
for (int i = 1; i <= n - 2; i++)
{
s[i] = 2 * (x[i + 1] - x[i - 1]);
r[i] = 3 * ((y[i + 1] - y[i]) / (x[i + 1] - x[i]) - (y[i] - y[i - 1] / (x[i] - x[i - 1])));
}
for (int i = 1; i < n - 2; i++)
{
double mi = (x[i] - x[i - 1]) / s[i];
s[i + 1] -= mi * (x[i] - x[i - 1]);
r[i + 1] -= mi * r[i];
}
r[n - 2] /= s[n - 2];
for (int i = n - 3; i > 0; i--)
r[i] = (r[i] - (x[i] - x[i - 1]) * r[i + 1]) / s[i];
for (int i = 0; i < n - 1; i++)
{
double dx = x[i + 1] - x[i];
s[i] = (r[i + 1] - r[i]) / (3 * dx);
q[i] = (y[i + 1] - y[i]) / dx - dx * (r[i + 1] + 2 * r[i]) / 3;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment