Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

(или 1 / R, где R — радиус кривизны в данной точке).



aChartEngine, вроде как самая популярная библиотека построения графиков для Android
Больше всего похоже на кривую Безье степени n – 1, хотя в самой библиотеке график называется «cubic line».
интерполировать экспонентой по МНКЭто уже аппроксимация получается. :)
g++ -pipe -std=c++11 -g -ggdb -ggdb3 -O0 -DDEBUG -finline-functions -Wall -Wextra -Wpedantic -Wshadow -Wconversion -Wsign-conversion -Winit-self -Wunreachable-code -Wformat-y2k -Wformat-nonliteral -Wformat-security -Wmissing-include-dirs -Wswitch-default -Wtrigraphs -Wstrict-overflow=5 -Wfloat-equal -Wundef -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings -Winline -Wsuggest-attribute=const -Wsuggest-attribute=pure -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wmissing-format-attribute -Wlogical-op -o TBezierInterpolation TBezierInterpolation.cpp -lm
warning: conversion to ‘int’ from ‘std::vector<Point2D>::size_type {aka long unsigned int}’ may alter its value
testValues.push_back(Point2D(0, 0));
testValues.push_back(Point2D(20, 0));
testValues.push_back(Point2D(45, -47));
testValues.push_back(Point2D(53, 335));
testValues.push_back(Point2D(57, 26));
testValues.push_back(Point2D(62, 387));
testValues.push_back(Point2D(74, 104));
testValues.push_back(Point2D(89, 0));
testValues.push_back(Point2D(95, 100));

--- TBezierInterpolation.cpp 2017-06-03 18:46:11.322309503 +0300
+++ TBezierInterpolation.cpp 2017-06-03 18:49:02.960312804 +0300
@@ -63,21 +63,26 @@
double l1, l2, tmp, x;
- --n;
for (int i = 0; i < n; ++i)
{
bezier[i].points[0] = bezier[i].points[1] = values[i];
bezier[i].points[2] = bezier[i].points[3] = values[i + 1];
- cur = next;
- next = values[i + 2] - values[i + 1];
- next.normalize();
-
tgL = tgR;
-
- tgR = cur + next;
- tgR.normalize();
+ cur = next;
+
+ if(i+1 < n){
+ next = values[i + 2] - values[i + 1];
+ next.normalize();
+
+ tgR = cur + next;
+ tgR.normalize();
+ }else{
+ tgR.x= 0.0;
+ tgR.y= 0.0;
+ }
+
if (abs(values[i + 1].y - values[i].y) < EPSILON)
{
@@ -120,12 +125,6 @@
bezier[i].points[2] -= tgR * l2;
}
- l1 = abs(tgL.x) > EPSILON ? (values[n + 1].x - values[n].x) / (2.0 * tgL.x) : 1.0;
-
- bezier[n].points[0] = bezier[n].points[1] = values[n];
- bezier[n].points[2] = bezier[n].points[3] = values[n + 1];
- bezier[n].points[1] += tgR * l1;
-
return true;
}
39 -123,790531
54 -121,828107
81 -29,500421
111 -42,9229
158 -31,067327
170 0,077761
213 -61,771285
259 -75,374474
265 -90,913339
124 50,435864
170 108,906317
171 159,643421
209 149,011485
254 214,373123
297 293,43677
310 206,841167
350 219,560966
388 221,341568
Интерполяция данных: соединяем точки так, чтобы было красиво