Я предполагаю, что Кривая - это массив двухмерных точек над действительными числами, размер массива равен N
, поэтому я называю p[i]
i
-ую точку кривой; i
идет от 0
до N-1
.
Я также предполагаю, что две кривые имеют одинаковый размер и что имеет смысл «сравнить» i
-ую точку первой кривой с i
-ой точкой второй кривой.
Я звоню Delta
, действительное число, результат сравнения двух кривых.
Delta
может быть вычислено следующим образом:
Delta = 0;
for( i = 0; i < N; i++ ) {
Delta = Delta + distance(p[i],q[i]);
}
, где p
- точки от первой кривой, а q
- точки от второй кривой.
Теперь вам нужно выбрать подходящую distance
функцию в зависимости от вашей проблемы: функция имеет две точки в качестве аргумента и возвращает действительное число.
Например, distance
может быть обычным расстоянием двух точек на плоскости (теорема Пифагора и http://en.wikipedia.org/wiki/Euclidean_distance).
Пример метода в C ++:
#include <numeric>
#include <vector>
#include <cmath>
#include <iostream>
#include <functional>
#include <stdexcept>
typedef double Real_t;
class Point
{
public:
Point(){}
Point(std::initializer_list<Real_t> args):x(args.begin()[0]),y(args.begin()[1]){}
Point( const Real_t& xx, const Real_t& yy ):x(xx),y(yy){}
Real_t x,y;
};
typedef std::vector< Point > Curve;
Real_t point_distance( const Point& a, const Point& b )
{
return hypot(a.x-b.x,a.y-b.y);
}
Real_t curve_distance( const Curve& c1, const Curve& c2 )
{
if ( c1.size() != c2.size() ) throw std::invalid_argument("size mismatch");
return std::inner_product( c1.begin(), c1.end(), c2.begin(), Real_t(0), std::plus< Real_t >(), point_distance );
}
int main(int,char**)
{
Curve c1{{0,0},
{1,1},
{2,4},
{3,9}};
Curve c2{{0.1,-0.1},
{1.1,0.9},
{2.1,3.9},
{3.1,8.9}};
std::cout << curve_distance(c1,c2) << "\n";
return 0;
}
Если ваши две кривые имеют разный размер, вам нужно подумать, как расширить предыдущий метод, например, вы можете уменьшить размер самой длинной кривой с помощью подходящего алгоритма (например, Ramer – Douglas– Алгоритм Peucker может быть отправной точкой), чтобы он соответствовал размеру самой короткой кривой.
Я только что описал очень простой метод, вы также можете использовать разные подходы; например, вы можете подогнать две кривые к двум наборам точек и затем работать с двумя кривыми, выраженными в виде математической функции.