61 public static function bilinearLerp($x, $y, $q00, $q01, $q10, $q11, $x1, $x2, $y1, $y2){
62 $dx1 = (($x2 - $x) / ($x2 - $x1));
63 $dx2 = (($x - $x1) / ($x2 - $x1));
65 return (($y2 - $y) / ($y2 - $y1)) * (
66 $dx1 * $q00 + $dx2 * $q10
67 ) + (($y - $y1) / ($y2 - $y1)) * (
68 $dx1 * $q01 + $dx2 * $q11
93 public static function trilinearLerp($x, $y, $z, $q000, $q001, $q010, $q011, $q100, $q101, $q110, $q111, $x1, $x2, $y1, $y2, $z1, $z2){
94 $dx1 = (($x2 - $x) / ($x2 - $x1));
95 $dx2 = (($x - $x1) / ($x2 - $x1));
96 $dy1 = (($y2 - $y) / ($y2 - $y1));
97 $dy2 = (($y - $y1) / ($y2 - $y1));
99 return (($z2 - $z) / ($z2 - $z1)) * (
101 $dx1 * $q000 + $dx2 * $q100
103 $dx1 * $q001 + $dx2 * $q101
105 ) + (($z - $z1) / ($z2 - $z1)) * (
107 $dx1 * $q010 + $dx2 * $q110
109 $dx1 * $q011 + $dx2 * $q111
203 public function getFastNoise1D(
int $xSize,
int $samplingRate,
int $x,
int $y,
int $z) : \SplFixedArray{
204 if($samplingRate === 0){
205 throw new \InvalidArgumentException(
"samplingRate cannot be 0");
207 if($xSize % $samplingRate !== 0){
208 throw new \InvalidArgumentException(
"xSize % samplingRate must return 0");
212 $noiseArray = new \SplFixedArray($xSize + 1);
214 for($xx = 0; $xx <= $xSize; $xx += $samplingRate){
215 $noiseArray[$xx] = $this->
noise3D($xx + $x, $y, $z);
218 for($xx = 0; $xx < $xSize; ++$xx){
219 if($xx % $samplingRate !== 0){
220 $nx = (int) ($xx / $samplingRate) * $samplingRate;
224 x2: $nx + $samplingRate,
225 q0: $noiseArray[$nx],
226 q1: $noiseArray[$nx + $samplingRate]
238 public function getFastNoise2D(
int $xSize,
int $zSize,
int $samplingRate,
int $x,
int $y,
int $z) : \SplFixedArray{
239 assert($samplingRate !== 0, new \InvalidArgumentException(
"samplingRate cannot be 0"));
241 assert($xSize % $samplingRate === 0,
new \InvalidArgumentException(
"xSize % samplingRate must return 0"));
242 assert($zSize % $samplingRate === 0,
new \InvalidArgumentException(
"zSize % samplingRate must return 0"));
245 $noiseArray = new \SplFixedArray($xSize + 1);
247 for($xx = 0; $xx <= $xSize; $xx += $samplingRate){
248 $noiseArray[$xx] = new \SplFixedArray($zSize + 1);
249 for($zz = 0; $zz <= $zSize; $zz += $samplingRate){
250 $noiseArray[$xx][$zz] = $this->noise3D($x + $xx, $y, $z + $zz);
254 for($xx = 0; $xx < $xSize; ++$xx){
255 if($xx % $samplingRate !== 0){
256 $noiseArray[$xx] = new \SplFixedArray($zSize + 1);
259 for($zz = 0; $zz < $zSize; ++$zz){
260 if($xx % $samplingRate !== 0 || $zz % $samplingRate !== 0){
261 $nx = (int) ($xx / $samplingRate) * $samplingRate;
262 $nz = (int) ($zz / $samplingRate) * $samplingRate;
266 q00: $noiseArray[$nx][$nz],
267 q01: $noiseArray[$nx][$nz + $samplingRate],
268 q10: $noiseArray[$nx + $samplingRate][$nz],
269 q11: $noiseArray[$nx + $samplingRate][$nz + $samplingRate],
271 x2: $nx + $samplingRate,
273 y2: $nz + $samplingRate
285 public function getFastNoise3D(
int $xSize,
int $ySize,
int $zSize,
int $xSamplingRate,
int $ySamplingRate,
int $zSamplingRate,
int $x,
int $y,
int $z) : array{
287 assert($xSamplingRate !== 0, new \InvalidArgumentException(
"xSamplingRate cannot be 0"));
288 assert($zSamplingRate !== 0,
new \InvalidArgumentException(
"zSamplingRate cannot be 0"));
289 assert($ySamplingRate !== 0,
new \InvalidArgumentException(
"ySamplingRate cannot be 0"));
291 assert($xSize % $xSamplingRate === 0,
new \InvalidArgumentException(
"xSize % xSamplingRate must return 0"));
292 assert($zSize % $zSamplingRate === 0,
new \InvalidArgumentException(
"zSize % zSamplingRate must return 0"));
293 assert($ySize % $ySamplingRate === 0,
new \InvalidArgumentException(
"ySize % ySamplingRate must return 0"));
295 $noiseArray = array_fill(0, $xSize + 1, array_fill(0, $zSize + 1, array_fill(0, $ySize + 1, 0)));
297 for($xx = 0; $xx <= $xSize; $xx += $xSamplingRate){
298 for($zz = 0; $zz <= $zSize; $zz += $zSamplingRate){
299 for($yy = 0; $yy <= $ySize; $yy += $ySamplingRate){
300 $noiseArray[$xx][$zz][$yy] = $this->noise3D($x + $xx, $y + $yy, $z + $zz,
true);
314 $xLerpStep = 1 / $xSamplingRate;
315 $yLerpStep = 1 / $ySamplingRate;
316 $zLerpStep = 1 / $zSamplingRate;
318 for($leftX = 0; $leftX < $xSize; $leftX += $xSamplingRate){
319 $rightX = $leftX + $xSamplingRate;
321 for($leftZ = 0; $leftZ < $zSize; $leftZ += $zSamplingRate){
322 $rightZ = $leftZ + $zSamplingRate;
324 for($leftY = 0; $leftY < $ySize; $leftY += $ySamplingRate){
325 $rightY = $leftY + $ySamplingRate;
329 $c000 = $noiseArray[$leftX][$leftZ][$leftY];
330 $c100 = $noiseArray[$rightX][$leftZ][$leftY];
331 $c001 = $noiseArray[$leftX][$leftZ][$rightY];
332 $c101 = $noiseArray[$rightX][$leftZ][$rightY];
333 $c010 = $noiseArray[$leftX][$rightZ][$leftY];
334 $c110 = $noiseArray[$rightX][$rightZ][$leftY];
335 $c011 = $noiseArray[$leftX][$rightZ][$rightY];
336 $c111 = $noiseArray[$rightX][$rightZ][$rightY];
339 for($xStep = 0; $xStep < $xSamplingRate; $xStep++){
340 $xx = $leftX + $xStep;
341 $dx2 = $xStep * $xLerpStep;
345 $x00 = ($c000 * $dx1) + ($c100 * $dx2);
346 $x01 = ($c001 * $dx1) + ($c101 * $dx2);
347 $x10 = ($c010 * $dx1) + ($c110 * $dx2);
348 $x11 = ($c011 * $dx1) + ($c111 * $dx2);
350 for($zStep = 0; $zStep < $zSamplingRate; $zStep++){
351 $zz = $leftZ + $zStep;
352 $dz2 = $zStep * $zLerpStep;
356 $z0 = $x00 * $dz1 + $x10 * $dz2;
357 $z1 = $x01 * $dz1 + $x11 * $dz2;
360 $yStart = $xStep === 0 && $zStep === 0 ? 1 : 0;
361 for($yStep = $yStart; $yStep < $ySamplingRate; $yStep++){
362 $yy = $leftY + $yStep;
363 $dy2 = $yStep * $yLerpStep;
367 $noiseArray[$xx][$zz][$yy] = $dy1 * $z0 + $dy2 * $z1;