package railo.runtime.img.interpolation;
public class Bessel implements Interpolation
{
private double J1(double x) {
double[] Pone
= { 5.811993540016061E20, -6.672106568924916E19,
2.3164335806340024E18, -3.588817569910106E16,
2.9087952638347756E14, -1.3229834803321265E12,
3.4132341823017006E9, -4695753.530642996, 2701.1227108923235 };
double[] Qone = { 1.1623987080032122E21, 1.185770712190321E19,
6.0920613989175216E16, 2.0816612213076075E14,
5.2437102621676495E11, 1.013863514358674E9,
1501793.5949985855, 1606.9315734814877, 1.0 };
double p = Pone[8];
double q = Qone[8];
for (int i = 7; i >= 0; i--) {
p = p * x * x + Pone[i];
q = q * x * x + Qone[i];
}
return p / q;
}
private double P1(double x) {
double[] Pone
= { 35224.66491336798, 62758.84524716128, 31353.963110915956,
4985.4832060594335, 211.15291828539623, 1.2571716929145342 };
double[] Qone
= { 35224.66491336798, 62694.34695935605, 31240.406381904104,
4930.396490181089, 203.07751891347593, 1.0 };
double p = Pone[5];
double q = Qone[5];
for (int i = 4; i >= 0; i--) {
p = p * (8.0 / x) * (8.0 / x) + Pone[i];
q = q * (8.0 / x) * (8.0 / x) + Qone[i];
}
return p / q;
}
private double Q1(double x) {
double[] Pone
= { 351.17519143035526, 721.0391804904475, 425.98730116544425,
83.18989576738508, 4.568171629551227, 0.03532840052740124 };
double[] Qone
= { 7491.737417180912, 15414.177339265098, 9152.231701516992,
1811.1867005523513, 103.81875854621337, 1.0 };
double p = Pone[5];
double q = Qone[5];
for (int i = 4; i >= 0; i--) {
p = p * (8.0 / x) * (8.0 / x) + Pone[i];
q = q * (8.0 / x) * (8.0 / x) + Qone[i];
}
return p / q;
}
private double BesselOrderOne(double x) {
if (x == 0.0)
return 0.0;
double p = x;
if (x < 0.0)
x = -x;
if (x < 8.0)
return p * J1(x);
double q
= (Math.sqrt(2.0 / (3.141592653589793 * x))
* (P1(x) * (1.0 / Math.sqrt(2.0) * (Math.sin(x) - Math.cos(x)))
- 8.0 / x * Q1(x) * (-1.0 / Math.sqrt(2.0)
* (Math.sin(x) + Math.cos(x)))));
if (p < 0.0)
q = -q;
return q;
}
public double f(double x) {
if (x == 0.0)
return 0.7853981633974483;
return BesselOrderOne(3.141592653589793 * x) / (2.0 * x);
}
public double getSupport() {
return 3.2383;
}
}