5#define PARABOLA_FIT_CENTER_WEIGHT .1
14 double M[3][3], rhs[3],
a[3];
20 double M[6][6], rhs[6],
a[6];
47 case 0:
nx.x = -
nz.z/
nz.x;
nx.z = 1.0;
break;
48 case 1:
nx.y = -
nz.z/
nz.y;
nx.z = 1.0;
break;
49 case 2:
nx.z = -
nz.x/
nz.z;
nx.x = 1.0;
break;
58 p->t[0][0] =
nx.x;
p->t[0][1] =
nx.y;
p->t[0][2] =
nx.z;
59 p->t[1][0] =
ny.x;
p->t[1][1] =
ny.y;
p->t[1][2] =
ny.z;
60 p->t[2][0] =
nz.x;
p->t[2][1] =
nz.y;
p->t[2][2] =
nz.z;
67 for (
int i = 0;
i <
n;
i++) {
68 for (
int j = 0;
j <
n;
j++)
77 double x1 =
m.x -
p->o.x,
y1 =
m.y -
p->o.y;
78 double x =
p->m.y*
x1 -
p->m.x*
y1;
79 double y =
p->m.x*
x1 +
p->m.y*
y1;
82 p->M[1][0] +=
x3;
p->M[1][1] +=
x2;
83 p->M[2][1] +=
w*
x;
p->M[2][2] +=
w;
84 p->rhs[0] +=
x2*
y;
p->rhs[1] +=
w*
x*
y;
p->rhs[2] +=
w*
y;
86 double x1 =
m.
x -
p->o.x,
y1 =
m.y -
p->o.y,
z1 =
m.z -
p->o.z;
87 double x =
p->t[0][0]*
x1 +
p->t[0][1]*
y1 +
p->t[0][2]*
z1;
88 double y =
p->t[1][0]*
x1 +
p->t[1][1]*
y1 +
p->t[1][2]*
z1;
89 double z =
p->t[2][0]*
x1 +
p->t[2][1]*
y1 +
p->t[2][2]*
z1;
91 for (
int i = 0;
i <
NP;
i++)
92 for (
int j = 0;
j <
NP;
j++) {
93 for (
int k = 0;
k <
NP;
k++)
94 for (
int l = 0;
l <
NP;
l++)
102 p->M[3][3] +=
w*
x2;
p->M[4][4] +=
w*
y2;
p->M[5][5] +=
w;
109 p->rhs[3] +=
w*
x*
z;
p->rhs[4] +=
w*
y*
z;
p->rhs[5] +=
w*
z;
117 p->M[0][1] =
p->M[1][0];
118 p->M[0][2] =
p->M[2][0] =
p->M[1][1];
119 p->M[1][2] =
p->M[2][1];
122 p->a[0] =
p->M[0][0]*
p->rhs[0] +
p->M[0][1]*
p->rhs[1] +
p->M[0][2]*
p->rhs[2];
123 p->a[1] =
p->M[1][0]*
p->rhs[0] +
p->M[1][1]*
p->rhs[1] +
p->M[1][2]*
p->rhs[2];
126 p->a[0] =
p->a[1] = 0.;
131 for (
int i = 0;
i <
NP*
NP;
i++) {
133 for (
int j = 0;
j <
NP*
NP;
j++)
134 p->a[
i] +=
p->M[
i][
j]*
p->rhs[
j];
137 for (
int i = 0;
i <
NP*
NP;
i++)
140 p->M[0][1] =
p->M[2][2];
p->M[0][5] =
p->M[3][3];
141 p->M[1][5] =
p->M[4][4];
142 p->M[2][3] =
p->M[0][4];
p->M[2][4] =
p->M[1][3];
143 p->M[3][4] =
p->M[2][5];
144 for (
int i = 1;
i < 6;
i++)
145 for (
int j = 0;
j <
i;
j++)
149 for (
int i = 0;
i < 6;
i++) {
151 for (
int j = 0;
j < 6;
j++)
152 p->a[
i] +=
p->M[
i][
j]*
p->rhs[
j];
155 for (
int i = 0;
i < 6;
i++)
167 double dnm = 1.[0] +
sq(
p->a[1]);
176 double hxx = 2.*
p->a[0],
hyy = 2.*
p->a[1],
hxy =
p->a[2];
177 double hx =
p->a[3],
hy =
p->a[4];
203 double nr = (
p->m.x*
p->a[1] +
p->m.y)/
sqrt (1. +
sq(
p->a[1]));
define m((k)==0 &&(l)==0 &&(m)==0) macro2 foreach_point(double _x=0.
static number sq(number x)
double smatrix_inverse(const int n, double m[n][n], double pivmin)
return hxx pow(1.+sq(hx), 3/2.)
*cs[i, 0, 0] a *[i -1, 0, 0] j
static double parabola_fit_curvature(ParabolaFit *p, double kappamax, double *kmax)
static void parabola_fit_add(ParabolaFit *p, coord m, double w)
static void parabola_fit_init(ParabolaFit *p, coord o, coord m)
static double parabola_fit_solve(ParabolaFit *p)