protected function _drawLine(Image_3D_Point $p1, Image_3D_Point $p2) { list($x1, $y1) = $p1->getScreenCoordinates(); list($x2, $y2) = $p2->getScreenCoordinates(); $steps = ceil(max(abs($x1 - $x2), abs($y1 - $y2))); $xdiff = ($x2 - $x1) / $steps; $ydiff = ($y2 - $y1) / $steps; $points = array(); for ($i = 0; $i < $steps; ++$i) { $points[(int) round($x1 + $i * $xdiff)][(int) round($y1 + $i * $ydiff)] = true; } return $points; }
protected function _drawLine(Image_3D_Point $p1, Image_3D_Point $p2) { list($x1, $y1) = $p1->getScreenCoordinates(); list($x2, $y2) = $p2->getScreenCoordinates(); $z1 = $p1->getZ(); $z2 = $p2->getZ(); $steps = ceil(max(abs($x1 - $x2), abs($y1 - $y2))); $xdiff = ($x2 - $x1) / $steps; $ydiff = ($y2 - $y1) / $steps; $zdiff = ($z2 - $z1) / $steps; $points = array('height' => array(), 'coverage' => array()); for ($i = 0; $i < $steps; $i++) { $x = $x1 + $i * $xdiff; $xFloor = floor($x); $xCeil = ceil($x); $xOffset = $x - $xFloor; $y = $y1 + $i * $ydiff; $yFloor = floor($y); $yCeil = ceil($y); $yOffset = $y - $yFloor; if (!isset($points['coverage'][(int) $xFloor][(int) $yCeil])) { $points['height'][(int) $xFloor][(int) $yCeil] = $z1 + $i * $zdiff; $points['coverage'][(int) $xFloor][(int) $yCeil] = (1 - $xOffset) * $yOffset; } else { $points['coverage'][(int) $xFloor][(int) $yCeil] += (1 - $xOffset) * $yOffset; } if (!isset($points['coverage'][(int) $xFloor][(int) $yFloor])) { $points['height'][(int) $xFloor][(int) $yFloor] = $z1 + $i * $zdiff; $points['coverage'][(int) $xFloor][(int) $yFloor] = (1 - $xOffset) * (1 - $yOffset); } else { $points['coverage'][(int) $xFloor][(int) $yFloor] += (1 - $xOffset) * (1 - $yOffset); } if (!isset($points['coverage'][(int) $xCeil][(int) $yCeil])) { $points['height'][(int) $xCeil][(int) $yCeil] = $z1 + $i * $zdiff; $points['coverage'][(int) $xCeil][(int) $yCeil] = $xOffset * $yOffset; } else { $points['coverage'][(int) $xCeil][(int) $yCeil] += $xOffset * $yOffset; } if (!isset($points['coverage'][(int) $xCeil][(int) $yFloor])) { $points['height'][(int) $xCeil][(int) $yFloor] = $z1 + $i * $zdiff; $points['coverage'][(int) $xCeil][(int) $yFloor] = $xOffset * (1 - $yOffset); } else { $points['coverage'][(int) $xCeil][(int) $yFloor] += $xOffset * (1 - $yOffset); } } return $points; }