Advertisement
Gistrec

create sphere

Jan 26th, 2017
583
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.37 KB | None | 0 0
  1.     public function createSphere($px, $py, $pz, $level, $radius, $id){
  2.  
  3.         $radiusX = $radius + 0.5;
  4.         $radiusY = $radius + 0.5;
  5.         $radiusZ = $radius + 0.5;
  6.  
  7.         $invRadiusX = 1 / $radiusX;
  8.         $invRadiusY = 1 / $radiusY;
  9.         $invRadiusZ = 1 / $radiusZ;
  10.  
  11.         $ceilRadiusX = (int) ceil($radiusX);
  12.         $ceilRadiusY = (int) ceil($radiusY);
  13.         $ceilRadiusZ = (int) ceil($radiusZ);
  14.  
  15.         $nextXn = 0;
  16.         for ($x = 0; $x <= $ceilRadiusX; ++$x) {
  17.             $xn = $nextXn;
  18.             $nextXn = ($x + 1) * $invRadiusX;
  19.             $nextYn = 0;
  20.             for ($y = 0; $y <= $ceilRadiusY; ++$y) {
  21.                 $yn = $nextYn;
  22.                 $nextYn = ($y + 1) * $invRadiusY;
  23.                 $nextZn = 0;
  24.                 for ($z = 0; $z <= $ceilRadiusZ; ++$z) {
  25.                     $zn = $nextZn;
  26.                     $nextZn = ($z + 1) * $invRadiusZ;
  27.  
  28.                     $distanceSq = $this->lengthSq($xn, $yn, $zn);
  29.                     if ($distanceSq > 1) {
  30.                         if ($z == 0) {
  31.                             if ($y == 0) {
  32.                                  $x++;
  33.                                  continue;
  34.                             }
  35.                             $y++;
  36.                             continue;
  37.                         }
  38.                         $z++;
  39.                         continue;
  40.                     }
  41.  
  42.                     if ($this->lengthSq($nextXn, $yn, $zn) <= 1 && $this->lengthSq($xn, $nextYn, $zn) <= 1 && $this->lengthSq($xn, $yn, $nextZn) <= 1) {
  43.                         continue;
  44.                     }
  45.                     $level->setBlockIdAt($x + $px, $y + $py, $z + $pz, $id);
  46.                     $level->setBlockIdAt(-$x + $px, $y + $py, $z + $pz, $id);
  47.                     $level->setBlockIdAt($x + $px, -$y + $py, $z + $pz, $id);
  48.                     $level->setBlockIdAt($x + $px, $y + $py, -$z + $pz, $id);
  49.                     $level->setBlockIdAt(-$x + $px, -$y + $py, $z + $pz, $id);
  50.                     $level->setBlockIdAt($x + $px, -$y + $py, -$z + $pz, $id);
  51.                     $level->setBlockIdAt(-$x + $px, $y + $py, -$z + $pz, $id);
  52.                     $level->setBlockIdAt(-$x + $px, -$y + $py, -$z + $pz, $id);
  53.                 }
  54.             }
  55.         }
  56.     }
  57.     public function lengthSq($x, $y, $z) {
  58.         return (($x * $x) + ($y * $y) + ($z * $z));
  59.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement