Compare commits
1 Commits
00fbf4e4f1
...
a0f562a930
Author | SHA1 | Date |
---|---|---|
jbb01 | a0f562a930 | 6 months ago |
@ -1,21 +0,0 @@
|
|||||||
package eu.jonahbauer.raytracing.math;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A vector-like object that implements the standard mathematical operations
|
|
||||||
* @param <T> the type
|
|
||||||
*/
|
|
||||||
public interface IVec<T extends IVec<T>> {
|
|
||||||
double get(int i);
|
|
||||||
|
|
||||||
@NotNull T plus(@NotNull T other);
|
|
||||||
@NotNull T minus(@NotNull T other);
|
|
||||||
@NotNull T times(@NotNull T other);
|
|
||||||
@NotNull T times(double d);
|
|
||||||
default @NotNull T div(double d) {
|
|
||||||
return times(1 / d);
|
|
||||||
}
|
|
||||||
|
|
||||||
double @NotNull[] toArray();
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
package eu.jonahbauer.raytracing.math;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A vector-like object with three components.
|
|
||||||
* @param <T> the type
|
|
||||||
*/
|
|
||||||
public interface IVec3<T extends Record & IVec3<T>> extends IVec<T> {
|
|
||||||
default double component1() {
|
|
||||||
return toVec3().x();
|
|
||||||
}
|
|
||||||
default double component2() {
|
|
||||||
return toVec3().y();
|
|
||||||
}
|
|
||||||
default double component3() {
|
|
||||||
return toVec3().z();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
default double get(int i) {
|
|
||||||
return switch (i) {
|
|
||||||
case 0 -> component1();
|
|
||||||
case 1 -> component2();
|
|
||||||
case 2 -> component3();
|
|
||||||
default -> throw new IndexOutOfBoundsException(i);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull Vec3 toVec3();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
default double @NotNull [] toArray() {
|
|
||||||
return new double[] {component1(), component2(), component3()};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +1,22 @@
|
|||||||
package eu.jonahbauer.raytracing.render.canvas;
|
package eu.jonahbauer.raytracing.render.canvas;
|
||||||
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.SampledSpectrum;
|
import eu.jonahbauer.raytracing.render.texture.Color;
|
||||||
import eu.jonahbauer.raytracing.render.spectral.SampledWavelengths;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.colors.ColorRGB;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.colors.ColorSpace;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public interface Canvas {
|
public interface Canvas {
|
||||||
/**
|
|
||||||
* {@return the width of this canvas}
|
|
||||||
*/
|
|
||||||
int getWidth();
|
int getWidth();
|
||||||
|
|
||||||
/**
|
|
||||||
* {@return the height of this canvas}
|
|
||||||
*/
|
|
||||||
int getHeight();
|
int getHeight();
|
||||||
|
|
||||||
/**
|
void set(int x, int y, @NotNull Color color);
|
||||||
* Adds a sample to this canvas
|
@NotNull Color get(int x, int y);
|
||||||
* @param x the pixel x coordinate
|
|
||||||
* @param y the pixel y coordinate
|
|
||||||
* @param n the index of the sample
|
|
||||||
* @param spectrum the sampled spectrum
|
|
||||||
* @param lambda the sampled wavelengths
|
|
||||||
*/
|
|
||||||
void add(int x, int y, int n, @NotNull SampledSpectrum spectrum, @NotNull SampledWavelengths lambda);
|
|
||||||
|
|
||||||
/**
|
default @NotNull Stream<Color> pixels() {
|
||||||
* {@return the color at a given pixel}
|
return IntStream.range(0, getHeight())
|
||||||
* @param x the pixel x coordinate
|
.mapToObj(y -> IntStream.range(0, getWidth()).mapToObj(x -> get(x, y)))
|
||||||
* @param y the pixel y coordinate
|
.flatMap(Function.identity());
|
||||||
* @param cs the color space of the output
|
}
|
||||||
*/
|
|
||||||
@NotNull ColorRGB getRGB(int x, int y, @NotNull ColorSpace cs);
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,58 @@
|
|||||||
|
package eu.jonahbauer.raytracing.render.canvas;
|
||||||
|
|
||||||
|
import eu.jonahbauer.raytracing.render.texture.Color;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public final class Image implements Canvas {
|
||||||
|
private final int width;
|
||||||
|
private final int height;
|
||||||
|
|
||||||
|
private final Color[][] data;
|
||||||
|
|
||||||
|
public Image(int width, int height) {
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
|
||||||
|
if (width <= 0) throw new IllegalArgumentException("width must be positive");
|
||||||
|
if (height <= 0) throw new IllegalArgumentException("height must be positive");
|
||||||
|
|
||||||
|
this.data = new Color[height][width];
|
||||||
|
}
|
||||||
|
|
||||||
|
public Image(@NotNull BufferedImage image) {
|
||||||
|
this(image.getWidth(), image.getHeight());
|
||||||
|
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
this.data[y][x] = new Color(image.getRGB(x, y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getWidth() {
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getHeight() {
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Color get(int x, int y) {
|
||||||
|
Objects.checkIndex(x, width);
|
||||||
|
Objects.checkIndex(y, height);
|
||||||
|
return Objects.requireNonNullElse(this.data[y][x], Color.BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(int x, int y, @NotNull Color color) {
|
||||||
|
Objects.checkIndex(x, width);
|
||||||
|
Objects.checkIndex(y, height);
|
||||||
|
this.data[y][x] = Objects.requireNonNull(color);
|
||||||
|
}
|
||||||
|
}
|
@ -1,76 +0,0 @@
|
|||||||
package eu.jonahbauer.raytracing.render.canvas;
|
|
||||||
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.SampledSpectrum;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.SampledWavelengths;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.colors.ColorRGB;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.colors.ColorSpace;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
public final class RGBCanvas implements Canvas {
|
|
||||||
private final int width;
|
|
||||||
private final int height;
|
|
||||||
|
|
||||||
private final @NotNull ColorSpace cs;
|
|
||||||
private final @NotNull ColorRGB[][] data;
|
|
||||||
|
|
||||||
public RGBCanvas(int width, int height, @NotNull ColorSpace cs) {
|
|
||||||
this.width = width;
|
|
||||||
this.height = height;
|
|
||||||
this.cs = Objects.requireNonNull(cs);
|
|
||||||
|
|
||||||
if (width <= 0) throw new IllegalArgumentException("width must be positive");
|
|
||||||
if (height <= 0) throw new IllegalArgumentException("height must be positive");
|
|
||||||
|
|
||||||
this.data = new ColorRGB[height][width];
|
|
||||||
}
|
|
||||||
|
|
||||||
public RGBCanvas(@NotNull BufferedImage image, @NotNull ColorSpace cs) {
|
|
||||||
this(image.getWidth(), image.getHeight(), cs);
|
|
||||||
|
|
||||||
for (int y = 0; y < height; y++) {
|
|
||||||
for (int x = 0; x < width; x++) {
|
|
||||||
this.data[y][x] = new ColorRGB(image.getRGB(x, y));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getWidth() {
|
|
||||||
return width;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getHeight() {
|
|
||||||
return height;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void add(int x, int y, int n, @NotNull SampledSpectrum spectrum, @NotNull SampledWavelengths lambda) {
|
|
||||||
assert x < width;
|
|
||||||
assert y < height;
|
|
||||||
|
|
||||||
var rgb = spectrum.toRGB(lambda, cs);
|
|
||||||
data[y][x] = ColorRGB.average(data[y][x], rgb, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull ColorRGB getRGB(int x, int y, @NotNull ColorSpace cs) {
|
|
||||||
if (cs == this.cs) return get(x, y);
|
|
||||||
return cs.toRGB(this.cs.toXYZ(get(x, y)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public @NotNull ColorRGB get(int x, int y) {
|
|
||||||
assert x < width;
|
|
||||||
assert y < height;
|
|
||||||
return Objects.requireNonNullElse(data[y][x], ColorRGB.BLACK);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void set(int x, int y, @NotNull ColorRGB color) {
|
|
||||||
assert x < width;
|
|
||||||
assert y < height;
|
|
||||||
data[y][x] = Objects.requireNonNull(color);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,74 +0,0 @@
|
|||||||
package eu.jonahbauer.raytracing.render.canvas;
|
|
||||||
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.SampledSpectrum;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.SampledWavelengths;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.colors.ColorRGB;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.colors.ColorSpace;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.colors.ColorXYZ;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
public final class XYZCanvas implements Canvas {
|
|
||||||
private final int width;
|
|
||||||
private final int height;
|
|
||||||
|
|
||||||
private final @NotNull ColorXYZ[][] data;
|
|
||||||
|
|
||||||
public XYZCanvas(int width, int height) {
|
|
||||||
this.width = width;
|
|
||||||
this.height = height;
|
|
||||||
|
|
||||||
if (width <= 0) throw new IllegalArgumentException("width must be positive");
|
|
||||||
if (height <= 0) throw new IllegalArgumentException("height must be positive");
|
|
||||||
|
|
||||||
this.data = new ColorXYZ[height][width];
|
|
||||||
}
|
|
||||||
|
|
||||||
public XYZCanvas(@NotNull BufferedImage image, @NotNull ColorSpace cs) {
|
|
||||||
this(image.getWidth(), image.getHeight());
|
|
||||||
|
|
||||||
for (int y = 0; y < height; y++) {
|
|
||||||
for (int x = 0; x < width; x++) {
|
|
||||||
data[y][x] = cs.toXYZ(new ColorRGB(image.getRGB(x, y)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getWidth() {
|
|
||||||
return width;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getHeight() {
|
|
||||||
return height;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void add(int x, int y, int n, @NotNull SampledSpectrum spectrum, @NotNull SampledWavelengths lambda) {
|
|
||||||
assert x < width;
|
|
||||||
assert y < height;
|
|
||||||
|
|
||||||
var xyz = spectrum.toXYZ(lambda);
|
|
||||||
data[y][x] = ColorXYZ.average(get(x, y), xyz, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
public @NotNull ColorXYZ get(int x, int y) {
|
|
||||||
assert x < width;
|
|
||||||
assert y < height;
|
|
||||||
return Objects.requireNonNullElse(data[y][x], ColorXYZ.BLACK);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull ColorRGB getRGB(int x, int y, @NotNull ColorSpace cs) {
|
|
||||||
return cs.toRGB(get(x, y));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void set(int x, int y, @NotNull ColorXYZ color) {
|
|
||||||
assert x < width;
|
|
||||||
assert y < height;
|
|
||||||
data[y][x] = Objects.requireNonNull(color);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,34 +1,22 @@
|
|||||||
package eu.jonahbauer.raytracing.render.material;
|
package eu.jonahbauer.raytracing.render.material;
|
||||||
|
|
||||||
import eu.jonahbauer.raytracing.math.Ray;
|
import eu.jonahbauer.raytracing.math.Ray;
|
||||||
import eu.jonahbauer.raytracing.render.spectral.colors.ColorRGB;
|
import eu.jonahbauer.raytracing.render.texture.Color;
|
||||||
import eu.jonahbauer.raytracing.render.spectral.colors.ColorSpace;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.spectrum.RGBIlluminantSpectrum;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.spectrum.Spectrum;
|
|
||||||
import eu.jonahbauer.raytracing.render.texture.Texture;
|
import eu.jonahbauer.raytracing.render.texture.Texture;
|
||||||
import eu.jonahbauer.raytracing.scene.HitResult;
|
import eu.jonahbauer.raytracing.scene.HitResult;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.random.RandomGenerator;
|
import java.util.random.RandomGenerator;
|
||||||
|
|
||||||
public record DiffuseLight(@NotNull Texture texture) implements Material {
|
public record DiffuseLight(@NotNull Texture texture) implements Material {
|
||||||
public DiffuseLight {
|
|
||||||
Objects.requireNonNull(texture, "texture");
|
|
||||||
}
|
|
||||||
|
|
||||||
public DiffuseLight(@NotNull ColorRGB color, @NotNull ColorSpace cs) {
|
|
||||||
this(new RGBIlluminantSpectrum(cs, color));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull Optional<ScatterResult> scatter(@NotNull Ray ray, @NotNull HitResult hit, @NotNull RandomGenerator random) {
|
public @NotNull Optional<ScatterResult> scatter(@NotNull Ray ray, @NotNull HitResult hit, @NotNull RandomGenerator random) {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull Spectrum emitted(@NotNull HitResult hit) {
|
public @NotNull Color emitted(@NotNull HitResult hit) {
|
||||||
return texture.get(hit);
|
return texture.get(hit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
package eu.jonahbauer.raytracing.render.spectral.colors;
|
package eu.jonahbauer.raytracing.render.spectral.colors;
|
||||||
|
|
||||||
/**
|
|
||||||
* A pair of chromaticity coordinates in the xyY color space
|
|
||||||
* @param x the x coordinate
|
|
||||||
* @param y the y coordinate
|
|
||||||
*/
|
|
||||||
public record Chromaticity(double x, double y) {
|
public record Chromaticity(double x, double y) {
|
||||||
}
|
}
|
||||||
|
@ -1,153 +0,0 @@
|
|||||||
package eu.jonahbauer.raytracing.render.spectral.colors;
|
|
||||||
|
|
||||||
import eu.jonahbauer.raytracing.math.IVec3;
|
|
||||||
import eu.jonahbauer.raytracing.math.Vec3;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
import static eu.jonahbauer.raytracing.Main.DEBUG;
|
|
||||||
|
|
||||||
public record ColorRGB(double r, double g, double b) implements IVec3<ColorRGB> {
|
|
||||||
public static final @NotNull ColorRGB BLACK = new ColorRGB(0.0, 0.0, 0.0);
|
|
||||||
public static final @NotNull ColorRGB WHITE = new ColorRGB(1.0, 1.0, 1.0);
|
|
||||||
|
|
||||||
public static @NotNull ColorRGB random(@NotNull Random random) {
|
|
||||||
return new ColorRGB(random.nextDouble(), random.nextDouble(), random.nextDouble());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static @NotNull ColorRGB random(@NotNull Random random, double min, double max) {
|
|
||||||
var span = max - min;
|
|
||||||
return new ColorRGB(
|
|
||||||
Math.fma(random.nextDouble(), span, min),
|
|
||||||
Math.fma(random.nextDouble(), span, min),
|
|
||||||
Math.fma(random.nextDouble(), span, min)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ColorRGB(int rgb) {
|
|
||||||
this((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ColorRGB(int red, int green, int blue) {
|
|
||||||
this(red / 255f, green / 255f, blue / 255f);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ColorRGB {
|
|
||||||
if (DEBUG && (!Double.isFinite(r) || !Double.isFinite(g) || !Double.isFinite(b))) {
|
|
||||||
throw new IllegalArgumentException("r, g and b must be finite");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Math
|
|
||||||
*/
|
|
||||||
|
|
||||||
public static @NotNull ColorRGB average(@NotNull ColorRGB current, @NotNull ColorRGB next, int index) {
|
|
||||||
return lerp(current, next, 1d / index);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static @NotNull ColorRGB lerp(@NotNull ColorRGB a, @NotNull ColorRGB b, double t) {
|
|
||||||
if (t < 0) return a;
|
|
||||||
if (t > 1) return b;
|
|
||||||
return new ColorRGB(
|
|
||||||
Math.fma(t, b.r - a.r, a.r),
|
|
||||||
Math.fma(t, b.g - a.g, a.g),
|
|
||||||
Math.fma(t, b.b - a.b, a.b)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static @NotNull ColorRGB fma(@NotNull ColorRGB a, @NotNull ColorRGB b, @NotNull ColorRGB c) {
|
|
||||||
return new ColorRGB(
|
|
||||||
Math.fma(a.r, b.r, c.r),
|
|
||||||
Math.fma(a.g, b.g, c.g),
|
|
||||||
Math.fma(a.b, b.b, c.b)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static @NotNull ColorRGB gamma(@NotNull ColorRGB color) {
|
|
||||||
return new ColorRGB(gamma(color.r), gamma(color.g), gamma(color.b));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static @NotNull ColorRGB inverseGamma(@NotNull ColorRGB color) {
|
|
||||||
return new ColorRGB(inverseGamma(color.r), inverseGamma(color.g), inverseGamma(color.b));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static double gamma(double value) {
|
|
||||||
if (value <= 0.0031308) return 12.92 * value;
|
|
||||||
return 1.055 * Math.pow(value, 1. / 2.4) - 0.055;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static double inverseGamma(double value) {
|
|
||||||
if (value <= 0.04045) return value / 12.92;
|
|
||||||
return Math.pow((value + 0.055) / 1.055, 2.4d);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull ColorRGB plus(@NotNull ColorRGB other) {
|
|
||||||
return new ColorRGB(r + other.r, g + other.g, b + other.b);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull ColorRGB minus(@NotNull ColorRGB other) {
|
|
||||||
return new ColorRGB(r - other.r, g - other.g, b - other.b);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull ColorRGB times(double d) {
|
|
||||||
return new ColorRGB(r * d, g * d, b * d);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull ColorRGB times(@NotNull ColorRGB other) {
|
|
||||||
return new ColorRGB(r * other.r, g * other.g, b * other.b);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Vec3
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull Vec3 toVec3() {
|
|
||||||
return new Vec3(r, g, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static @NotNull ColorRGB fromVec3(@NotNull Vec3 vec) {
|
|
||||||
return new ColorRGB(vec.x(), vec.y(), vec.z());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Accessors
|
|
||||||
*/
|
|
||||||
|
|
||||||
public int red() {
|
|
||||||
return toInt(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int green() {
|
|
||||||
return toInt(g);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int blue() {
|
|
||||||
return toInt(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int toInt(double value) {
|
|
||||||
return Math.clamp((int) (255.99 * value), 0, 255);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double component1() {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double component2() {
|
|
||||||
return g;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double component3() {
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,204 +0,0 @@
|
|||||||
package eu.jonahbauer.raytracing.render.spectral.colors;
|
|
||||||
|
|
||||||
import eu.jonahbauer.raytracing.math.Matrix3;
|
|
||||||
import eu.jonahbauer.raytracing.math.Vec3;
|
|
||||||
import eu.jonahbauer.raytracing.render.spectral.spectrum.Spectrum;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.stream.IntStream;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates a lookup table for RGB to spectrum conversion.
|
|
||||||
* <p>
|
|
||||||
* The spectrum for each RGB value is a {@link SigmoidPolynomial} with coefficients such that the round trip error
|
|
||||||
* from converting the RGB value to a spectrum and back is minimized.
|
|
||||||
* <p>
|
|
||||||
* <img src="doc-files/rgb2spectrum.png">
|
|
||||||
*/
|
|
||||||
public final class SpectrumTableGenerator {
|
|
||||||
private static final double EPSILON = 1e-4;
|
|
||||||
private static final int ITERATIONS = 15;
|
|
||||||
|
|
||||||
private final int resolution = 64;
|
|
||||||
private final @NotNull ColorSpace cs;
|
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException {
|
|
||||||
var generator = new SpectrumTableGenerator(ColorSpaces.DCI_P3);
|
|
||||||
var table = generator.generate();
|
|
||||||
|
|
||||||
try (var out = Files.newOutputStream(Path.of("DCI_P3_spectrum.bin"))) {
|
|
||||||
SpectrumTable.write(table, out);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SpectrumTableGenerator(@NotNull ColorSpace cs) {
|
|
||||||
this.cs = Objects.requireNonNull(cs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public @NotNull SpectrumTable generate() {
|
|
||||||
var scale = new double[resolution];
|
|
||||||
for (int i = 0; i < scale.length; i++) {
|
|
||||||
var t = (double) i / (resolution - 1);
|
|
||||||
scale[i] = smoothstep(smoothstep(t));
|
|
||||||
}
|
|
||||||
|
|
||||||
var table = new double[3 * resolution * resolution * resolution * 3];
|
|
||||||
|
|
||||||
for (int l0 = 0; l0 < 3; l0++) {
|
|
||||||
var l = l0;
|
|
||||||
IntStream.range(0, resolution).parallel().forEach(i -> {
|
|
||||||
System.out.println("l = " + l + ", i = " + i);
|
|
||||||
var x = (double) i / (resolution - 1);
|
|
||||||
for (int j = 0; j < resolution; j++) {
|
|
||||||
var y = (double) j / (resolution - 1);
|
|
||||||
|
|
||||||
var start = resolution / 5;
|
|
||||||
|
|
||||||
var c = new double[3];
|
|
||||||
for (int k = start; k < resolution; k++) {
|
|
||||||
var z = scale[k];
|
|
||||||
var idx = ((((l * resolution + k) * resolution) + j) * resolution + i) * 3;
|
|
||||||
var color = getColor(l, x, y, z);
|
|
||||||
generate(color, c, table, idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
Arrays.fill(c, 0);
|
|
||||||
for (int k = start; k >= 0; --k) {
|
|
||||||
var z = scale[k];
|
|
||||||
var idx = ((((l * resolution + k) * resolution) + j) * resolution + i) * 3;
|
|
||||||
var color = getColor(l, x, y, z);
|
|
||||||
generate(color, c, table, idx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return new SpectrumTable(resolution, scale, table);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generate(@NotNull ColorRGB rgb, double @NotNull[] c, double @NotNull[] out, int offset) {
|
|
||||||
gaussNewton(rgb, c, ITERATIONS);
|
|
||||||
double c0 = 360.0, c1 = 1.0 / (830.0 - 360.0);
|
|
||||||
double A = c[0], B = c[1], C = c[2];
|
|
||||||
out[offset] = A * c1 * c1;
|
|
||||||
out[offset + 1] = B * c1 - 2 * A * c0 * c1 * c1;
|
|
||||||
out[offset + 2] = C - B * c0 * c1 + A * c0 * c0 * c1 * c1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Use Gauss-Newton algorithm to calculate coefficients {@code c} of a {@link SigmoidPolynomial} such that the round
|
|
||||||
* trip error from converting the {@code rgb} value to a spectrum and back is minimized.
|
|
||||||
* @param rgb the input color
|
|
||||||
* @param c the coefficients, used as initial values and output
|
|
||||||
* @param it the number of iterations
|
|
||||||
*/
|
|
||||||
private void gaussNewton(@NotNull ColorRGB rgb, double @NotNull[] c, int it) {
|
|
||||||
var bestQuality = Double.POSITIVE_INFINITY;
|
|
||||||
var bestCoefficients = new double[3];
|
|
||||||
|
|
||||||
for (int i = 0; i < it; ++i) {
|
|
||||||
var polynomial = new SigmoidPolynomial(c[0], c[1], c[2]);
|
|
||||||
var residual = getResidual(rgb, polynomial);
|
|
||||||
var jacobian = getJacobian(rgb, polynomial);
|
|
||||||
|
|
||||||
var delta = jacobian.decompose(1e-15).solve(residual);
|
|
||||||
for (int j = 0; j < 3; ++j) {
|
|
||||||
c[j] -= delta.get(j);
|
|
||||||
}
|
|
||||||
|
|
||||||
// catch runaway
|
|
||||||
double max = Math.max(Math.max(c[0], c[1]), c[2]);
|
|
||||||
if (max > 200) {
|
|
||||||
for (int j = 0; j < 3; ++j) {
|
|
||||||
c[j] *= 200 / max;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var quality = residual.squared();
|
|
||||||
if (quality <= 1e-6) {
|
|
||||||
return;
|
|
||||||
} else if (quality < bestQuality) {
|
|
||||||
bestQuality = quality;
|
|
||||||
System.arraycopy(c, 0, bestCoefficients, 0, 3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
System.arraycopy(bestCoefficients, 0, c, 0, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates the Jacobian matrix of the {@code polynomial}.
|
|
||||||
*/
|
|
||||||
private @NotNull Matrix3 getJacobian(@NotNull ColorRGB rgb, @NotNull SigmoidPolynomial polynomial) {
|
|
||||||
var jac = new double[3][3];
|
|
||||||
|
|
||||||
// central finite difference coefficients for first derivative with sixth-order accuracy
|
|
||||||
var factors = new double[] { -1d/60, 3d/20, -3d/4, 0, 3d/4, -3d/20, 1d/60 };
|
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++) {
|
|
||||||
var derivative = Vec3.ZERO;
|
|
||||||
for (int d = - factors.length / 2, j = 0; j < factors.length; d++, j++) {
|
|
||||||
if (factors[j] == 0) continue;
|
|
||||||
var tmp = switch (i) {
|
|
||||||
case 0 -> new SigmoidPolynomial(polynomial.c0() + d * EPSILON, polynomial.c1(), polynomial.c2());
|
|
||||||
case 1 -> new SigmoidPolynomial(polynomial.c0(), polynomial.c1() + d * EPSILON, polynomial.c2());
|
|
||||||
case 2 -> new SigmoidPolynomial(polynomial.c0(), polynomial.c1(), polynomial.c2() + d * EPSILON);
|
|
||||||
default -> throw new AssertionError();
|
|
||||||
};
|
|
||||||
var r = getResidual(rgb, tmp);
|
|
||||||
derivative = Vec3.fma(factors[j], r, derivative);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int j = 0; j < 3; j++) {
|
|
||||||
jac[j][i] = derivative.get(j) / EPSILON;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Matrix3(
|
|
||||||
jac[0][0], jac[0][1], jac[0][2],
|
|
||||||
jac[1][0], jac[1][1], jac[1][2],
|
|
||||||
jac[2][0], jac[2][1], jac[2][2]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates the difference between the RGB color and the result of converting the RGB color to a spectrum using
|
|
||||||
* the given coefficients, illuminating it with the color space's standard illuminant, and converting it back to an
|
|
||||||
* RBG color. The output is a vector in CIE Lab color space.
|
|
||||||
*/
|
|
||||||
private @NotNull Vec3 getResidual(@NotNull ColorRGB rgb, @NotNull SigmoidPolynomial polynomial) {
|
|
||||||
var out = new SigmoidPolynomialSpectrum(polynomial, cs).toXYZ();
|
|
||||||
return cs.toCIELab(rgb).minus(cs.toCIELab(out));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static double smoothstep(double x) {
|
|
||||||
return x * x * (3.0 - 2.0 * x);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static @NotNull ColorRGB getColor(int l, double x, double y, double z) {
|
|
||||||
var rgb = new double[3];
|
|
||||||
rgb[l] = z;
|
|
||||||
rgb[(l + 1) % 3] = x * z;
|
|
||||||
rgb[(l + 2) % 3] = y * z;
|
|
||||||
return new ColorRGB(rgb[0], rgb[1], rgb[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
private record SigmoidPolynomialSpectrum(@NotNull SigmoidPolynomial polynomial, @NotNull ColorSpace cs) implements Spectrum {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double max() {
|
|
||||||
return polynomial.max();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double get(double lambda) {
|
|
||||||
var l = (lambda - Spectrum.LAMBDA_MIN) / (Spectrum.LAMBDA_MAX - Spectrum.LAMBDA_MIN);
|
|
||||||
return polynomial.get(l) * cs.illuminant().get(lambda);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 4.6 KiB |
@ -1,15 +0,0 @@
|
|||||||
package eu.jonahbauer.raytracing.render.spectral.spectrum;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
public record ScaledSpectrum(@NotNull Spectrum spectrum, double scale) implements Spectrum {
|
|
||||||
@Override
|
|
||||||
public double max() {
|
|
||||||
return spectrum.max() * scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double get(double lambda) {
|
|
||||||
return spectrum.get(lambda) * scale;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
package eu.jonahbauer.raytracing.render.spectral.spectrum;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
final class Util {
|
|
||||||
private Util() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double innerProduct(@NotNull Spectrum f, @NotNull Spectrum g) {
|
|
||||||
var integral = 0.0;
|
|
||||||
for (var lambda = Spectrum.LAMBDA_MIN; lambda <= Spectrum.LAMBDA_MAX; lambda++) {
|
|
||||||
integral += f.get(lambda) * g.get(lambda);
|
|
||||||
}
|
|
||||||
return integral;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,148 @@
|
|||||||
|
package eu.jonahbauer.raytracing.render.texture;
|
||||||
|
|
||||||
|
import eu.jonahbauer.raytracing.math.Ray;
|
||||||
|
import eu.jonahbauer.raytracing.math.Vec3;
|
||||||
|
import eu.jonahbauer.raytracing.scene.SkyBox;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import static eu.jonahbauer.raytracing.Main.DEBUG;
|
||||||
|
|
||||||
|
public record Color(double r, double g, double b) implements Texture, SkyBox {
|
||||||
|
public static final @NotNull Color BLACK = new Color(0.0, 0.0, 0.0);
|
||||||
|
public static final @NotNull Color WHITE = new Color(1.0, 1.0, 1.0);
|
||||||
|
public static final @NotNull Color RED = new Color(1.0, 0.0, 0.0);
|
||||||
|
public static final @NotNull Color GREEN = new Color(0.0, 1.0, 0.0);
|
||||||
|
public static final @NotNull Color BLUE = new Color(0.0, 0.0, 1.0);
|
||||||
|
|
||||||
|
public static @NotNull Color lerp(@NotNull Color a, @NotNull Color b, double t) {
|
||||||
|
if (t < 0) return a;
|
||||||
|
if (t > 1) return b;
|
||||||
|
return new Color(
|
||||||
|
Math.fma(t, b.r, Math.fma(-t, a.r, a.r)),
|
||||||
|
Math.fma(t, b.g, Math.fma(-t, a.g, a.g)),
|
||||||
|
Math.fma(t, b.b, Math.fma(-t, a.b, a.b))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @NotNull Color multiply(@NotNull Color a, @NotNull Color b) {
|
||||||
|
return new Color(a.r() * b.r(), a.g() * b.g(), a.b() * b.b());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @NotNull Color multiply(@NotNull Color a, double b) {
|
||||||
|
return new Color(a.r() * b, a.g() * b, a.b() * b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @NotNull Color add(@NotNull Color a, @NotNull Color b) {
|
||||||
|
return new Color(a.r() + b.r(), a.g() + b.g(), a.b() + b.b());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @NotNull Color random(@NotNull Random random) {
|
||||||
|
return new Color(random.nextDouble(), random.nextDouble(), random.nextDouble());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @NotNull Color random(@NotNull Random random, double min, double max) {
|
||||||
|
var span = max - min;
|
||||||
|
return new Color(
|
||||||
|
Math.fma(random.nextDouble(), span, min),
|
||||||
|
Math.fma(random.nextDouble(), span, min),
|
||||||
|
Math.fma(random.nextDouble(), span, min)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @NotNull Color average(@NotNull Color current, @NotNull Color next, int index) {
|
||||||
|
var factor = 1d / index;
|
||||||
|
return new Color(
|
||||||
|
Math.fma(factor, next.r() - current.r(), current.r()),
|
||||||
|
Math.fma(factor, next.g() - current.g(), current.g()),
|
||||||
|
Math.fma(factor, next.b() - current.b(), current.b())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @NotNull Color gamma(@NotNull Color color, double gamma) {
|
||||||
|
if (gamma == 1.0) {
|
||||||
|
return color;
|
||||||
|
} else if (gamma == 2.0) {
|
||||||
|
return new Color(
|
||||||
|
Math.sqrt(color.r()),
|
||||||
|
Math.sqrt(color.g()),
|
||||||
|
Math.sqrt(color.b())
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return new Color(
|
||||||
|
Math.pow(color.r(), 1 / gamma),
|
||||||
|
Math.pow(color.g(), 1 / gamma),
|
||||||
|
Math.pow(color.b(), 1 / gamma)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color(int rgb) {
|
||||||
|
this((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color(int red, int green, int blue) {
|
||||||
|
this(red / 255f, green / 255f, blue / 255f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color(@NotNull Vec3 vec) {
|
||||||
|
this(vec.x(), vec.y(), vec.z());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color {
|
||||||
|
if (DEBUG) {
|
||||||
|
if (!Double.isFinite(r) || !Double.isFinite(g) || !Double.isFinite(b)) {
|
||||||
|
throw new IllegalArgumentException("r, g and b must be finite");
|
||||||
|
}
|
||||||
|
if (r < 0 || g < 0 || b < 0) {
|
||||||
|
throw new IllegalArgumentException("r, g and b must be non-negative");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int red() {
|
||||||
|
return toInt(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int green() {
|
||||||
|
return toInt(g);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int blue() {
|
||||||
|
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
|
||||||
|
public @NotNull Color get(double u, double v, @NotNull Vec3 p) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Color getColor(@NotNull Ray ray) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isUVRequired() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NotNull Vec3 toVec3() {
|
||||||
|
return new Vec3(r, g, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int toInt(double value) {
|
||||||
|
return Math.clamp((int) (255.99 * value), 0, 255);
|
||||||
|
}
|
||||||
|
}
|
@ -1,27 +1,21 @@
|
|||||||
package eu.jonahbauer.raytracing.scene;
|
package eu.jonahbauer.raytracing.scene;
|
||||||
|
|
||||||
import eu.jonahbauer.raytracing.math.Ray;
|
import eu.jonahbauer.raytracing.math.Ray;
|
||||||
import eu.jonahbauer.raytracing.render.spectral.SampledSpectrum;
|
import eu.jonahbauer.raytracing.render.texture.Color;
|
||||||
import eu.jonahbauer.raytracing.render.spectral.spectrum.Spectrum;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface SkyBox {
|
public interface SkyBox {
|
||||||
@NotNull SampledSpectrum getColor(@NotNull Ray ray);
|
@NotNull Color getColor(@NotNull Ray ray);
|
||||||
|
|
||||||
static @NotNull SkyBox gradient(@NotNull Spectrum top, @NotNull Spectrum bottom) {
|
static @NotNull SkyBox gradient(@NotNull Color top, @NotNull Color bottom) {
|
||||||
return ray -> {
|
return ray -> {
|
||||||
// altitude from -pi/2 to pi/2
|
// altitude from -pi/2 to pi/2
|
||||||
var alt = Math.copySign(
|
var alt = Math.copySign(
|
||||||
Math.acos(ray.direction().withY(0).unit().dot(ray.direction().unit())),
|
Math.acos(ray.direction().withY(0).unit().times(ray.direction().unit())),
|
||||||
ray.direction().y()
|
ray.direction().y()
|
||||||
);
|
);
|
||||||
|
return Color.lerp(bottom, top, alt / Math.PI + 0.5);
|
||||||
return SampledSpectrum.lerp(
|
|
||||||
top.sample(ray.lambda()),
|
|
||||||
bottom.sample(ray.lambda()),
|
|
||||||
alt / Math.PI + 0.5
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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
|
|
Loading…
Reference in New Issue