3#include <cgv/math/vec.h>
4#include <cgv/math/mat.h>
5#include <cgv/math/functions.h>
20void sqrdist_transf_1d(
const vec<T>& f, vec<T>& d)
22 static T INF =std::numeric_limits<T>::max();
23 unsigned n = f.size();
32 for (
unsigned q = 1; q <= n-1; q++)
34 T s = ((f[q]+sqr(q))-(f[v[k]]+sqr(v[k])))/(2*q-2*v[k]);
38 s = ((f[q]+sqr(q))-(f[v[k]]+sqr(v[k])))/(2*q-2*v[k]);
46 for (
unsigned q = 0; q <= n-1; q++)
50 d[q] = sqr(q-v[k]) + f[v[k]];
60void sqrdist_transf_2d(mat<T> &im)
62 static T INF =std::numeric_limits<T>::max();
63 unsigned width = im.ncols();
64 unsigned height = im.nrows();
69 for (
unsigned x = 0; x < width; x++)
71 sqrdist_transf_1d<T>(im.col(x), d);
76 for (
unsigned y = 0; y < height; y++)
78 sqrdist_transf_1d<T>(im.row(y), d);
86void sqrdist_transf_2d(
const mat<T>& input,mat<T>& output,T on = 1)
88 static T INF =std::numeric_limits<T>::max();
89 unsigned width = input.nrows();
90 unsigned height = input.ncols();
91 output.resize(width,height);
93 for (
unsigned y = 0; y < height; y++)
95 for (
unsigned x = 0; x < width; x++)
105 sqrdist_transf_2d<T>(output);
111void dist_transf_2d(mat<T>& input, mat<T>& output,T on = 1)
113 sqrdist_transf_2d(input,output,on );
114 for(
unsigned y = 0; y < output.ncols();y++)
116 for(
unsigned x = 0; x < output.nrows();x++)
118 output(x,y)=sqrt(output(x,y));