Fix the ValueNoise number distribution. It is now symmetrical.

Working towards #91
This commit is contained in:
IntegratedQuantum 2023-10-23 23:18:16 +02:00
parent e398824cab
commit 78b3fa0d10

View File

@ -37,30 +37,30 @@ pub fn samplePoint2D(x: f32, _y: f32, worldSeed: u64) f32 {
return (1 - interp)*lower + interp*upper; return (1 - interp)*lower + interp*upper;
} }
const percentileTable = [_]f32 {0.0e+00, 9.15669277e-02, 1.18274688e-01, 1.37655034e-01, 1.53483346e-01, 1.67139247e-01, 1.79302796e-01, 1.90366283e-01, 2.00579166e-01, 2.10111454e-01, 2.19084709e-01, 2.27589413e-01, 2.35694572e-01, 2.43454873e-01, 2.50914007e-01, 2.58107364e-01, 2.65064746e-01, 2.71810621e-01, 2.78366297e-01, 2.84749507e-01, 2.90976017e-01, 2.97059237e-01, 3.03011208e-01, 3.08842420e-01, 3.14562231e-01, 3.20178955e-01, 3.25700223e-01, 3.31132620e-01, 3.36482465e-01, 3.41755270e-01, 3.46956104e-01, 3.52089852e-01, 3.57160568e-01, 3.62172454e-01, 3.67129117e-01, 3.72033983e-01, 3.76890212e-01, 3.81700843e-01, 3.86468648e-01, 3.91196310e-01, 3.95886212e-01, 4.00540769e-01, 4.05162155e-01, 4.09752458e-01, 4.14313703e-01, 4.18847769e-01, 4.23356503e-01, 4.27841603e-01, 4.32304769e-01, 4.36747610e-01, 4.41171675e-01, 4.45578455e-01, 4.49969410e-01, 4.54345911e-01, 4.58709388e-01, 4.63061153e-01, 4.67402517e-01, 4.71734791e-01, 4.76059168e-01, 4.80376929e-01, 4.84689295e-01, 4.88997489e-01, 4.93302702e-01, 4.97606158e-01, 5.01908957e-01, 5.06212413e-01, 5.10517597e-01, 5.14825820e-01, 5.19138216e-01, 5.23455977e-01, 5.27780354e-01, 5.32112598e-01, 5.36453962e-01, 5.40805697e-01, 5.45169174e-01, 5.49545705e-01, 5.53936660e-01, 5.58343470e-01, 5.62767505e-01, 5.67210376e-01, 5.71673512e-01, 5.76158583e-01, 5.80667376e-01, 5.85201442e-01, 5.89762687e-01, 5.94352960e-01, 5.98974347e-01, 6.03628933e-01, 6.08318805e-01, 6.13046467e-01, 6.17814302e-01, 6.22624933e-01, 6.27481162e-01, 6.32386028e-01, 6.37342691e-01, 6.42354607e-01, 6.47425293e-01, 6.52559041e-01, 6.57759904e-01, 6.63032710e-01, 6.68382585e-01, 6.73814952e-01, 6.79336249e-01, 6.84952974e-01, 6.90672814e-01, 6.96504056e-01, 7.02455997e-01, 7.08539247e-01, 7.14765727e-01, 7.21148967e-01, 7.27704644e-01, 7.34450578e-01, 7.41407930e-01, 7.48601317e-01, 7.56060481e-01, 7.63820827e-01, 7.71925985e-01, 7.80430734e-01, 7.89404034e-01, 7.98936367e-01, 8.09149265e-01, 8.20212841e-01, 8.32376480e-01, 8.46032440e-01, 8.61860930e-01, 8.81241500e-01, 9.07949805e-01, 1.0}; const percentileTable = [_]f32 {0.0e+00, 9.20569300e-02, 1.18748918e-01, 1.38117700e-01, 1.53936773e-01, 1.67584523e-01, 1.79740771e-01, 1.90797567e-01, 2.01004371e-01, 2.10530936e-01, 2.19498828e-01, 2.27998286e-01, 2.36098647e-01, 2.43854254e-01, 2.51308768e-01, 2.58497864e-01, 2.65450924e-01, 2.72192806e-01, 2.78744399e-01, 2.85123795e-01, 2.91346460e-01, 2.97426044e-01, 3.03374379e-01, 3.09202045e-01, 3.14918369e-01, 3.20531696e-01, 3.26049506e-01, 3.31478625e-01, 3.36825191e-01, 3.42094779e-01, 3.47292482e-01, 3.52423042e-01, 3.57490718e-01, 3.62499535e-01, 3.67453157e-01, 3.72355014e-01, 3.77208292e-01, 3.82015973e-01, 3.86780887e-01, 3.91505628e-01, 3.96192669e-01, 4.00844365e-01, 4.05462920e-01, 4.10050421e-01, 4.14608865e-01, 4.19140160e-01, 4.23646122e-01, 4.28128510e-01, 4.32588934e-01, 4.37029063e-01, 4.41450417e-01, 4.45854485e-01, 4.50242727e-01, 4.54616576e-01, 4.58977371e-01, 4.63326483e-01, 4.67665165e-01, 4.71994757e-01, 4.76316481e-01, 4.80631619e-01, 4.84941333e-01, 4.89246904e-01, 4.93549466e-01, 4.97850269e-01, 5.02150475e-01, 5.06451249e-01, 5.10753810e-01, 5.15059411e-01, 5.19369125e-01, 5.23684263e-01, 5.28005957e-01, 5.32335579e-01, 5.36674261e-01, 5.41023373e-01, 5.45384168e-01, 5.49758017e-01, 5.54146230e-01, 5.58550298e-01, 5.62971651e-01, 5.67411780e-01, 5.71872234e-01, 5.76354622e-01, 5.80860555e-01, 5.85391879e-01, 5.89950323e-01, 5.94537794e-01, 5.99156379e-01, 6.03808045e-01, 6.08495116e-01, 6.13219857e-01, 6.17984771e-01, 6.22792422e-01, 6.27645730e-01, 6.32547557e-01, 6.37501180e-01, 6.42509996e-01, 6.47577702e-01, 6.52708232e-01, 6.57905936e-01, 6.63175523e-01, 6.68522059e-01, 6.73951208e-01, 6.79469048e-01, 6.85082376e-01, 6.90798640e-01, 6.96626305e-01, 7.02574670e-01, 7.08654224e-01, 7.14876949e-01, 7.21256315e-01, 7.27807879e-01, 7.34549760e-01, 7.41502821e-01, 7.48691916e-01, 7.56146430e-01, 7.63902068e-01, 7.72002398e-01, 7.80501842e-01, 7.89469778e-01, 7.98996329e-01, 8.09203147e-01, 8.20259928e-01, 8.32416176e-01, 8.46063911e-01, 8.61882984e-01, 8.81251752e-01, 9.07943725e-01, 1.0e+00};
fn preGeneratePercentileTable() !void { fn preGeneratePercentileTable() !void {
const randomNumbers = 2048; const randomNumbers = 4096;
const positions = 2048; const positions = 4096;
const totalValues = randomNumbers*positions; const totalValues = randomNumbers*positions;
const values = randomNumbers; const values = randomNumbers;
var amount1D: [values+1] u128 = undefined; var amount1D: [values+1] u128 = undefined;
@memset(&amount1D, 0); @memset(&amount1D, 0);
for(0..randomNumbers+1) |a| { for(0..randomNumbers) |a| {
for(0..randomNumbers+1) |b| { for(0..randomNumbers) |b| {
for(0..positions+1) |x| { for(0..positions+1) |x| {
const val = x*a + (positions - x)*b; const val = x*(2*a + 1) + (positions - x)*(2*b + 1);
amount1D[(val*values)/totalValues] += 1; amount1D[(val*values)/totalValues/2] += 1;
} }
} }
} }
var amount2D: [values+1] u128 = undefined; var amount2D: [values+1] u128 = undefined;
@memset(&amount2D, 0); @memset(&amount2D, 0);
for(0..randomNumbers+1) |a| { for(0..randomNumbers) |a| {
for(0..randomNumbers+1) |b| { for(0..randomNumbers) |b| {
for(0..positions+1) |x| { for(0..positions+1) |x| {
const val = x*a + (positions - x)*b; const val = x*(2*a + 1) + (positions - x)*(2*b + 1);
amount2D[(val*values)/totalValues] += amount1D[a]*amount1D[b]; amount2D[(val*values)/totalValues/2] += amount1D[a]*amount1D[b];
} }
} }
} }
@ -80,7 +80,7 @@ fn preGeneratePercentileTable() !void {
i += 1; i += 1;
} }
const diff = goal - current; const diff = goal - current;
_percentile.* = (@as(f32, @floatFromInt(i)) + @as(f32, @floatFromInt(diff))/@as(f32, @floatFromInt(amount2D[i])))/2048; _percentile.* = (@as(f32, @floatFromInt(i)) + @as(f32, @floatFromInt(diff))/@as(f32, @floatFromInt(amount2D[i])))/randomNumbers;
} }
for(&percentiles) |_percentile| { for(&percentiles) |_percentile| {