package org.freehep.math.minuit;
/**
*
* @version $Id: MnParabolaFactory.java 8584 2006-08-10 23:06:37Z duns $
*/
abstract class MnParabolaFactory
{
static MnParabola create(MnParabolaPoint p1, MnParabolaPoint p2, MnParabolaPoint p3)
{
double x1 = p1.x();
double x2 = p2.x();
double x3 = p3.x();
double dx12 = x1-x2;
double dx13 = x1-x3;
double dx23 = x2-x3;
double xm = (x1+x2+x3)/3.;
x1 -= xm;
x2 -= xm;
x3 -= xm;
double y1 = p1.y();
double y2 = p2.y();
double y3 = p3.y();
double a = y1/(dx12*dx13) - y2/(dx12*dx23) + y3/(dx13*dx23);
double b = -y1*(x2+x3)/(dx12*dx13) + y2*(x1+x3)/(dx12*dx23) - y3*(x1+x2)/(dx13*dx23);
double c = y1 - a*x1*x1 - b*x1;
c += xm*(xm*a - b);
b -= 2.*xm*a;
return new MnParabola(a, b, c);
}
static MnParabola create(MnParabolaPoint p1, double dxdy1, MnParabolaPoint p2)
{
double x1 = p1.x();
double xx1 = x1*x1;
double x2 = p2.x();
double xx2 = x2*x2;
double y1 = p1.y();
double y12 = p1.y() - p2.y();
double det = xx1-xx2 - 2.*x1*(x1-x2);
double a = -( y12 + (x2-x1)*dxdy1)/det;
double b = -( -2.*x1*y12 + (xx1-xx2)*dxdy1)/det;
double c = y1 - a*xx1 - b*x1;
return new MnParabola(a, b, c);
}
}