jbb01 2024-08-09 14:42:45 +02:00
parent 23c7a550ec
commit 787874d106
22 changed files with 1404 additions and 6 deletions

View File

@ -1,6 +1,5 @@
package eu.jonahbauer.raytracing; package eu.jonahbauer.raytracing;
import eu.jonahbauer.raytracing.math.AABB;
import eu.jonahbauer.raytracing.math.Vec3; import eu.jonahbauer.raytracing.math.Vec3;
import eu.jonahbauer.raytracing.render.texture.CheckerTexture; import eu.jonahbauer.raytracing.render.texture.CheckerTexture;
import eu.jonahbauer.raytracing.render.texture.Color; import eu.jonahbauer.raytracing.render.texture.Color;
@ -293,7 +292,7 @@ public class Examples {
return new Example( return new Example(
new Scene(getSkyBox(), List.of( new Scene(getSkyBox(), List.of(
new Sphere(Vec3.ZERO, 2, new LambertianMaterial(new ImageTexture("/earthmap.jpg"))) new Sphere(Vec3.ZERO, 2, new LambertianMaterial(new ImageTexture("/eu/jonahbauer/raytracing/textures/earthmap.jpg")))
)), )),
SimpleCamera.builder() SimpleCamera.builder()
.withImage(height * 16 / 9, height) .withImage(height * 16 / 9, height)
@ -369,7 +368,7 @@ public class Examples {
)); ));
// textures spheres // textures spheres
objects.add(new Sphere(new Vec3(400, 200, 400), 100, new LambertianMaterial(new ImageTexture("/earthmap.jpg")))); objects.add(new Sphere(new Vec3(400, 200, 400), 100, new LambertianMaterial(new ImageTexture("/eu/jonahbauer/raytracing/textures/earthmap.jpg"))));
objects.add(new Sphere(new Vec3(220, 280, 300), 80, new LambertianMaterial(new PerlinTexture(0.2)))); objects.add(new Sphere(new Vec3(220, 280, 300), 80, new LambertianMaterial(new PerlinTexture(0.2))));
// box from spheres // box from spheres

View File

@ -0,0 +1,72 @@
package eu.jonahbauer.raytracing.math;
import org.jetbrains.annotations.NotNull;
public record Matrix3(
double a11, double a12, double a13,
double a21, double a22, double a23,
double a31, double a32, double a33
) {
public Matrix3() {
this(1, 1, 1);
}
public Matrix3(double a11, double a22, double a33) {
this(a11, 0, 0, 0, a22, 0, 0, 0, a33);
}
public @NotNull Matrix3 times(@NotNull Matrix3 other) {
return new Matrix3(
a11 * other.a11 + a12 * other.a21 + a13 * other.a31,
a11 * other.a12 + a12 * other.a22 + a13 * other.a32,
a11 * other.a13 + a12 * other.a23 + a13 * other.a33,
a21 * other.a11 + a22 * other.a21 + a23 * other.a31,
a21 * other.a12 + a22 * other.a22 + a23 * other.a32,
a21 * other.a13 + a22 * other.a23 + a23 * other.a33,
a31 * other.a11 + a32 * other.a21 + a33 * other.a31,
a31 * other.a12 + a32 * other.a22 + a33 * other.a32,
a31 * other.a13 + a32 * other.a23 + a33 * other.a33
);
}
public @NotNull Matrix3 times(double other) {
return new Matrix3(
a11 * other, a12 * other, a13 * other,
a21 * other, a22 * other, a23 * other,
a31 * other, a32 * other, a33 * other
);
}
public @NotNull Vec3 times(@NotNull Vec3 other) {
return new Vec3(
a11 * other.x() + a12 * other.y() + a13 * other.z(),
a21 * other.x() + a22 * other.y() + a23 * other.z(),
a31 * other.x() + a32 * other.y() + a33 * other.z()
);
}
public @NotNull Matrix3 plus(@NotNull Matrix3 other) {
return new Matrix3(
a11 + other.a11, a12 + other.a12, a13 + other.a13,
a21 + other.a21, a22 + other.a22, a23 + other.a23,
a31 + other.a31, a32 + other.a32, a33 + other.a33
);
}
public double det() {
return a11 * a22 * a33 + a12 * a23 * a31 + a13 * a21 * a32
- a13 * a22 * a31 - a23 * a32 * a11 - a33 * a12 * a21;
}
public @NotNull Matrix3 invert() {
var det = det();
if (det == 0) throw new IllegalStateException();
var t = 1 / det;
return new Matrix3(
t * (a22 * a33 - a23 * a32), t * (-a12 * a33 + a13 * a32), t * (a12 * a23 - a13 * a22),
t * (-a21 * a33 + a23 * a31), t * (a11 * a33 - a13 * a31), t * (-a11 * a23 + a13 * a21),
t * (a21 * a32 - a22 * a31), t * (a11 * a32 + a12 * a31), t * (a11 * a22 - a12 * a21)
);
}
}

View File

@ -0,0 +1,71 @@
package eu.jonahbauer.raytracing.render.spectral;
import eu.jonahbauer.raytracing.render.spectral.colors.ColorSpace;
import eu.jonahbauer.raytracing.render.spectral.colors.ColorXYZ;
import eu.jonahbauer.raytracing.render.spectral.spectrum.Spectrum;
import eu.jonahbauer.raytracing.render.texture.Color;
import org.jetbrains.annotations.NotNull;
public final class SampledSpectrum {
private final double @NotNull[] values;
public SampledSpectrum(@NotNull SampledWavelengths lambdas, @NotNull Spectrum spectrum) {
var values = new double[lambdas.size()];
for (int i = 0; i < values.length; i++) {
values[i] = spectrum.get(lambdas.get(i));
}
this.values = values;
}
private SampledSpectrum(double @NotNull[] values) {
this.values = values;
}
public static @NotNull SampledSpectrum multiply(@NotNull SampledSpectrum a, @NotNull SampledSpectrum b) {
var out = new double[a.values.length];
for (int i = 0; i < a.values.length; i++) {
out[i] = a.values[i] * b.values[i];
}
return new SampledSpectrum(out);
}
public static @NotNull SampledSpectrum multiply(@NotNull SampledSpectrum a, double b) {
var out = new double[a.values.length];
for (int i = 0; i < a.values.length; i++) {
out[i] = a.values[i] * b;
}
return new SampledSpectrum(out);
}
public static @NotNull SampledSpectrum add(@NotNull SampledSpectrum a, @NotNull SampledSpectrum b) {
var out = new double[a.values.length];
for (int i = 0; i < a.values.length; i++) {
out[i] = a.values[i] + b.values[i];
}
return new SampledSpectrum(out);
}
public double get(int index) {
return values[index];
}
public int size() {
return values.length;
}
public double average() {
double avg = 0;
for (int i = 0; i < values.length; i++) {
avg = Math.fma(1d / (i + 1), values[i] - avg, avg);
}
return avg;
}
public @NotNull ColorXYZ toXYZ(@NotNull SampledWavelengths lambdas) {
return lambdas.toXYZ(this);
}
public @NotNull Color toRGB(@NotNull SampledWavelengths lambdas, @NotNull ColorSpace cs) {
return cs.toRGB(toXYZ(lambdas));
}
}

View File

@ -0,0 +1,91 @@
package eu.jonahbauer.raytracing.render.spectral;
import eu.jonahbauer.raytracing.render.spectral.colors.ColorXYZ;
import eu.jonahbauer.raytracing.render.spectral.spectrum.Spectra;
import eu.jonahbauer.raytracing.render.spectral.spectrum.Spectrum;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
/**
* A set of sampled wavelength that can be tracked together.
*/
public final class SampledWavelengths {
private final double @NotNull[] lambdas;
private final double @NotNull[] pdf;
public static @NotNull SampledWavelengths uniform(double rng) {
return uniform(rng, Spectrum.LAMBDA_MIN, Spectrum.LAMBDA_MAX);
}
public static @NotNull SampledWavelengths uniform(double rng, double min, double max) {
var lambdas = new double[Spectrum.SAMPLES];
// choose first sample at random
lambdas[0] = (1 - rng) * min + rng * max;
// choose next samples in equal intervals, wrapping if necessary
var delta = (max - min) / Spectrum.SAMPLES;
for (int i = 1; i < Spectrum.SAMPLES; i++) {
lambdas[i] = lambdas[i - 1] + delta;
if (lambdas[i] > max) {
lambdas[i] = min + (lambdas[i] - max);
}
}
var pdf = new double[Spectrum.SAMPLES];
Arrays.fill(pdf, 1 / (max - min));
return new SampledWavelengths(lambdas, pdf);
}
private SampledWavelengths(double @NotNull[] lambdas, double @NotNull[] pdf) {
this.lambdas = lambdas;
this.pdf = pdf;
}
public double get(int index) {
return lambdas[index];
}
public int size() {
return lambdas.length;
}
/**
* Terminates the secondary wavelengths. This method should be called after a wavelength-dependent operation like
* refraction that makes it incorrect to track multiple wavelengths together.
*/
public void terminateSecondary() {
if (pdf.length < 2 || pdf[1] == 0) return;
Arrays.fill(pdf, 1, pdf.length, 0d);
pdf[0] /= pdf.length;
}
@NotNull
ColorXYZ toXYZ(@NotNull SampledSpectrum spectrum) {
var x = Spectra.X().sample(this);
var y = Spectra.Y().sample(this);
var z = Spectra.Z().sample(this);
return new ColorXYZ(
toXYZ0(spectrum, x) / ColorXYZ.CIE_Y_INTEGRAL,
toXYZ0(spectrum, y) / ColorXYZ.CIE_Y_INTEGRAL,
toXYZ0(spectrum, z) / ColorXYZ.CIE_Y_INTEGRAL
);
}
private double toXYZ0(@NotNull SampledSpectrum spectrum, @NotNull SampledSpectrum cie) {
var avg = 0d;
for (int i = 0; i < spectrum.size(); i++) {
var pdf = this.pdf[i];
double value;
if (pdf == 0) {
value = 0;
} else {
value = spectrum.get(i) * cie.get(i) / pdf;
}
avg = Math.fma(1d / (i + 1), value - avg, avg);
}
return avg;
}
}

View File

@ -0,0 +1,4 @@
package eu.jonahbauer.raytracing.render.spectral.colors;
public record Chromaticity(double x, double y) {
}

View File

@ -0,0 +1,103 @@
package eu.jonahbauer.raytracing.render.spectral.colors;
import eu.jonahbauer.raytracing.math.Matrix3;
import eu.jonahbauer.raytracing.render.spectral.spectrum.DenselySampledSpectrum;
import eu.jonahbauer.raytracing.render.spectral.spectrum.Spectrum;
import eu.jonahbauer.raytracing.render.texture.Color;
import org.jetbrains.annotations.NotNull;
import java.util.NoSuchElementException;
import java.util.Objects;
/**
* An RGB color space.
*/
public final class ColorSpace {
public static final @NotNull ColorSpace sRGB;
public static final @NotNull ColorSpace DCI_P3;
public static final @NotNull ColorSpace Rec2020;
private final @NotNull Chromaticity r;
private final @NotNull Chromaticity g;
private final @NotNull Chromaticity b;
private final @NotNull Chromaticity w;
private final @NotNull DenselySampledSpectrum illuminant;
private final @NotNull Matrix3 XYZfromRGB;
private final @NotNull Matrix3 RGBfromXYZ;
private final @NotNull SpectrumTable RGBtoSpectrumTable;
public static ColorSpace getNamed(@NotNull String name) {
return switch (name) {
case "sRGB" -> sRGB;
case "DCI-P3" -> DCI_P3;
case "Rec2020" -> Rec2020;
default -> throw new NoSuchElementException("unknown color space " + name);
};
}
public ColorSpace(
@NotNull Chromaticity r, @NotNull Chromaticity g, @NotNull Chromaticity b,
@NotNull Spectrum illuminant, @NotNull SpectrumTable table
) {
this.r = Objects.requireNonNull(r, "r");
this.g = Objects.requireNonNull(r, "g");
this.b = Objects.requireNonNull(r, "b");
this.illuminant = new DenselySampledSpectrum(illuminant);
this.RGBtoSpectrumTable = table;
var W = illuminant.toXYZ();
this.w = W.xy();
var R = new ColorXYZ(r);
var G = new ColorXYZ(g);
var B = new ColorXYZ(b);
var rgb = new Matrix3(
R.x(), G.x(), B.x(),
R.y(), G.y(), B.y(),
R.z(), G.z(), B.z()
);
var C = rgb.invert().times(W.toVec3());
this.XYZfromRGB = rgb.times(new Matrix3(C.x(), C.y(), C.z()));
this.RGBfromXYZ = XYZfromRGB.invert();
}
public @NotNull Color toRGB(@NotNull ColorXYZ xyz) {
var out = RGBfromXYZ.times(xyz.toVec3());
return new Color(out.x(), out.y(), out.z());
}
public @NotNull ColorXYZ toXYZ(@NotNull Color rgb) {
var out = XYZfromRGB.times(rgb.toVec3());
return new ColorXYZ(out);
}
public @NotNull SigmoidPolynomial toSpectrum(@NotNull Color rgb) {
return RGBtoSpectrumTable.get(new Color(
Math.max(0, rgb.r()),
Math.max(0, rgb.g()),
Math.max(0, rgb.b())
));
}
public @NotNull Chromaticity r() {
return r;
}
public @NotNull Chromaticity g() {
return g;
}
public @NotNull Chromaticity b() {
return b;
}
public @NotNull Chromaticity w() {
return w;
}
public @NotNull DenselySampledSpectrum illuminant() {
return illuminant;
}
}

View File

@ -0,0 +1,52 @@
package eu.jonahbauer.raytracing.render.spectral.colors;
import eu.jonahbauer.raytracing.math.Vec3;
import org.jetbrains.annotations.NotNull;
/**
* A CIE XYZ color
*/
public record ColorXYZ(double x, double y, double z) {
public static final double CIE_Y_INTEGRAL = 106.85689500000002;
public ColorXYZ(@NotNull Chromaticity chromaticity) {
this(chromaticity, 1);
}
public ColorXYZ(@NotNull Chromaticity chromaticity, double Y) {
this(
chromaticity.y() == 0 ? 0 : Y * chromaticity.x() / chromaticity.y(),
chromaticity.y() == 0 ? 0 : Y,
chromaticity.y() == 0 ? 0 : Y * (1 - chromaticity.x() - chromaticity.y()) / chromaticity.y()
);
}
public ColorXYZ(@NotNull Vec3 vec) {
this(vec.x(), vec.y(), vec.z());
}
public double average() {
return (x + y + z) / 3;
}
public @NotNull Chromaticity xy() {
var factor = 1 / (x + y + z);
return new Chromaticity(factor * x, factor * y);
}
public @NotNull Vec3 toVec3() {
return new Vec3(x, y, z);
}
public static @NotNull ColorXYZ multiply(@NotNull ColorXYZ a, @NotNull ColorXYZ b) {
return new ColorXYZ(a.x * b.x, a.y * b.y, a.z * b.z);
}
public static @NotNull ColorXYZ multiply(@NotNull ColorXYZ a, double b) {
return new ColorXYZ(a.x * b, a.y * b, a.z * b);
}
public static @NotNull ColorXYZ add(@NotNull ColorXYZ a, @NotNull ColorXYZ b) {
return new ColorXYZ(a.x + b.x, a.y + b.y, a.z + b.z);
}
}

View File

@ -0,0 +1,34 @@
package eu.jonahbauer.raytracing.render.spectral.colors;
import eu.jonahbauer.raytracing.render.spectral.spectrum.Spectrum;
/**
* A function of the form {@code s(p(x))} where {@code p} is a polynomial of second degree and {@code s} is the sigmoid
* function <code>s(x) = 0.5 + x / (2 * sqrt(1 + x^2))</code>.
* <p>
* A function of this form is used to generate a {@link Spectrum} from an RGB value.
*
* @param c0 the coefficient of the quadratic term
* @param c1 the coefficient of the linear term
* @param c2 the coefficient of the constant term
*/
public record SigmoidPolynomial(double c0, double c1, double c2) {
public double get(double x) {
var p = Math.fma(x, Math.fma(x, c0, c1), c2);
if (!Double.isFinite(p)) return p > 0 ? 1 : 0;
return .5 + x / (p * Math.sqrt(1 + p * p));
}
public double max() {
// evaluate at the edges
var result = Math.max(get(Spectrum.LAMBDA_MIN), get(Spectrum.LAMBDA_MAX));
var lambda = -c1 / (2 * c0);
if (lambda >= 360 && lambda <= 830) {
// evaluate at the vertex
return Math.max(result, get(lambda));
} else {
return result;
}
}
}

View File

@ -0,0 +1,91 @@
package eu.jonahbauer.raytracing.render.spectral.colors;
import eu.jonahbauer.raytracing.render.texture.Color;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
/**
* A table of sigmoid polynomials used to convert between RGB values and spectra.
* <p>
* The rgb values are renormalized to xyz coordinates with {@code z} being the largest of the rgb components, and
* {@code x} and {@code y} being the other two rgb components divided by {@code z}. By this construction, {@code x},
* {@code y} and {@code z} are all in the range [0, 1] which allows for better use of the samples in a fixed grid.
* The {@code z} coordinate is additionally remapped using {@link #zNodes} to improve sampling at both ends of the scale.
* <p>
* The coefficients of the sigmoid functions are stored in a five-dimensional array with indices as described in
* {@link #coefficients}.
*/
public final class SpectrumTable {
private static final int RESOLUTION = 64;
/**
* the remapped {@code z} values
*/
private final double[] zNodes;
/**
* the stored coefficients, with the following indices
* <ol>
* <li>the component index of the biggest rgb component</li>
* <li>the {@code z} coordinate</li>
* <li>the {@code y} coordinate</li>
* <li>the {@code x} coordinate</li>
* <li>the coefficient index</li>
* </ol>
*/
private final double[][][][][] coefficients;
public SpectrumTable(double[] zNodes, double[][][][][] coefficients) {
this.zNodes = zNodes;
this.coefficients = coefficients;
}
public @NotNull SigmoidPolynomial get(@NotNull Color color) {
// handle uniform rgb values
if (color.r() == color.g() && color.g() == color.b()) {
return new SigmoidPolynomial(0, 0, (color.r() - .5) / Math.sqrt(color.r() * (1 - color.r())));
}
// find maximum component and compute remapped component values
var max = color.r() > color.g()
? (color.r() > color.b() ? 0 : 2)
: (color.g() > color.b() ? 1 : 2);
var z = color.component(max);
var x = color.component((max + 1) % 3) * (RESOLUTION - 1) / z;
var y = color.component((max + 2) % 3) * (RESOLUTION - 1) / z;
// compute integer indices and offsets for coefficient interpolation
int xi = Math.min((int) x, RESOLUTION - 2);
int yi = Math.min((int) y, RESOLUTION - 2);
int zi = Arrays.binarySearch(zNodes, z);
if (zi < 0) zi = -zi - 1;
zi++;
var dx = x - xi;
var dy = y -yi;
var dz = (z - zNodes[zi]) / (zNodes[zi + 1] - zNodes[zi]);
// trilinearly interpolate sigmoid polynomial coefficients
var c = new double[3];
for (int i = 0; i < 3; i++) {
c[i] = lerp(dz,
lerp(dy,
lerp(dx, coefficients[max][zi + 0][yi + 0][xi + 0][i], coefficients[max][zi + 0][yi + 0][xi + 1][i]),
lerp(dx, coefficients[max][zi + 0][yi + 1][xi + 0][i], coefficients[max][zi + 0][yi + 1][xi + 1][i])
),
lerp(dy,
lerp(dx, coefficients[max][zi + 1][yi + 0][xi + 0][i], coefficients[max][zi + 1][yi + 0][xi + 1][i]),
lerp(dx, coefficients[max][zi + 1][yi + 1][xi + 0][i], coefficients[max][zi + 1][yi + 1][xi + 1][i])
)
);
}
return new SigmoidPolynomial(c[0], c[1], c[2]);
}
private static double lerp(double t, double a, double b) {
return Math.fma(t, b, Math.fma(-t, a, a));
}
}

View File

@ -0,0 +1,45 @@
package eu.jonahbauer.raytracing.render.spectral.spectrum;
public final class BlackbodySpectrum implements Spectrum {
/**
* the speed of light in m/s
*/
private static final double c = 299792458d;
/**
* the planck constant in m^2*kg/s
*/
private static final double h = 6.62607015E-34;
/**
* the boltzmann constant in m^2*kg/s^2/K
*/
private static final double k = 1.380649E-23;
/**
* wien's displacement constant in m*K
*/
private static final double b = 2.897771995E-3;
private final double T;
private final double factor;
public BlackbodySpectrum(double T) {
if (T < 0) throw new IllegalArgumentException("T must be non-negative");
this.T = T;
this.factor = 1 / get(b / T);
}
@Override
public double max() {
return 1;
}
@Override
public double get(double lambda) {
lambda *= 1E-9;
var l2 = lambda * lambda;
var x = h * c / (lambda * k * T);
return 2 * h * c * c / (l2 * l2 * lambda) / (Math.exp(x) - 1) * factor;
}
}

View File

@ -0,0 +1,17 @@
package eu.jonahbauer.raytracing.render.spectral.spectrum;
/**
* A constant spectrum.
* @param c the constant value
*/
public record ConstantSpectrum(double c) implements Spectrum {
@Override
public double max() {
return c;
}
@Override
public double get(double lambda) {
return c;
}
}

View File

@ -0,0 +1,51 @@
package eu.jonahbauer.raytracing.render.spectral.spectrum;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
/**
* A spectrum sampled in one nanometer intervals.
*/
public final class DenselySampledSpectrum implements Spectrum {
private final double[] samples;
private final int min;
private final double max;
public DenselySampledSpectrum(@NotNull Spectrum spectrum) {
this(spectrum, (int) LAMBDA_MIN, (int) LAMBDA_MAX);
}
public DenselySampledSpectrum(@NotNull Spectrum spectrum, int min, int max) {
if (max - min + 1 <= 0) throw new IllegalArgumentException("samples must not be empty");
this.samples = new double[max - min + 1];
var maxValue = 0d;
for (int lambda = min; lambda <= max; lambda++) {
var sample = spectrum.get(lambda);
if (sample > maxValue) maxValue = sample;
this.samples[lambda] = sample;
}
this.min = min;
this.max = maxValue;
}
public DenselySampledSpectrum(double @NotNull[] samples, int lambdaMin) {
if (samples.length == 0) throw new IllegalArgumentException("samples must not be empty");
this.samples = Arrays.copyOf(samples, samples.length);
this.min = lambdaMin;
this.max = Arrays.stream(this.samples).max().orElseThrow();
}
@Override
public double max() {
return max;
}
@Override
public double get(double lambda) {
int offset = (int) Math.round(lambda) - min;
if (offset < 0 || offset >= samples.length) return 0;
return samples[offset];
}
}

View File

@ -0,0 +1,48 @@
package eu.jonahbauer.raytracing.render.spectral.spectrum;
import java.util.Arrays;
public final class PiecewiseLinearSpectrum implements Spectrum {
private final double[] lambdas;
private final double[] values;
private final double max;
public PiecewiseLinearSpectrum(double[] lambdas, double[] values) {
if (lambdas.length != values.length) {
throw new IllegalArgumentException("lambdas and values must have the same length");
}
this.lambdas = Arrays.copyOf(lambdas, lambdas.length);
this.values = Arrays.copyOf(values, values.length);
var max = 0d;
for (int i = 1; i < this.lambdas.length; i++) {
if (this.lambdas[i] <= this.lambdas[i - 1]) {
throw new IllegalArgumentException("lambdas must be in increasing order");
}
if (this.values[i] < 0) {
throw new IllegalArgumentException("values must be non-negative");
} else if (this.values[i] > max) {
max = this.values[i];
}
}
this.max = max;
}
@Override
public double max() {
return max;
}
@Override
public double get(double lambda) {
if (lambdas.length == 0 || lambda < lambdas[0] || lambda > lambdas[lambdas.length - 1]) return 0;
if (lambda == lambdas[lambdas.length - 1]) return values[values.length - 1];
var i = Arrays.binarySearch(lambdas, lambda);
if (i < 0) i = -i - 1;
var t = (lambda - lambdas[i]) / (lambdas[i + 1] - lambdas[i]);
return (1 - t) * values[i] + t * values[i + 1];
}
}

View File

@ -0,0 +1,27 @@
package eu.jonahbauer.raytracing.render.spectral.spectrum;
import eu.jonahbauer.raytracing.render.spectral.colors.ColorSpace;
import eu.jonahbauer.raytracing.render.spectral.colors.SigmoidPolynomial;
import eu.jonahbauer.raytracing.render.texture.Color;
import org.jetbrains.annotations.NotNull;
public final class RGBAlbedoSpectrum implements Spectrum {
private final @NotNull SigmoidPolynomial polynomial;
public RGBAlbedoSpectrum(@NotNull ColorSpace cs, @NotNull Color rgb) {
if (rgb.r() < 0 || rgb.r() > 1 || rgb.g() < 0 || rgb.g() > 1 || rgb.b() < 0 || rgb.b() > 1) {
throw new IllegalArgumentException();
}
this.polynomial = cs.toSpectrum(rgb);
}
@Override
public double max() {
return polynomial.max();
}
@Override
public double get(double lambda) {
return polynomial.get(lambda);
}
}

View File

@ -0,0 +1,32 @@
package eu.jonahbauer.raytracing.render.spectral.spectrum;
import eu.jonahbauer.raytracing.render.spectral.colors.ColorSpace;
import eu.jonahbauer.raytracing.render.spectral.colors.SigmoidPolynomial;
import eu.jonahbauer.raytracing.render.texture.Color;
import org.jetbrains.annotations.NotNull;
public final class RGBIlluminantSpectrum implements Spectrum {
private final double scale;
private final @NotNull SigmoidPolynomial polynomial;
private final @NotNull DenselySampledSpectrum illuminant;
public RGBIlluminantSpectrum(@NotNull ColorSpace cs, @NotNull Color rgb) {
if (rgb.r() < 0 || rgb.g() < 0 || rgb.b() < 0) {
throw new IllegalArgumentException();
}
var max = Math.max(rgb.r(), Math.max(rgb.g(), rgb.b()));
this.scale = 2 * max;
this.polynomial = cs.toSpectrum(scale == 0 ? Color.multiply(rgb, scale) : Color.BLACK);
this.illuminant = cs.illuminant();
}
@Override
public double max() {
return scale * polynomial.max() * illuminant.max();
}
@Override
public double get(double lambda) {
return scale * polynomial.get(lambda) * illuminant.get(lambda);
}
}

View File

@ -0,0 +1,30 @@
package eu.jonahbauer.raytracing.render.spectral.spectrum;
import eu.jonahbauer.raytracing.render.spectral.colors.ColorSpace;
import eu.jonahbauer.raytracing.render.spectral.colors.SigmoidPolynomial;
import eu.jonahbauer.raytracing.render.texture.Color;
import org.jetbrains.annotations.NotNull;
public final class RGBUnboundedSpectrum implements Spectrum {
private final double scale;
private final @NotNull SigmoidPolynomial polynomial;
public RGBUnboundedSpectrum(@NotNull ColorSpace cs, @NotNull Color rgb) {
if (rgb.r() < 0 || rgb.g() < 0 || rgb.b() < 0) {
throw new IllegalArgumentException();
}
var max = Math.max(rgb.r(), Math.max(rgb.g(), rgb.b()));
this.scale = 2 * max;
this.polynomial = cs.toSpectrum(scale == 0 ? Color.multiply(rgb, scale) : Color.BLACK);
}
@Override
public double max() {
return scale * polynomial.max();
}
@Override
public double get(double lambda) {
return scale * polynomial.get(lambda);
}
}

View File

@ -0,0 +1,93 @@
package eu.jonahbauer.raytracing.render.spectral.spectrum;
import eu.jonahbauer.raytracing.render.spectral.colors.Chromaticity;
import org.jetbrains.annotations.NotNull;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
public final class Spectra {
private static final Spectrum X;
private static final Spectrum Y;
private static final Spectrum Z;
static {
var count = Spectrum.LAMBDA_MAX - Spectrum.LAMBDA_MIN + 1;
var x = new double[count];
var y = new double[count];
var z = new double[count];
try (
var is = Spectra.class.getResourceAsStream("/eu/jonahbauer/raytracing/spectrum/CIE_xyz_1931_2deg.csv");
var in = new BufferedReader(new InputStreamReader(is, StandardCharsets.US_ASCII))
) {
for (int i = 0; i < count; i++) {
var line = in.readLine().split(",");
x[i] = Double.parseDouble(line[1]);
y[i] = Double.parseDouble(line[2]);
z[i] = Double.parseDouble(line[3]);
}
} catch (IOException e) {
throw new UncheckedIOException(e);
}
X = new DenselySampledSpectrum(x, Spectrum.LAMBDA_MIN);
Y = new DenselySampledSpectrum(y, Spectrum.LAMBDA_MIN);
Z = new DenselySampledSpectrum(z, Spectrum.LAMBDA_MIN);
}
/**
* {@return the X color matching curve}
*/
public static @NotNull Spectrum X() {
return X;
}
/**
* {@return the Y color matching curve}
*/
public static @NotNull Spectrum Y() {
return Y;
}
/**
* {@return the Z color matching curve}
*/
public static @NotNull Spectrum Z() {
return Z;
}
/**
* {@return the D illuminant at the given temperature}
* @param T the temperature
*/
public static @NotNull Spectrum D(double T) {
// determine chromaticity
double x;
if (4000 <= T && T <= 7000) {
x = 0.244063 + 0.09911E3 / T + 2.9678E6 / (T * T) - 4.6070E9 / (T * T * T);
} else if (7000 < T && T <= 25000) {
x = 0.237040 + 0.24748E3 / T + 1.9018E6 / (T * T) - 2.0064E9 / (T * T * T);
} else {
throw new IllegalArgumentException("T must be between 4000 and 25000, inclusive");
}
var y = Math.fma(Math.fma(-3.000, x, 2.870), x, -0.275);
var m = 0.0241 + 0.2562 * x - 0.7341 * y;
var m1 = (-1.3515 - 1.7703 * x + 5.9114 * y) / m;
var m2 = ( 0.0300 - 31.4424 * x + 30.0717 * y) / m;
}
public static @NotNull Spectrum getNamed(@NotNull String name) {
}
private Spectra() {
throw new UnsupportedOperationException();
}
}

View File

@ -0,0 +1,49 @@
package eu.jonahbauer.raytracing.render.spectral.spectrum;
import eu.jonahbauer.raytracing.render.spectral.colors.ColorSpace;
import eu.jonahbauer.raytracing.render.spectral.colors.ColorXYZ;
import eu.jonahbauer.raytracing.render.spectral.SampledSpectrum;
import eu.jonahbauer.raytracing.render.spectral.SampledWavelengths;
import eu.jonahbauer.raytracing.render.texture.Color;
import org.jetbrains.annotations.NotNull;
public interface Spectrum {
int LAMBDA_MIN = 360;
int LAMBDA_MAX = 830;
int SAMPLES = 4;
/**
* {@return the maximum value of <code>this</code> spectrum over the range of wavelengths}
*/
double max();
/**
* {@return the value of <code>this</code> spectrum at a given wavelength}
* @param lambda the wavelength in nanometers
*/
double get(double lambda);
default @NotNull SampledSpectrum sample(@NotNull SampledWavelengths lambdas) {
return new SampledSpectrum(lambdas, this);
}
default @NotNull ColorXYZ toXYZ() {
return new ColorXYZ(
innerProduct(Spectra.X(), this) / ColorXYZ.CIE_Y_INTEGRAL,
innerProduct(Spectra.Y(), this) / ColorXYZ.CIE_Y_INTEGRAL,
innerProduct(Spectra.Z(), this) / ColorXYZ.CIE_Y_INTEGRAL
);
}
default @NotNull Color toRGB(@NotNull ColorSpace cs) {
return cs.toRGB(toXYZ());
}
private static double innerProduct(@NotNull Spectrum f, @NotNull Spectrum g) {
var integral = 0.0;
for (var lambda = LAMBDA_MIN; lambda <= LAMBDA_MAX; lambda++) {
integral += f.get(lambda) * g.get(lambda);
}
return integral;
}
}

View File

@ -5,6 +5,7 @@ import eu.jonahbauer.raytracing.math.Vec3;
import eu.jonahbauer.raytracing.scene.SkyBox; import eu.jonahbauer.raytracing.scene.SkyBox;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Objects;
import java.util.Random; import java.util.Random;
import static eu.jonahbauer.raytracing.Main.DEBUG; import static eu.jonahbauer.raytracing.Main.DEBUG;
@ -20,9 +21,9 @@ public record Color(double r, double g, double b) implements Texture, SkyBox {
if (t < 0) return a; if (t < 0) return a;
if (t > 1) return b; if (t > 1) return b;
return new Color( return new Color(
(1 - t) * a.r + t * b.r, Math.fma(t, b.r, Math.fma(-t, a.r, a.r)),
(1 - t) * a.g + t * b.g, Math.fma(t, b.g, Math.fma(-t, a.g, a.g)),
(1 - t) * a.b + t * b.b Math.fma(t, b.b, Math.fma(-t, a.b, a.b))
); );
} }
@ -86,6 +87,10 @@ public record Color(double r, double g, double b) implements Texture, SkyBox {
this(red / 255f, green / 255f, blue / 255f); this(red / 255f, green / 255f, blue / 255f);
} }
public Color(@NotNull Vec3 vec) {
this(vec.x(), vec.y(), vec.z());
}
public Color { public Color {
if (DEBUG) { if (DEBUG) {
if (!Double.isFinite(r) || !Double.isFinite(g) || !Double.isFinite(b)) { if (!Double.isFinite(r) || !Double.isFinite(g) || !Double.isFinite(b)) {
@ -109,6 +114,15 @@ public record Color(double r, double g, double b) implements Texture, SkyBox {
return toInt(b); return toInt(b);
} }
public double component(int i) {
return switch (i) {
case 0 -> r;
case 1 -> g;
case 2 -> b;
default -> throw new IndexOutOfBoundsException(i);
};
}
@Override @Override
public @NotNull Color get(double u, double v, @NotNull Vec3 p) { public @NotNull Color get(double u, double v, @NotNull Vec3 p) {
return this; return this;
@ -124,6 +138,10 @@ public record Color(double r, double g, double b) implements Texture, SkyBox {
return false; return false;
} }
public @NotNull Vec3 toVec3() {
return new Vec3(r, g, b);
}
private static int toInt(double value) { private static int toInt(double value) {
return Math.clamp((int) (255.99 * value), 0, 255); return Math.clamp((int) (255.99 * value), 0, 255);
} }

View File

@ -0,0 +1,471 @@
360,0.000129900000,0.0000039170000,0.000606100000
361,0.000145847000,0.0000043935810,0.000680879200
362,0.000163802100,0.0000049296040,0.000765145600
363,0.000184003700,0.0000055321360,0.000860012400
364,0.000206690200,0.0000062082450,0.000966592800
365,0.000232100000,0.0000069650000,0.001086000000
366,0.000260728000,0.0000078132190,0.001220586000
367,0.000293075000,0.0000087673360,0.001372729000
368,0.000329388000,0.0000098398440,0.001543579000
369,0.000369914000,0.0000110432300,0.001734286000
370,0.000414900000,0.0000123900000,0.001946000000
371,0.000464158700,0.0000138864100,0.002177777000
372,0.000518986000,0.0000155572800,0.002435809000
373,0.000581854000,0.0000174429600,0.002731953000
374,0.000655234700,0.0000195837500,0.003078064000
375,0.000741600000,0.0000220200000,0.003486000000
376,0.000845029600,0.0000248396500,0.003975227000
377,0.000964526800,0.0000280412600,0.004540880000
378,0.001094949000,0.0000315310400,0.005158320000
379,0.001231154000,0.0000352152100,0.005802907000
380,0.001368000000,0.0000390000000,0.006450001000
381,0.001502050000,0.0000428264000,0.007083216000
382,0.001642328000,0.0000469146000,0.007745488000
383,0.001802382000,0.0000515896000,0.008501152000
384,0.001995757000,0.0000571764000,0.009414544000
385,0.002236000000,0.0000640000000,0.010549990000
386,0.002535385000,0.0000723442100,0.011965800000
387,0.002892603000,0.0000822122400,0.013655870000
388,0.003300829000,0.0000935081600,0.015588050000
389,0.003753236000,0.0001061361000,0.017730150000
390,0.004243000000,0.0001200000000,0.020050010000
391,0.004762389000,0.0001349840000,0.022511360000
392,0.005330048000,0.0001514920000,0.025202880000
393,0.005978712000,0.0001702080000,0.028279720000
394,0.006741117000,0.0001918160000,0.031897040000
395,0.007650000000,0.0002170000000,0.036210000000
396,0.008751373000,0.0002469067000,0.041437710000
397,0.010028880000,0.0002812400000,0.047503720000
398,0.011421700000,0.0003185200000,0.054119880000
399,0.012869010000,0.0003572667000,0.060998030000
400,0.014310000000,0.0003960000000,0.067850010000
401,0.015704430000,0.0004337147000,0.074486320000
402,0.017147440000,0.0004730240000,0.081361560000
403,0.018781220000,0.0005178760000,0.089153640000
404,0.020748010000,0.0005722187000,0.098540480000
405,0.023190000000,0.0006400000000,0.110200000000
406,0.026207360000,0.0007245600000,0.124613300000
407,0.029782480000,0.0008255000000,0.141701700000
408,0.033880920000,0.0009411600000,0.161303500000
409,0.038468240000,0.0010698800000,0.183256800000
410,0.043510000000,0.0012100000000,0.207400000000
411,0.048995600000,0.0013620910000,0.233692100000
412,0.055022600000,0.0015307520000,0.262611400000
413,0.061718800000,0.0017203680000,0.294774600000
414,0.069212000000,0.0019353230000,0.330798500000
415,0.077630000000,0.0021800000000,0.371300000000
416,0.086958110000,0.0024548000000,0.416209100000
417,0.097176720000,0.0027640000000,0.465464200000
418,0.108406300000,0.0031178000000,0.519694800000
419,0.120767200000,0.0035264000000,0.579530300000
420,0.134380000000,0.0040000000000,0.645600000000
421,0.149358200000,0.0045462400000,0.718483800000
422,0.165395700000,0.0051593200000,0.796713300000
423,0.181983100000,0.0058292800000,0.877845900000
424,0.198611000000,0.0065461600000,0.959439000000
425,0.214770000000,0.0073000000000,1.039050100000
426,0.230186800000,0.0080865070000,1.115367300000
427,0.244879700000,0.0089087200000,1.188497100000
428,0.258777300000,0.0097676800000,1.258123300000
429,0.271807900000,0.0106644300000,1.323929600000
430,0.283900000000,0.0116000000000,1.385600000000
431,0.294943800000,0.0125731700000,1.442635200000
432,0.304896500000,0.0135827200000,1.494803500000
433,0.313787300000,0.0146296800000,1.542190300000
434,0.321645400000,0.0157150900000,1.584880700000
435,0.328500000000,0.0168400000000,1.622960000000
436,0.334351300000,0.0180073600000,1.656404800000
437,0.339210100000,0.0192144800000,1.685295900000
438,0.343121300000,0.0204539200000,1.709874500000
439,0.346129600000,0.0217182400000,1.730382100000
440,0.348280000000,0.0230000000000,1.747060000000
441,0.349599900000,0.0242946100000,1.760044600000
442,0.350147400000,0.0256102400000,1.769623300000
443,0.350013000000,0.0269585700000,1.776263700000
444,0.349287000000,0.0283512500000,1.780433400000
445,0.348060000000,0.0298000000000,1.782600000000
446,0.346373300000,0.0313108300000,1.782968200000
447,0.344262400000,0.0328836800000,1.781699800000
448,0.341808800000,0.0345211200000,1.779198200000
449,0.339094100000,0.0362257100000,1.775867100000
450,0.336200000000,0.0380000000000,1.772110000000
451,0.333197700000,0.0398466700000,1.768258900000
452,0.330041100000,0.0417680000000,1.764039000000
453,0.326635700000,0.0437660000000,1.758943800000
454,0.322886800000,0.0458426700000,1.752466300000
455,0.318700000000,0.0480000000000,1.744100000000
456,0.314025100000,0.0502436800000,1.733559500000
457,0.308884000000,0.0525730400000,1.720858100000
458,0.303290400000,0.0549805600000,1.705936900000
459,0.297257900000,0.0574587200000,1.688737200000
460,0.290800000000,0.0600000000000,1.669200000000
461,0.283970100000,0.0626019700000,1.647528700000
462,0.276721400000,0.0652775200000,1.623412700000
463,0.268917800000,0.0680420800000,1.596022300000
464,0.260422700000,0.0709110900000,1.564528000000
465,0.251100000000,0.0739000000000,1.528100000000
466,0.240847500000,0.0770160000000,1.486111400000
467,0.229851200000,0.0802664000000,1.439521500000
468,0.218407200000,0.0836668000000,1.389879900000
469,0.206811500000,0.0872328000000,1.338736200000
470,0.195360000000,0.0909800000000,1.287640000000
471,0.184213600000,0.0949175500000,1.237422300000
472,0.173327300000,0.0990458400000,1.187824300000
473,0.162688100000,0.1033674000000,1.138761100000
474,0.152283300000,0.1078846000000,1.090148000000
475,0.142100000000,0.1126000000000,1.041900000000
476,0.132178600000,0.1175320000000,0.994197600000
477,0.122569600000,0.1226744000000,0.947347300000
478,0.113275200000,0.1279928000000,0.901453100000
479,0.104297900000,0.1334528000000,0.856619300000
480,0.095640000000,0.1390200000000,0.812950100000
481,0.087299550000,0.1446764000000,0.770517300000
482,0.079308040000,0.1504693000000,0.729444800000
483,0.071717760000,0.1564619000000,0.689913600000
484,0.064580990000,0.1627177000000,0.652104900000
485,0.057950010000,0.1693000000000,0.616200000000
486,0.051862110000,0.1762431000000,0.582328600000
487,0.046281520000,0.1835581000000,0.550416200000
488,0.041150880000,0.1912735000000,0.520337600000
489,0.036412830000,0.1994180000000,0.491967300000
490,0.032010000000,0.2080200000000,0.465180000000
491,0.027917200000,0.2171199000000,0.439924600000
492,0.024144400000,0.2267345000000,0.416183600000
493,0.020687000000,0.2368571000000,0.393882200000
494,0.017540400000,0.2474812000000,0.372945900000
495,0.014700000000,0.2586000000000,0.353300000000
496,0.012161790000,0.2701849000000,0.334857800000
497,0.009919960000,0.2822939000000,0.317552100000
498,0.007967240000,0.2950505000000,0.301337500000
499,0.006296346000,0.3085780000000,0.286168600000
500,0.004900000000,0.3230000000000,0.272000000000
501,0.003777173000,0.3384021000000,0.258817100000
502,0.002945320000,0.3546858000000,0.246483800000
503,0.002424880000,0.3716986000000,0.234771800000
504,0.002236293000,0.3892875000000,0.223453300000
505,0.002400000000,0.4073000000000,0.212300000000
506,0.002925520000,0.4256299000000,0.201169200000
507,0.003836560000,0.4443096000000,0.190119600000
508,0.005174840000,0.4633944000000,0.179225400000
509,0.006982080000,0.4829395000000,0.168560800000
510,0.009300000000,0.5030000000000,0.158200000000
511,0.012149490000,0.5235693000000,0.148138300000
512,0.015535880000,0.5445120000000,0.138375800000
513,0.019477520000,0.5656900000000,0.128994200000
514,0.023992770000,0.5869653000000,0.120075100000
515,0.029100000000,0.6082000000000,0.111700000000
516,0.034814850000,0.6293456000000,0.103904800000
517,0.041120160000,0.6503068000000,0.096667480000
518,0.047985040000,0.6708752000000,0.089982720000
519,0.055378610000,0.6908424000000,0.083845310000
520,0.063270000000,0.7100000000000,0.078249990000
521,0.071635010000,0.7281852000000,0.073208990000
522,0.080462240000,0.7454636000000,0.068678160000
523,0.089739960000,0.7619694000000,0.064567840000
524,0.099456450000,0.7778368000000,0.060788350000
525,0.109600000000,0.7932000000000,0.057250010000
526,0.120167400000,0.8081104000000,0.053904350000
527,0.131114500000,0.8224962000000,0.050746640000
528,0.142367900000,0.8363068000000,0.047752760000
529,0.153854200000,0.8494916000000,0.044898590000
530,0.165500000000,0.8620000000000,0.042160000000
531,0.177257100000,0.8738108000000,0.039507280000
532,0.189140000000,0.8849624000000,0.036935640000
533,0.201169400000,0.8954936000000,0.034458360000
534,0.213365800000,0.9054432000000,0.032088720000
535,0.225749900000,0.9148501000000,0.029840000000
536,0.238320900000,0.9237348000000,0.027711810000
537,0.251066800000,0.9320924000000,0.025694440000
538,0.263992200000,0.9399226000000,0.023787160000
539,0.277101700000,0.9472252000000,0.021989250000
540,0.290400000000,0.9540000000000,0.020300000000
541,0.303891200000,0.9602561000000,0.018718050000
542,0.317572600000,0.9660074000000,0.017240360000
543,0.331438400000,0.9712606000000,0.015863640000
544,0.345482800000,0.9760225000000,0.014584610000
545,0.359700000000,0.9803000000000,0.013400000000
546,0.374083900000,0.9840924000000,0.012307230000
547,0.388639600000,0.9874182000000,0.011301880000
548,0.403378400000,0.9903128000000,0.010377920000
549,0.418311500000,0.9928116000000,0.009529306000
550,0.433449900000,0.9949501000000,0.008749999000
551,0.448795300000,0.9967108000000,0.008035200000
552,0.464336000000,0.9980983000000,0.007381600000
553,0.480064000000,0.9991120000000,0.006785400000
554,0.495971300000,0.9997482000000,0.006242800000
555,0.512050100000,1.0000000000000,0.005749999000
556,0.528295900000,0.9998567000000,0.005303600000
557,0.544691600000,0.9993046000000,0.004899800000
558,0.561209400000,0.9983255000000,0.004534200000
559,0.577821500000,0.9968987000000,0.004202400000
560,0.594500000000,0.9950000000000,0.003900000000
561,0.611220900000,0.9926005000000,0.003623200000
562,0.627975800000,0.9897426000000,0.003370600000
563,0.644760200000,0.9864444000000,0.003141400000
564,0.661569700000,0.9827241000000,0.002934800000
565,0.678400000000,0.9786000000000,0.002749999000
566,0.695239200000,0.9740837000000,0.002585200000
567,0.712058600000,0.9691712000000,0.002438600000
568,0.728828400000,0.9638568000000,0.002309400000
569,0.745518800000,0.9581349000000,0.002196800000
570,0.762100000000,0.9520000000000,0.002100000000
571,0.778543200000,0.9454504000000,0.002017733000
572,0.794825600000,0.9384992000000,0.001948200000
573,0.810926400000,0.9311628000000,0.001889800000
574,0.826824800000,0.9234576000000,0.001840933000
575,0.842500000000,0.9154000000000,0.001800000000
576,0.857932500000,0.9070064000000,0.001766267000
577,0.873081600000,0.8982772000000,0.001737800000
578,0.887894400000,0.8892048000000,0.001711200000
579,0.902318100000,0.8797816000000,0.001683067000
580,0.916300000000,0.8700000000000,0.001650001000
581,0.929799500000,0.8598613000000,0.001610133000
582,0.942798400000,0.8493920000000,0.001564400000
583,0.955277600000,0.8386220000000,0.001513600000
584,0.967217900000,0.8275813000000,0.001458533000
585,0.978600000000,0.8163000000000,0.001400000000
586,0.989385600000,0.8047947000000,0.001336667000
587,0.999548800000,0.7930820000000,0.001270000000
588,1.009089200000,0.7811920000000,0.001205000000
589,1.018006400000,0.7691547000000,0.001146667000
590,1.026300000000,0.7570000000000,0.001100000000
591,1.033982700000,0.7447541000000,0.001068800000
592,1.040986000000,0.7324224000000,0.001049400000
593,1.047188000000,0.7200036000000,0.001035600000
594,1.052466700000,0.7074965000000,0.001021200000
595,1.056700000000,0.6949000000000,0.001000000000
596,1.059794400000,0.6822192000000,0.000968640000
597,1.061799200000,0.6694716000000,0.000929920000
598,1.062806800000,0.6566744000000,0.000886880000
599,1.062909600000,0.6438448000000,0.000842560000
600,1.062200000000,0.6310000000000,0.000800000000
601,1.060735200000,0.6181555000000,0.000760960000
602,1.058443600000,0.6053144000000,0.000723680000
603,1.055224400000,0.5924756000000,0.000685920000
604,1.050976800000,0.5796379000000,0.000645440000
605,1.045600000000,0.5668000000000,0.000600000000
606,1.039036900000,0.5539611000000,0.000547866700
607,1.031360800000,0.5411372000000,0.000491600000
608,1.022666200000,0.5283528000000,0.000435400000
609,1.013047700000,0.5156323000000,0.000383466700
610,1.002600000000,0.5030000000000,0.000340000000
611,0.991367500000,0.4904688000000,0.000307253300
612,0.979331400000,0.4780304000000,0.000283160000
613,0.966491600000,0.4656776000000,0.000265440000
614,0.952847900000,0.4534032000000,0.000251813300
615,0.938400000000,0.4412000000000,0.000240000000
616,0.923194000000,0.4290800000000,0.000229546700
617,0.907244000000,0.4170360000000,0.000220640000
618,0.890502000000,0.4050320000000,0.000211960000
619,0.872920000000,0.3930320000000,0.000202186700
620,0.854449900000,0.3810000000000,0.000190000000
621,0.835084000000,0.3689184000000,0.000174213300
622,0.814946000000,0.3568272000000,0.000155640000
623,0.794186000000,0.3447768000000,0.000135960000
624,0.772954000000,0.3328176000000,0.000116853300
625,0.751400000000,0.3210000000000,0.000100000000
626,0.729583600000,0.3093381000000,0.000086133330
627,0.707588800000,0.2978504000000,0.000074600000
628,0.685602200000,0.2865936000000,0.000065000000
629,0.663810400000,0.2756245000000,0.000056933330
630,0.642400000000,0.2650000000000,0.000049999990
631,0.621514900000,0.2547632000000,0.000044160000
632,0.601113800000,0.2448896000000,0.000039480000
633,0.581105200000,0.2353344000000,0.000035720000
634,0.561397700000,0.2260528000000,0.000032640000
635,0.541900000000,0.2170000000000,0.000030000000
636,0.522599500000,0.2081616000000,0.000027653330
637,0.503546400000,0.1995488000000,0.000025560000
638,0.484743600000,0.1911552000000,0.000023640000
639,0.466193900000,0.1829744000000,0.000021813330
640,0.447900000000,0.1750000000000,0.000020000000
641,0.429861300000,0.1672235000000,0.000018133330
642,0.412098000000,0.1596464000000,0.000016200000
643,0.394644000000,0.1522776000000,0.000014200000
644,0.377533300000,0.1451259000000,0.000012133330
645,0.360800000000,0.1382000000000,0.000010000000
646,0.344456300000,0.1315003000000,0.000007733333
647,0.328516800000,0.1250248000000,0.000005400000
648,0.313019200000,0.1187792000000,0.000003200000
649,0.298001100000,0.1127691000000,0.000001333333
650,0.283500000000,0.1070000000000,0.000000000000
651,0.269544800000,0.1014762000000,0.000000000000
652,0.256118400000,0.0961886400000,0.000000000000
653,0.243189600000,0.0911229600000,0.000000000000
654,0.230727200000,0.0862648500000,0.000000000000
655,0.218700000000,0.0816000000000,0.000000000000
656,0.207097100000,0.0771206400000,0.000000000000
657,0.195923200000,0.0728255200000,0.000000000000
658,0.185170800000,0.0687100800000,0.000000000000
659,0.174832300000,0.0647697600000,0.000000000000
660,0.164900000000,0.0610000000000,0.000000000000
661,0.155366700000,0.0573962100000,0.000000000000
662,0.146230000000,0.0539550400000,0.000000000000
663,0.137490000000,0.0506737600000,0.000000000000
664,0.129146700000,0.0475496500000,0.000000000000
665,0.121200000000,0.0445800000000,0.000000000000
666,0.113639700000,0.0417587200000,0.000000000000
667,0.106465000000,0.0390849600000,0.000000000000
668,0.099690440000,0.0365638400000,0.000000000000
669,0.093330610000,0.0342004800000,0.000000000000
670,0.087400000000,0.0320000000000,0.000000000000
671,0.081900960000,0.0299626100000,0.000000000000
672,0.076804280000,0.0280766400000,0.000000000000
673,0.072077120000,0.0263293600000,0.000000000000
674,0.067686640000,0.0247080500000,0.000000000000
675,0.063600000000,0.0232000000000,0.000000000000
676,0.059806850000,0.0218007700000,0.000000000000
677,0.056282160000,0.0205011200000,0.000000000000
678,0.052971040000,0.0192810800000,0.000000000000
679,0.049818610000,0.0181206900000,0.000000000000
680,0.046770000000,0.0170000000000,0.000000000000
681,0.043784050000,0.0159037900000,0.000000000000
682,0.040875360000,0.0148371800000,0.000000000000
683,0.038072640000,0.0138106800000,0.000000000000
684,0.035404610000,0.0128347800000,0.000000000000
685,0.032900000000,0.0119200000000,0.000000000000
686,0.030564190000,0.0110683100000,0.000000000000
687,0.028380560000,0.0102733900000,0.000000000000
688,0.026344840000,0.0095333110000,0.000000000000
689,0.024452750000,0.0088461570000,0.000000000000
690,0.022700000000,0.0082100000000,0.000000000000
691,0.021084290000,0.0076237810000,0.000000000000
692,0.019599880000,0.0070854240000,0.000000000000
693,0.018237320000,0.0065914760000,0.000000000000
694,0.016987170000,0.0061384850000,0.000000000000
695,0.015840000000,0.0057230000000,0.000000000000
696,0.014790640000,0.0053430590000,0.000000000000
697,0.013831320000,0.0049957960000,0.000000000000
698,0.012948680000,0.0046764040000,0.000000000000
699,0.012129200000,0.0043800750000,0.000000000000
700,0.011359160000,0.0041020000000,0.000000000000
701,0.010629350000,0.0038384530000,0.000000000000
702,0.009938846000,0.0035890990000,0.000000000000
703,0.009288422000,0.0033542190000,0.000000000000
704,0.008678854000,0.0031340930000,0.000000000000
705,0.008110916000,0.0029290000000,0.000000000000
706,0.007582388000,0.0027381390000,0.000000000000
707,0.007088746000,0.0025598760000,0.000000000000
708,0.006627313000,0.0023932440000,0.000000000000
709,0.006195408000,0.0022372750000,0.000000000000
710,0.005790346000,0.0020910000000,0.000000000000
711,0.005409826000,0.0019535870000,0.000000000000
712,0.005052583000,0.0018245800000,0.000000000000
713,0.004717512000,0.0017035800000,0.000000000000
714,0.004403507000,0.0015901870000,0.000000000000
715,0.004109457000,0.0014840000000,0.000000000000
716,0.003833913000,0.0013844960000,0.000000000000
717,0.003575748000,0.0012912680000,0.000000000000
718,0.003334342000,0.0012040920000,0.000000000000
719,0.003109075000,0.0011227440000,0.000000000000
720,0.002899327000,0.0010470000000,0.000000000000
721,0.002704348000,0.0009765896000,0.000000000000
722,0.002523020000,0.0009111088000,0.000000000000
723,0.002354168000,0.0008501332000,0.000000000000
724,0.002196616000,0.0007932384000,0.000000000000
725,0.002049190000,0.0007400000000,0.000000000000
726,0.001910960000,0.0006900827000,0.000000000000
727,0.001781438000,0.0006433100000,0.000000000000
728,0.001660110000,0.0005994960000,0.000000000000
729,0.001546459000,0.0005584547000,0.000000000000
730,0.001439971000,0.0005200000000,0.000000000000
731,0.001340042000,0.0004839136000,0.000000000000
732,0.001246275000,0.0004500528000,0.000000000000
733,0.001158471000,0.0004183452000,0.000000000000
734,0.001076430000,0.0003887184000,0.000000000000
735,0.000999949300,0.0003611000000,0.000000000000
736,0.000928735800,0.0003353835000,0.000000000000
737,0.000862433200,0.0003114404000,0.000000000000
738,0.000800750300,0.0002891656000,0.000000000000
739,0.000743396000,0.0002684539000,0.000000000000
740,0.000690078600,0.0002492000000,0.000000000000
741,0.000640515600,0.0002313019000,0.000000000000
742,0.000594502100,0.0002146856000,0.000000000000
743,0.000551864600,0.0001992884000,0.000000000000
744,0.000512429000,0.0001850475000,0.000000000000
745,0.000476021300,0.0001719000000,0.000000000000
746,0.000442453600,0.0001597781000,0.000000000000
747,0.000411511700,0.0001486044000,0.000000000000
748,0.000382981400,0.0001383016000,0.000000000000
749,0.000356649100,0.0001287925000,0.000000000000
750,0.000332301100,0.0001200000000,0.000000000000
751,0.000309758600,0.0001118595000,0.000000000000
752,0.000288887100,0.0001043224000,0.000000000000
753,0.000269539400,0.0000973356000,0.000000000000
754,0.000251568200,0.0000908458700,0.000000000000
755,0.000234826100,0.0000848000000,0.000000000000
756,0.000219171000,0.0000791466700,0.000000000000
757,0.000204525800,0.0000738580000,0.000000000000
758,0.000190840500,0.0000689160000,0.000000000000
759,0.000178065400,0.0000643026700,0.000000000000
760,0.000166150500,0.0000600000000,0.000000000000
761,0.000155023600,0.0000559818700,0.000000000000
762,0.000144621900,0.0000522256000,0.000000000000
763,0.000134909800,0.0000487184000,0.000000000000
764,0.000125852000,0.0000454474700,0.000000000000
765,0.000117413000,0.0000424000000,0.000000000000
766,0.000109551500,0.0000395610400,0.000000000000
767,0.000102224500,0.0000369151200,0.000000000000
768,0.000095394450,0.0000344486800,0.000000000000
769,0.000089023900,0.0000321481600,0.000000000000
770,0.000083075270,0.0000300000000,0.000000000000
771,0.000077512690,0.0000279912500,0.000000000000
772,0.000072313040,0.0000261135600,0.000000000000
773,0.000067457780,0.0000243602400,0.000000000000
774,0.000062928440,0.0000227246100,0.000000000000
775,0.000058706520,0.0000212000000,0.000000000000
776,0.000054770280,0.0000197785500,0.000000000000
777,0.000051099180,0.0000184528500,0.000000000000
778,0.000047676540,0.0000172168700,0.000000000000
779,0.000044485670,0.0000160645900,0.000000000000
780,0.000041509940,0.0000149900000,0.000000000000
781,0.000038733240,0.0000139872800,0.000000000000
782,0.000036142030,0.0000130515500,0.000000000000
783,0.000033723520,0.0000121781800,0.000000000000
784,0.000031464870,0.0000113625400,0.000000000000
785,0.000029353260,0.0000106000000,0.000000000000
786,0.000027375730,0.0000098858770,0.000000000000
787,0.000025524330,0.0000092173040,0.000000000000
788,0.000023793760,0.0000085923620,0.000000000000
789,0.000022178700,0.0000080091330,0.000000000000
790,0.000020673830,0.0000074657000,0.000000000000
791,0.000019272260,0.0000069595670,0.000000000000
792,0.000017966400,0.0000064879950,0.000000000000
793,0.000016749910,0.0000060486990,0.000000000000
794,0.000015616480,0.0000056393960,0.000000000000
795,0.000014559770,0.0000052578000,0.000000000000
796,0.000013573870,0.0000049017710,0.000000000000
797,0.000012654360,0.0000045697200,0.000000000000
798,0.000011797230,0.0000042601940,0.000000000000
799,0.000010998440,0.0000039717390,0.000000000000
800,0.000010253980,0.0000037029000,0.000000000000
801,0.000009559646,0.0000034521630,0.000000000000
802,0.000008912044,0.0000032183020,0.000000000000
803,0.000008308358,0.0000030003000,0.000000000000
804,0.000007745769,0.0000027971390,0.000000000000
805,0.000007221456,0.0000026078000,0.000000000000
806,0.000006732475,0.0000024312200,0.000000000000
807,0.000006276423,0.0000022665310,0.000000000000
808,0.000005851304,0.0000021130130,0.000000000000
809,0.000005455118,0.0000019699430,0.000000000000
810,0.000005085868,0.0000018366000,0.000000000000
811,0.000004741466,0.0000017122300,0.000000000000
812,0.000004420236,0.0000015962280,0.000000000000
813,0.000004120783,0.0000014880900,0.000000000000
814,0.000003841716,0.0000013873140,0.000000000000
815,0.000003581652,0.0000012934000,0.000000000000
816,0.000003339127,0.0000012058200,0.000000000000
817,0.000003112949,0.0000011241430,0.000000000000
818,0.000002902121,0.0000010480090,0.000000000000
819,0.000002705645,0.0000009770578,0.000000000000
820,0.000002522525,0.0000009109300,0.000000000000
821,0.000002351726,0.0000008492513,0.000000000000
822,0.000002192415,0.0000007917212,0.000000000000
823,0.000002043902,0.0000007380904,0.000000000000
824,0.000001905497,0.0000006881098,0.000000000000
825,0.000001776509,0.0000006415300,0.000000000000
826,0.000001656215,0.0000005980895,0.000000000000
827,0.000001544022,0.0000005575746,0.000000000000
828,0.000001439440,0.0000005198080,0.000000000000
829,0.000001341977,0.0000004846123,0.000000000000
830,0.000001251141,0.0000004518100,0.000000000000
1 360 0.000129900000 0.0000039170000 0.000606100000
2 361 0.000145847000 0.0000043935810 0.000680879200
3 362 0.000163802100 0.0000049296040 0.000765145600
4 363 0.000184003700 0.0000055321360 0.000860012400
5 364 0.000206690200 0.0000062082450 0.000966592800
6 365 0.000232100000 0.0000069650000 0.001086000000
7 366 0.000260728000 0.0000078132190 0.001220586000
8 367 0.000293075000 0.0000087673360 0.001372729000
9 368 0.000329388000 0.0000098398440 0.001543579000
10 369 0.000369914000 0.0000110432300 0.001734286000
11 370 0.000414900000 0.0000123900000 0.001946000000
12 371 0.000464158700 0.0000138864100 0.002177777000
13 372 0.000518986000 0.0000155572800 0.002435809000
14 373 0.000581854000 0.0000174429600 0.002731953000
15 374 0.000655234700 0.0000195837500 0.003078064000
16 375 0.000741600000 0.0000220200000 0.003486000000
17 376 0.000845029600 0.0000248396500 0.003975227000
18 377 0.000964526800 0.0000280412600 0.004540880000
19 378 0.001094949000 0.0000315310400 0.005158320000
20 379 0.001231154000 0.0000352152100 0.005802907000
21 380 0.001368000000 0.0000390000000 0.006450001000
22 381 0.001502050000 0.0000428264000 0.007083216000
23 382 0.001642328000 0.0000469146000 0.007745488000
24 383 0.001802382000 0.0000515896000 0.008501152000
25 384 0.001995757000 0.0000571764000 0.009414544000
26 385 0.002236000000 0.0000640000000 0.010549990000
27 386 0.002535385000 0.0000723442100 0.011965800000
28 387 0.002892603000 0.0000822122400 0.013655870000
29 388 0.003300829000 0.0000935081600 0.015588050000
30 389 0.003753236000 0.0001061361000 0.017730150000
31 390 0.004243000000 0.0001200000000 0.020050010000
32 391 0.004762389000 0.0001349840000 0.022511360000
33 392 0.005330048000 0.0001514920000 0.025202880000
34 393 0.005978712000 0.0001702080000 0.028279720000
35 394 0.006741117000 0.0001918160000 0.031897040000
36 395 0.007650000000 0.0002170000000 0.036210000000
37 396 0.008751373000 0.0002469067000 0.041437710000
38 397 0.010028880000 0.0002812400000 0.047503720000
39 398 0.011421700000 0.0003185200000 0.054119880000
40 399 0.012869010000 0.0003572667000 0.060998030000
41 400 0.014310000000 0.0003960000000 0.067850010000
42 401 0.015704430000 0.0004337147000 0.074486320000
43 402 0.017147440000 0.0004730240000 0.081361560000
44 403 0.018781220000 0.0005178760000 0.089153640000
45 404 0.020748010000 0.0005722187000 0.098540480000
46 405 0.023190000000 0.0006400000000 0.110200000000
47 406 0.026207360000 0.0007245600000 0.124613300000
48 407 0.029782480000 0.0008255000000 0.141701700000
49 408 0.033880920000 0.0009411600000 0.161303500000
50 409 0.038468240000 0.0010698800000 0.183256800000
51 410 0.043510000000 0.0012100000000 0.207400000000
52 411 0.048995600000 0.0013620910000 0.233692100000
53 412 0.055022600000 0.0015307520000 0.262611400000
54 413 0.061718800000 0.0017203680000 0.294774600000
55 414 0.069212000000 0.0019353230000 0.330798500000
56 415 0.077630000000 0.0021800000000 0.371300000000
57 416 0.086958110000 0.0024548000000 0.416209100000
58 417 0.097176720000 0.0027640000000 0.465464200000
59 418 0.108406300000 0.0031178000000 0.519694800000
60 419 0.120767200000 0.0035264000000 0.579530300000
61 420 0.134380000000 0.0040000000000 0.645600000000
62 421 0.149358200000 0.0045462400000 0.718483800000
63 422 0.165395700000 0.0051593200000 0.796713300000
64 423 0.181983100000 0.0058292800000 0.877845900000
65 424 0.198611000000 0.0065461600000 0.959439000000
66 425 0.214770000000 0.0073000000000 1.039050100000
67 426 0.230186800000 0.0080865070000 1.115367300000
68 427 0.244879700000 0.0089087200000 1.188497100000
69 428 0.258777300000 0.0097676800000 1.258123300000
70 429 0.271807900000 0.0106644300000 1.323929600000
71 430 0.283900000000 0.0116000000000 1.385600000000
72 431 0.294943800000 0.0125731700000 1.442635200000
73 432 0.304896500000 0.0135827200000 1.494803500000
74 433 0.313787300000 0.0146296800000 1.542190300000
75 434 0.321645400000 0.0157150900000 1.584880700000
76 435 0.328500000000 0.0168400000000 1.622960000000
77 436 0.334351300000 0.0180073600000 1.656404800000
78 437 0.339210100000 0.0192144800000 1.685295900000
79 438 0.343121300000 0.0204539200000 1.709874500000
80 439 0.346129600000 0.0217182400000 1.730382100000
81 440 0.348280000000 0.0230000000000 1.747060000000
82 441 0.349599900000 0.0242946100000 1.760044600000
83 442 0.350147400000 0.0256102400000 1.769623300000
84 443 0.350013000000 0.0269585700000 1.776263700000
85 444 0.349287000000 0.0283512500000 1.780433400000
86 445 0.348060000000 0.0298000000000 1.782600000000
87 446 0.346373300000 0.0313108300000 1.782968200000
88 447 0.344262400000 0.0328836800000 1.781699800000
89 448 0.341808800000 0.0345211200000 1.779198200000
90 449 0.339094100000 0.0362257100000 1.775867100000
91 450 0.336200000000 0.0380000000000 1.772110000000
92 451 0.333197700000 0.0398466700000 1.768258900000
93 452 0.330041100000 0.0417680000000 1.764039000000
94 453 0.326635700000 0.0437660000000 1.758943800000
95 454 0.322886800000 0.0458426700000 1.752466300000
96 455 0.318700000000 0.0480000000000 1.744100000000
97 456 0.314025100000 0.0502436800000 1.733559500000
98 457 0.308884000000 0.0525730400000 1.720858100000
99 458 0.303290400000 0.0549805600000 1.705936900000
100 459 0.297257900000 0.0574587200000 1.688737200000
101 460 0.290800000000 0.0600000000000 1.669200000000
102 461 0.283970100000 0.0626019700000 1.647528700000
103 462 0.276721400000 0.0652775200000 1.623412700000
104 463 0.268917800000 0.0680420800000 1.596022300000
105 464 0.260422700000 0.0709110900000 1.564528000000
106 465 0.251100000000 0.0739000000000 1.528100000000
107 466 0.240847500000 0.0770160000000 1.486111400000
108 467 0.229851200000 0.0802664000000 1.439521500000
109 468 0.218407200000 0.0836668000000 1.389879900000
110 469 0.206811500000 0.0872328000000 1.338736200000
111 470 0.195360000000 0.0909800000000 1.287640000000
112 471 0.184213600000 0.0949175500000 1.237422300000
113 472 0.173327300000 0.0990458400000 1.187824300000
114 473 0.162688100000 0.1033674000000 1.138761100000
115 474 0.152283300000 0.1078846000000 1.090148000000
116 475 0.142100000000 0.1126000000000 1.041900000000
117 476 0.132178600000 0.1175320000000 0.994197600000
118 477 0.122569600000 0.1226744000000 0.947347300000
119 478 0.113275200000 0.1279928000000 0.901453100000
120 479 0.104297900000 0.1334528000000 0.856619300000
121 480 0.095640000000 0.1390200000000 0.812950100000
122 481 0.087299550000 0.1446764000000 0.770517300000
123 482 0.079308040000 0.1504693000000 0.729444800000
124 483 0.071717760000 0.1564619000000 0.689913600000
125 484 0.064580990000 0.1627177000000 0.652104900000
126 485 0.057950010000 0.1693000000000 0.616200000000
127 486 0.051862110000 0.1762431000000 0.582328600000
128 487 0.046281520000 0.1835581000000 0.550416200000
129 488 0.041150880000 0.1912735000000 0.520337600000
130 489 0.036412830000 0.1994180000000 0.491967300000
131 490 0.032010000000 0.2080200000000 0.465180000000
132 491 0.027917200000 0.2171199000000 0.439924600000
133 492 0.024144400000 0.2267345000000 0.416183600000
134 493 0.020687000000 0.2368571000000 0.393882200000
135 494 0.017540400000 0.2474812000000 0.372945900000
136 495 0.014700000000 0.2586000000000 0.353300000000
137 496 0.012161790000 0.2701849000000 0.334857800000
138 497 0.009919960000 0.2822939000000 0.317552100000
139 498 0.007967240000 0.2950505000000 0.301337500000
140 499 0.006296346000 0.3085780000000 0.286168600000
141 500 0.004900000000 0.3230000000000 0.272000000000
142 501 0.003777173000 0.3384021000000 0.258817100000
143 502 0.002945320000 0.3546858000000 0.246483800000
144 503 0.002424880000 0.3716986000000 0.234771800000
145 504 0.002236293000 0.3892875000000 0.223453300000
146 505 0.002400000000 0.4073000000000 0.212300000000
147 506 0.002925520000 0.4256299000000 0.201169200000
148 507 0.003836560000 0.4443096000000 0.190119600000
149 508 0.005174840000 0.4633944000000 0.179225400000
150 509 0.006982080000 0.4829395000000 0.168560800000
151 510 0.009300000000 0.5030000000000 0.158200000000
152 511 0.012149490000 0.5235693000000 0.148138300000
153 512 0.015535880000 0.5445120000000 0.138375800000
154 513 0.019477520000 0.5656900000000 0.128994200000
155 514 0.023992770000 0.5869653000000 0.120075100000
156 515 0.029100000000 0.6082000000000 0.111700000000
157 516 0.034814850000 0.6293456000000 0.103904800000
158 517 0.041120160000 0.6503068000000 0.096667480000
159 518 0.047985040000 0.6708752000000 0.089982720000
160 519 0.055378610000 0.6908424000000 0.083845310000
161 520 0.063270000000 0.7100000000000 0.078249990000
162 521 0.071635010000 0.7281852000000 0.073208990000
163 522 0.080462240000 0.7454636000000 0.068678160000
164 523 0.089739960000 0.7619694000000 0.064567840000
165 524 0.099456450000 0.7778368000000 0.060788350000
166 525 0.109600000000 0.7932000000000 0.057250010000
167 526 0.120167400000 0.8081104000000 0.053904350000
168 527 0.131114500000 0.8224962000000 0.050746640000
169 528 0.142367900000 0.8363068000000 0.047752760000
170 529 0.153854200000 0.8494916000000 0.044898590000
171 530 0.165500000000 0.8620000000000 0.042160000000
172 531 0.177257100000 0.8738108000000 0.039507280000
173 532 0.189140000000 0.8849624000000 0.036935640000
174 533 0.201169400000 0.8954936000000 0.034458360000
175 534 0.213365800000 0.9054432000000 0.032088720000
176 535 0.225749900000 0.9148501000000 0.029840000000
177 536 0.238320900000 0.9237348000000 0.027711810000
178 537 0.251066800000 0.9320924000000 0.025694440000
179 538 0.263992200000 0.9399226000000 0.023787160000
180 539 0.277101700000 0.9472252000000 0.021989250000
181 540 0.290400000000 0.9540000000000 0.020300000000
182 541 0.303891200000 0.9602561000000 0.018718050000
183 542 0.317572600000 0.9660074000000 0.017240360000
184 543 0.331438400000 0.9712606000000 0.015863640000
185 544 0.345482800000 0.9760225000000 0.014584610000
186 545 0.359700000000 0.9803000000000 0.013400000000
187 546 0.374083900000 0.9840924000000 0.012307230000
188 547 0.388639600000 0.9874182000000 0.011301880000
189 548 0.403378400000 0.9903128000000 0.010377920000
190 549 0.418311500000 0.9928116000000 0.009529306000
191 550 0.433449900000 0.9949501000000 0.008749999000
192 551 0.448795300000 0.9967108000000 0.008035200000
193 552 0.464336000000 0.9980983000000 0.007381600000
194 553 0.480064000000 0.9991120000000 0.006785400000
195 554 0.495971300000 0.9997482000000 0.006242800000
196 555 0.512050100000 1.0000000000000 0.005749999000
197 556 0.528295900000 0.9998567000000 0.005303600000
198 557 0.544691600000 0.9993046000000 0.004899800000
199 558 0.561209400000 0.9983255000000 0.004534200000
200 559 0.577821500000 0.9968987000000 0.004202400000
201 560 0.594500000000 0.9950000000000 0.003900000000
202 561 0.611220900000 0.9926005000000 0.003623200000
203 562 0.627975800000 0.9897426000000 0.003370600000
204 563 0.644760200000 0.9864444000000 0.003141400000
205 564 0.661569700000 0.9827241000000 0.002934800000
206 565 0.678400000000 0.9786000000000 0.002749999000
207 566 0.695239200000 0.9740837000000 0.002585200000
208 567 0.712058600000 0.9691712000000 0.002438600000
209 568 0.728828400000 0.9638568000000 0.002309400000
210 569 0.745518800000 0.9581349000000 0.002196800000
211 570 0.762100000000 0.9520000000000 0.002100000000
212 571 0.778543200000 0.9454504000000 0.002017733000
213 572 0.794825600000 0.9384992000000 0.001948200000
214 573 0.810926400000 0.9311628000000 0.001889800000
215 574 0.826824800000 0.9234576000000 0.001840933000
216 575 0.842500000000 0.9154000000000 0.001800000000
217 576 0.857932500000 0.9070064000000 0.001766267000
218 577 0.873081600000 0.8982772000000 0.001737800000
219 578 0.887894400000 0.8892048000000 0.001711200000
220 579 0.902318100000 0.8797816000000 0.001683067000
221 580 0.916300000000 0.8700000000000 0.001650001000
222 581 0.929799500000 0.8598613000000 0.001610133000
223 582 0.942798400000 0.8493920000000 0.001564400000
224 583 0.955277600000 0.8386220000000 0.001513600000
225 584 0.967217900000 0.8275813000000 0.001458533000
226 585 0.978600000000 0.8163000000000 0.001400000000
227 586 0.989385600000 0.8047947000000 0.001336667000
228 587 0.999548800000 0.7930820000000 0.001270000000
229 588 1.009089200000 0.7811920000000 0.001205000000
230 589 1.018006400000 0.7691547000000 0.001146667000
231 590 1.026300000000 0.7570000000000 0.001100000000
232 591 1.033982700000 0.7447541000000 0.001068800000
233 592 1.040986000000 0.7324224000000 0.001049400000
234 593 1.047188000000 0.7200036000000 0.001035600000
235 594 1.052466700000 0.7074965000000 0.001021200000
236 595 1.056700000000 0.6949000000000 0.001000000000
237 596 1.059794400000 0.6822192000000 0.000968640000
238 597 1.061799200000 0.6694716000000 0.000929920000
239 598 1.062806800000 0.6566744000000 0.000886880000
240 599 1.062909600000 0.6438448000000 0.000842560000
241 600 1.062200000000 0.6310000000000 0.000800000000
242 601 1.060735200000 0.6181555000000 0.000760960000
243 602 1.058443600000 0.6053144000000 0.000723680000
244 603 1.055224400000 0.5924756000000 0.000685920000
245 604 1.050976800000 0.5796379000000 0.000645440000
246 605 1.045600000000 0.5668000000000 0.000600000000
247 606 1.039036900000 0.5539611000000 0.000547866700
248 607 1.031360800000 0.5411372000000 0.000491600000
249 608 1.022666200000 0.5283528000000 0.000435400000
250 609 1.013047700000 0.5156323000000 0.000383466700
251 610 1.002600000000 0.5030000000000 0.000340000000
252 611 0.991367500000 0.4904688000000 0.000307253300
253 612 0.979331400000 0.4780304000000 0.000283160000
254 613 0.966491600000 0.4656776000000 0.000265440000
255 614 0.952847900000 0.4534032000000 0.000251813300
256 615 0.938400000000 0.4412000000000 0.000240000000
257 616 0.923194000000 0.4290800000000 0.000229546700
258 617 0.907244000000 0.4170360000000 0.000220640000
259 618 0.890502000000 0.4050320000000 0.000211960000
260 619 0.872920000000 0.3930320000000 0.000202186700
261 620 0.854449900000 0.3810000000000 0.000190000000
262 621 0.835084000000 0.3689184000000 0.000174213300
263 622 0.814946000000 0.3568272000000 0.000155640000
264 623 0.794186000000 0.3447768000000 0.000135960000
265 624 0.772954000000 0.3328176000000 0.000116853300
266 625 0.751400000000 0.3210000000000 0.000100000000
267 626 0.729583600000 0.3093381000000 0.000086133330
268 627 0.707588800000 0.2978504000000 0.000074600000
269 628 0.685602200000 0.2865936000000 0.000065000000
270 629 0.663810400000 0.2756245000000 0.000056933330
271 630 0.642400000000 0.2650000000000 0.000049999990
272 631 0.621514900000 0.2547632000000 0.000044160000
273 632 0.601113800000 0.2448896000000 0.000039480000
274 633 0.581105200000 0.2353344000000 0.000035720000
275 634 0.561397700000 0.2260528000000 0.000032640000
276 635 0.541900000000 0.2170000000000 0.000030000000
277 636 0.522599500000 0.2081616000000 0.000027653330
278 637 0.503546400000 0.1995488000000 0.000025560000
279 638 0.484743600000 0.1911552000000 0.000023640000
280 639 0.466193900000 0.1829744000000 0.000021813330
281 640 0.447900000000 0.1750000000000 0.000020000000
282 641 0.429861300000 0.1672235000000 0.000018133330
283 642 0.412098000000 0.1596464000000 0.000016200000
284 643 0.394644000000 0.1522776000000 0.000014200000
285 644 0.377533300000 0.1451259000000 0.000012133330
286 645 0.360800000000 0.1382000000000 0.000010000000
287 646 0.344456300000 0.1315003000000 0.000007733333
288 647 0.328516800000 0.1250248000000 0.000005400000
289 648 0.313019200000 0.1187792000000 0.000003200000
290 649 0.298001100000 0.1127691000000 0.000001333333
291 650 0.283500000000 0.1070000000000 0.000000000000
292 651 0.269544800000 0.1014762000000 0.000000000000
293 652 0.256118400000 0.0961886400000 0.000000000000
294 653 0.243189600000 0.0911229600000 0.000000000000
295 654 0.230727200000 0.0862648500000 0.000000000000
296 655 0.218700000000 0.0816000000000 0.000000000000
297 656 0.207097100000 0.0771206400000 0.000000000000
298 657 0.195923200000 0.0728255200000 0.000000000000
299 658 0.185170800000 0.0687100800000 0.000000000000
300 659 0.174832300000 0.0647697600000 0.000000000000
301 660 0.164900000000 0.0610000000000 0.000000000000
302 661 0.155366700000 0.0573962100000 0.000000000000
303 662 0.146230000000 0.0539550400000 0.000000000000
304 663 0.137490000000 0.0506737600000 0.000000000000
305 664 0.129146700000 0.0475496500000 0.000000000000
306 665 0.121200000000 0.0445800000000 0.000000000000
307 666 0.113639700000 0.0417587200000 0.000000000000
308 667 0.106465000000 0.0390849600000 0.000000000000
309 668 0.099690440000 0.0365638400000 0.000000000000
310 669 0.093330610000 0.0342004800000 0.000000000000
311 670 0.087400000000 0.0320000000000 0.000000000000
312 671 0.081900960000 0.0299626100000 0.000000000000
313 672 0.076804280000 0.0280766400000 0.000000000000
314 673 0.072077120000 0.0263293600000 0.000000000000
315 674 0.067686640000 0.0247080500000 0.000000000000
316 675 0.063600000000 0.0232000000000 0.000000000000
317 676 0.059806850000 0.0218007700000 0.000000000000
318 677 0.056282160000 0.0205011200000 0.000000000000
319 678 0.052971040000 0.0192810800000 0.000000000000
320 679 0.049818610000 0.0181206900000 0.000000000000
321 680 0.046770000000 0.0170000000000 0.000000000000
322 681 0.043784050000 0.0159037900000 0.000000000000
323 682 0.040875360000 0.0148371800000 0.000000000000
324 683 0.038072640000 0.0138106800000 0.000000000000
325 684 0.035404610000 0.0128347800000 0.000000000000
326 685 0.032900000000 0.0119200000000 0.000000000000
327 686 0.030564190000 0.0110683100000 0.000000000000
328 687 0.028380560000 0.0102733900000 0.000000000000
329 688 0.026344840000 0.0095333110000 0.000000000000
330 689 0.024452750000 0.0088461570000 0.000000000000
331 690 0.022700000000 0.0082100000000 0.000000000000
332 691 0.021084290000 0.0076237810000 0.000000000000
333 692 0.019599880000 0.0070854240000 0.000000000000
334 693 0.018237320000 0.0065914760000 0.000000000000
335 694 0.016987170000 0.0061384850000 0.000000000000
336 695 0.015840000000 0.0057230000000 0.000000000000
337 696 0.014790640000 0.0053430590000 0.000000000000
338 697 0.013831320000 0.0049957960000 0.000000000000
339 698 0.012948680000 0.0046764040000 0.000000000000
340 699 0.012129200000 0.0043800750000 0.000000000000
341 700 0.011359160000 0.0041020000000 0.000000000000
342 701 0.010629350000 0.0038384530000 0.000000000000
343 702 0.009938846000 0.0035890990000 0.000000000000
344 703 0.009288422000 0.0033542190000 0.000000000000
345 704 0.008678854000 0.0031340930000 0.000000000000
346 705 0.008110916000 0.0029290000000 0.000000000000
347 706 0.007582388000 0.0027381390000 0.000000000000
348 707 0.007088746000 0.0025598760000 0.000000000000
349 708 0.006627313000 0.0023932440000 0.000000000000
350 709 0.006195408000 0.0022372750000 0.000000000000
351 710 0.005790346000 0.0020910000000 0.000000000000
352 711 0.005409826000 0.0019535870000 0.000000000000
353 712 0.005052583000 0.0018245800000 0.000000000000
354 713 0.004717512000 0.0017035800000 0.000000000000
355 714 0.004403507000 0.0015901870000 0.000000000000
356 715 0.004109457000 0.0014840000000 0.000000000000
357 716 0.003833913000 0.0013844960000 0.000000000000
358 717 0.003575748000 0.0012912680000 0.000000000000
359 718 0.003334342000 0.0012040920000 0.000000000000
360 719 0.003109075000 0.0011227440000 0.000000000000
361 720 0.002899327000 0.0010470000000 0.000000000000
362 721 0.002704348000 0.0009765896000 0.000000000000
363 722 0.002523020000 0.0009111088000 0.000000000000
364 723 0.002354168000 0.0008501332000 0.000000000000
365 724 0.002196616000 0.0007932384000 0.000000000000
366 725 0.002049190000 0.0007400000000 0.000000000000
367 726 0.001910960000 0.0006900827000 0.000000000000
368 727 0.001781438000 0.0006433100000 0.000000000000
369 728 0.001660110000 0.0005994960000 0.000000000000
370 729 0.001546459000 0.0005584547000 0.000000000000
371 730 0.001439971000 0.0005200000000 0.000000000000
372 731 0.001340042000 0.0004839136000 0.000000000000
373 732 0.001246275000 0.0004500528000 0.000000000000
374 733 0.001158471000 0.0004183452000 0.000000000000
375 734 0.001076430000 0.0003887184000 0.000000000000
376 735 0.000999949300 0.0003611000000 0.000000000000
377 736 0.000928735800 0.0003353835000 0.000000000000
378 737 0.000862433200 0.0003114404000 0.000000000000
379 738 0.000800750300 0.0002891656000 0.000000000000
380 739 0.000743396000 0.0002684539000 0.000000000000
381 740 0.000690078600 0.0002492000000 0.000000000000
382 741 0.000640515600 0.0002313019000 0.000000000000
383 742 0.000594502100 0.0002146856000 0.000000000000
384 743 0.000551864600 0.0001992884000 0.000000000000
385 744 0.000512429000 0.0001850475000 0.000000000000
386 745 0.000476021300 0.0001719000000 0.000000000000
387 746 0.000442453600 0.0001597781000 0.000000000000
388 747 0.000411511700 0.0001486044000 0.000000000000
389 748 0.000382981400 0.0001383016000 0.000000000000
390 749 0.000356649100 0.0001287925000 0.000000000000
391 750 0.000332301100 0.0001200000000 0.000000000000
392 751 0.000309758600 0.0001118595000 0.000000000000
393 752 0.000288887100 0.0001043224000 0.000000000000
394 753 0.000269539400 0.0000973356000 0.000000000000
395 754 0.000251568200 0.0000908458700 0.000000000000
396 755 0.000234826100 0.0000848000000 0.000000000000
397 756 0.000219171000 0.0000791466700 0.000000000000
398 757 0.000204525800 0.0000738580000 0.000000000000
399 758 0.000190840500 0.0000689160000 0.000000000000
400 759 0.000178065400 0.0000643026700 0.000000000000
401 760 0.000166150500 0.0000600000000 0.000000000000
402 761 0.000155023600 0.0000559818700 0.000000000000
403 762 0.000144621900 0.0000522256000 0.000000000000
404 763 0.000134909800 0.0000487184000 0.000000000000
405 764 0.000125852000 0.0000454474700 0.000000000000
406 765 0.000117413000 0.0000424000000 0.000000000000
407 766 0.000109551500 0.0000395610400 0.000000000000
408 767 0.000102224500 0.0000369151200 0.000000000000
409 768 0.000095394450 0.0000344486800 0.000000000000
410 769 0.000089023900 0.0000321481600 0.000000000000
411 770 0.000083075270 0.0000300000000 0.000000000000
412 771 0.000077512690 0.0000279912500 0.000000000000
413 772 0.000072313040 0.0000261135600 0.000000000000
414 773 0.000067457780 0.0000243602400 0.000000000000
415 774 0.000062928440 0.0000227246100 0.000000000000
416 775 0.000058706520 0.0000212000000 0.000000000000
417 776 0.000054770280 0.0000197785500 0.000000000000
418 777 0.000051099180 0.0000184528500 0.000000000000
419 778 0.000047676540 0.0000172168700 0.000000000000
420 779 0.000044485670 0.0000160645900 0.000000000000
421 780 0.000041509940 0.0000149900000 0.000000000000
422 781 0.000038733240 0.0000139872800 0.000000000000
423 782 0.000036142030 0.0000130515500 0.000000000000
424 783 0.000033723520 0.0000121781800 0.000000000000
425 784 0.000031464870 0.0000113625400 0.000000000000
426 785 0.000029353260 0.0000106000000 0.000000000000
427 786 0.000027375730 0.0000098858770 0.000000000000
428 787 0.000025524330 0.0000092173040 0.000000000000
429 788 0.000023793760 0.0000085923620 0.000000000000
430 789 0.000022178700 0.0000080091330 0.000000000000
431 790 0.000020673830 0.0000074657000 0.000000000000
432 791 0.000019272260 0.0000069595670 0.000000000000
433 792 0.000017966400 0.0000064879950 0.000000000000
434 793 0.000016749910 0.0000060486990 0.000000000000
435 794 0.000015616480 0.0000056393960 0.000000000000
436 795 0.000014559770 0.0000052578000 0.000000000000
437 796 0.000013573870 0.0000049017710 0.000000000000
438 797 0.000012654360 0.0000045697200 0.000000000000
439 798 0.000011797230 0.0000042601940 0.000000000000
440 799 0.000010998440 0.0000039717390 0.000000000000
441 800 0.000010253980 0.0000037029000 0.000000000000
442 801 0.000009559646 0.0000034521630 0.000000000000
443 802 0.000008912044 0.0000032183020 0.000000000000
444 803 0.000008308358 0.0000030003000 0.000000000000
445 804 0.000007745769 0.0000027971390 0.000000000000
446 805 0.000007221456 0.0000026078000 0.000000000000
447 806 0.000006732475 0.0000024312200 0.000000000000
448 807 0.000006276423 0.0000022665310 0.000000000000
449 808 0.000005851304 0.0000021130130 0.000000000000
450 809 0.000005455118 0.0000019699430 0.000000000000
451 810 0.000005085868 0.0000018366000 0.000000000000
452 811 0.000004741466 0.0000017122300 0.000000000000
453 812 0.000004420236 0.0000015962280 0.000000000000
454 813 0.000004120783 0.0000014880900 0.000000000000
455 814 0.000003841716 0.0000013873140 0.000000000000
456 815 0.000003581652 0.0000012934000 0.000000000000
457 816 0.000003339127 0.0000012058200 0.000000000000
458 817 0.000003112949 0.0000011241430 0.000000000000
459 818 0.000002902121 0.0000010480090 0.000000000000
460 819 0.000002705645 0.0000009770578 0.000000000000
461 820 0.000002522525 0.0000009109300 0.000000000000
462 821 0.000002351726 0.0000008492513 0.000000000000
463 822 0.000002192415 0.0000007917212 0.000000000000
464 823 0.000002043902 0.0000007380904 0.000000000000
465 824 0.000001905497 0.0000006881098 0.000000000000
466 825 0.000001776509 0.0000006415300 0.000000000000
467 826 0.000001656215 0.0000005980895 0.000000000000
468 827 0.000001544022 0.0000005575746 0.000000000000
469 828 0.000001439440 0.0000005198080 0.000000000000
470 829 0.000001341977 0.0000004846123 0.000000000000
471 830 0.000001251141 0.0000004518100 0.000000000000

View File

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 158 KiB