/** * Credits goes to an anonymous at http://usphp.com/manual/ro/function.imageantialias.php */ function imagesmoothcircle(&$img, $cx, $cy, $cr, $color) { $ir = $cr; $ix = 0; $iy = $ir; $ig = 2 * $ir - 3; $idgr = -6; $idgd = 4 * $ir - 10; $fill = imageColorExactAlpha($img, $color['R'], $color['G'], $color['B'], 0); imageLine($img, $cx + $cr - 1, $cy, $cx, $cy, $fill); imageLine($img, $cx - $cr + 1, $cy, $cx - 1, $cy, $fill); imageLine($img, $cx, $cy + $cr - 1, $cx, $cy + 1, $fill); imageLine($img, $cx, $cy - $cr + 1, $cx, $cy - 1, $fill); $draw = imageColorExactAlpha($img, $color['R'], $color['G'], $color['B'], 42); imageSetPixel($img, $cx + $cr, $cy, $draw); imageSetPixel($img, $cx - $cr, $cy, $draw); imageSetPixel($img, $cx, $cy + $cr, $draw); imageSetPixel($img, $cx, $cy - $cr, $draw); while ($ix <= $iy - 2) { if ($ig < 0) { $ig += $idgd; $idgd -= 8; $iy--; } else { $ig += $idgr; $idgd -= 4; } $idgr -= 4; $ix++; imageLine($img, $cx + $ix, $cy + $iy - 1, $cx + $ix, $cy + $ix, $fill); imageLine($img, $cx + $ix, $cy - $iy + 1, $cx + $ix, $cy - $ix, $fill); imageLine($img, $cx - $ix, $cy + $iy - 1, $cx - $ix, $cy + $ix, $fill); imageLine($img, $cx - $ix, $cy - $iy + 1, $cx - $ix, $cy - $ix, $fill); imageLine($img, $cx + $iy - 1, $cy + $ix, $cx + $ix, $cy + $ix, $fill); imageLine($img, $cx + $iy - 1, $cy - $ix, $cx + $ix, $cy - $ix, $fill); imageLine($img, $cx - $iy + 1, $cy + $ix, $cx - $ix, $cy + $ix, $fill); imageLine($img, $cx - $iy + 1, $cy - $ix, $cx - $ix, $cy - $ix, $fill); $filled = 0; for ($xx = $ix - 0.45; $xx < $ix + 0.5; $xx += 0.2) { for ($yy = $iy - 0.45; $yy < $iy + 0.5; $yy += 0.2) { if (sqrt(pow($xx, 2) + pow($yy, 2)) < $cr) { $filled += 4; } } } $draw = imageColorExactAlpha($img, $color['R'], $color['G'], $color['B'], 100 - $filled); imageSetPixel($img, $cx + $ix, $cy + $iy, $draw); imageSetPixel($img, $cx + $ix, $cy - $iy, $draw); imageSetPixel($img, $cx - $ix, $cy + $iy, $draw); imageSetPixel($img, $cx - $ix, $cy - $iy, $draw); imageSetPixel($img, $cx + $iy, $cy + $ix, $draw); imageSetPixel($img, $cx + $iy, $cy - $ix, $draw); imageSetPixel($img, $cx - $iy, $cy + $ix, $draw); imageSetPixel($img, $cx - $iy, $cy - $ix, $draw); } }
function imageSmoothArcDrawSegment(&$img, $cx, $cy, $a, $b, $color, $start, $stop, $seg) { // Originally written from scratch by Ulrich Mierendorff, 06/2006 // Rewritten and improved, 04/2007, 07/2007 // Optimized circle version: 03/2008 // Please do not use THIS function directly. Scroll down to imageSmoothArc(...). $fillColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], $color[3]); switch ($seg) { case 0: $xp = +1; $yp = -1; $xa = 1; $ya = -1; break; case 1: $xp = -1; $yp = -1; $xa = 0; $ya = -1; break; case 2: $xp = -1; $yp = +1; $xa = 0; $ya = 0; break; case 3: $xp = +1; $yp = +1; $xa = 1; $ya = 0; break; } for ($x = 0; $x <= $a; $x += 1) { $y = $b * sqrt(1 - $x * $x / ($a * $a)); $error = $y - (int) $y; $y = (int) $y; $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error); imageSetPixel($img, $cx + $xp * $x + $xa, $cy + $yp * ($y + 1) + $ya, $diffColor); imageLine($img, $cx + $xp * $x + $xa, $cy + $yp * $y + $ya, $cx + $xp * $x + $xa, $cy + $ya, $fillColor); } for ($y = 0; $y < $b; $y += 1) { $x = $a * sqrt(1 - $y * $y / ($b * $b)); $error = $x - (int) $x; $x = (int) $x; $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error); imageSetPixel($img, $cx + $xp * ($x + 1) + $xa, $cy + $yp * $y + $ya, $diffColor); } }
protected function _getColor(Image_3D_Color $color, $alpha = 1.0) { $values = $color->getValues(); $values[0] = (int) round($values[0] * 255); $values[1] = (int) round($values[1] * 255); $values[2] = (int) round($values[2] * 255); $values[3] = (int) round((1 - (1 - $values[3]) * $alpha) * 127); if ($values[3] > 0) { // Tranzparente Farbe allokieren $color = imageColorExactAlpha($this->_image, $values[0], $values[1], $values[2], $values[3]); if ($color === -1) { // Wenn nicht Farbe neu alloziieren $color = imageColorAllocateAlpha($this->_image, $values[0], $values[1], $values[2], $values[3]); } } else { // Deckende Farbe allozieren $color = imageColorExact($this->_image, $values[0], $values[1], $values[2]); if ($color === -1) { // Wenn nicht Farbe neu alloziieren $color = imageColorAllocate($this->_image, $values[0], $values[1], $values[2]); } } return $color; }
function imageSmoothArcDrawSegment(&$img, $cx, $cy, $a, $b, $aaAngleX, $aaAngleY, $color, $start, $stop, $seg) { // Originally written from scratch by Ulrich Mierendorff, 06/2006 // Rewritten and improved, 04/2007, 07/2007 // Please do not use THIS function directly. Scroll down to imageSmoothArc(...). $fillColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], $color[3]); $xStart = abs($a * cos($start)); $yStart = abs($b * sin($start)); $xStop = abs($a * cos($stop)); $yStop = abs($b * sin($stop)); $dxStart = 0; $dyStart = 0; $dxStop = 0; $dyStop = 0; if ($xStart != 0) { $dyStart = $yStart / $xStart; } if ($xStop != 0) { $dyStop = $yStop / $xStop; } if ($yStart != 0) { $dxStart = $xStart / $yStart; } if ($yStop != 0) { $dxStop = $xStop / $yStop; } if (abs($xStart) >= abs($yStart)) { $aaStartX = true; } else { $aaStartX = false; } if ($xStop >= $yStop) { $aaStopX = true; } else { $aaStopX = false; } //$xp = +1; $yp = -1; $xa = +1; $ya = 0; for ($x = 0; $x < $a; $x += 1) { /*$y = $b * sqrt( 1 - ($x*$x)/($a*$a) ); $error = $y - (int)($y); $y = (int)($y); $diffColor = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error );*/ $_y1 = $dyStop * $x; $_y2 = $dyStart * $x; if ($xStart > $xStop) { $error1 = $_y1 - (int) $_y1; $error2 = 1 - $_y2 + (int) $_y2; $_y1 = $_y1 - $error1; $_y2 = $_y2 + $error2; } else { $error1 = 1 - $_y1 + (int) $_y1; $error2 = $_y2 - (int) $_y2; $_y1 = $_y1 + $error1; $_y2 = $_y2 - $error2; } /* if ($aaStopX) $diffColor1 = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error1 ); if ($aaStartX) $diffColor2 = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error2 ); */ if ($seg == 0 || $seg == 2) { $i = $seg; if (!($start > $i * M_PI / 2 && $x > $xStart)) { if ($i == 0) { $xp = +1; $yp = -1; $xa = +1; $ya = 0; } else { $xp = -1; $yp = +1; $xa = 0; $ya = +1; } if ($stop < ($i + 1) * (M_PI / 2) && $x <= $xStop) { $diffColor1 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error1); $y1 = $_y1; if ($aaStopX) { imageSetPixel($img, $cx + $xp * $x + $xa, $cy + $yp * ($y1 + 1) + $ya, $diffColor1); } } else { $y = $b * sqrt(1 - $x * $x / ($a * $a)); $error = $y - (int) $y; $y = (int) $y; $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error); $y1 = $y; if ($x < $aaAngleX) { imageSetPixel($img, $cx + $xp * $x + $xa, $cy + $yp * ($y1 + 1) + $ya, $diffColor); } } if ($start > $i * M_PI / 2 && $x <= $xStart) { $diffColor2 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error2); $y2 = $_y2; if ($aaStartX) { imageSetPixel($img, $cx + $xp * $x + $xa, $cy + $yp * ($y2 - 1) + $ya, $diffColor2); } } else { $y2 = 0; } if ($y2 <= $y1) { imageLine($img, $cx + $xp * $x + $xa, $cy + $yp * $y1 + $ya, $cx + $xp * $x + $xa, $cy + $yp * $y2 + $ya, $fillColor); } } } if ($seg == 1 || $seg == 3) { $i = $seg; if (!($stop < ($i + 1) * M_PI / 2 && $x > $xStop)) { if ($i == 1) { $xp = -1; $yp = -1; $xa = 0; $ya = 0; } else { $xp = +1; $yp = +1; $xa = 1; $ya = 1; } if ($start > $i * M_PI / 2 && $x < $xStart) { $diffColor2 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error2); $y1 = $_y2; if ($aaStartX) { imageSetPixel($img, $cx + $xp * $x + $xa, $cy + $yp * ($y1 + 1) + $ya, $diffColor2); } } else { $y = $b * sqrt(1 - $x * $x / ($a * $a)); $error = $y - (int) $y; $y = (int) $y; $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error); $y1 = $y; if ($x < $aaAngleX) { imageSetPixel($img, $cx + $xp * $x + $xa, $cy + $yp * ($y1 + 1) + $ya, $diffColor); } } if ($stop < ($i + 1) * M_PI / 2 && $x <= $xStop) { $diffColor1 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error1); $y2 = $_y1; if ($aaStopX) { imageSetPixel($img, $cx + $xp * $x + $xa, $cy + $yp * ($y2 - 1) + $ya, $diffColor1); } } else { $y2 = 0; } if ($y2 <= $y1) { imageLine($img, $cx + $xp * $x + $xa, $cy + $yp * $y1 + $ya, $cx + $xp * $x + $xa, $cy + $yp * $y2 + $ya, $fillColor); } } } } ///YYYYY for ($y = 0; $y < $b; $y += 1) { /*$x = $a * sqrt( 1 - ($y*$y)/($b*$b) ); $error = $x - (int)($x); $x = (int)($x); $diffColor = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error ); */ $_x1 = $dxStop * $y; $_x2 = $dxStart * $y; if ($yStart > $yStop) { $error1 = $_x1 - (int) $_x1; $error2 = 1 - $_x2 + (int) $_x2; $_x1 = $_x1 - $error1; $_x2 = $_x2 + $error2; } else { $error1 = 1 - $_x1 + (int) $_x1; $error2 = $_x2 - (int) $_x2; $_x1 = $_x1 + $error1; $_x2 = $_x2 - $error2; } /* if (!$aaStopX) $diffColor1 = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error1 ); if (!$aaStartX) $diffColor2 = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error2 ); */ if ($seg == 0 || $seg == 2) { $i = $seg; if (!($start > $i * M_PI / 2 && $y > $yStop)) { if ($i == 0) { $xp = +1; $yp = -1; $xa = 1; $ya = 0; } else { $xp = -1; $yp = +1; $xa = 0; $ya = 1; } if ($stop < ($i + 1) * (M_PI / 2) && $y <= $yStop) { $diffColor1 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error1); $x1 = $_x1; if (!$aaStopX) { imageSetPixel($img, $cx + $xp * ($x1 - 1) + $xa, $cy + $yp * $y + $ya, $diffColor1); } } if ($start > $i * M_PI / 2 && $y < $yStart) { $diffColor2 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error2); $x2 = $_x2; if (!$aaStartX) { imageSetPixel($img, $cx + $xp * ($x2 + 1) + $xa, $cy + $yp * $y + $ya, $diffColor2); } } else { $x = $a * sqrt(1 - $y * $y / ($b * $b)); $error = $x - (int) $x; $x = (int) $x; $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error); $x1 = $x; if ($y < $aaAngleY && $y <= $yStop) { imageSetPixel($img, $cx + $xp * ($x1 + 1) + $xa, $cy + $yp * $y + $ya, $diffColor); } } } } if ($seg == 1 || $seg == 3) { $i = $seg; if (!($stop < ($i + 1) * M_PI / 2 && $y > $yStart)) { if ($i == 1) { $xp = -1; $yp = -1; $xa = 0; $ya = 0; } else { $xp = +1; $yp = +1; $xa = 1; $ya = 1; } if ($start > $i * M_PI / 2 && $y < $yStart) { $diffColor2 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error2); $x1 = $_x2; if (!$aaStartX) { imageSetPixel($img, $cx + $xp * ($x1 - 1) + $xa, $cy + $yp * $y + $ya, $diffColor2); } } if ($stop < ($i + 1) * M_PI / 2 && $y <= $yStop) { $diffColor1 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error1); $x2 = $_x1; if (!$aaStopX) { imageSetPixel($img, $cx + $xp * ($x2 + 1) + $xa, $cy + $yp * $y + $ya, $diffColor1); } } else { $x = $a * sqrt(1 - $y * $y / ($b * $b)); $error = $x - (int) $x; $x = (int) $x; $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error); $x1 = $x; if ($y < $aaAngleY && $y < $yStart) { imageSetPixel($img, $cx + $xp * ($x1 + 1) + $xa, $cy + $yp * $y + $ya, $diffColor); } } } } } }
function imageSmoothArcDrawSegment(&$img, $cx, $cy, $a, $b, $color, $start, $stop, $seg) { $fillColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], $color[3]); switch ($seg) { case 0: $xp = +1; $yp = -1; $xa = 1; $ya = -1; break; case 1: $xp = -1; $yp = -1; $xa = 0; $ya = -1; break; case 2: $xp = -1; $yp = +1; $xa = 0; $ya = 0; break; case 3: $xp = +1; $yp = +1; $xa = 1; $ya = 0; break; } for ($x = 0; $x <= $a; $x += 1) { $y = $b * sqrt(1 - $x * $x / ($a * $a)); $error = $y - (int) $y; $y = (int) $y; $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error); imageSetPixel($img, $cx + $xp * $x + $xa, $cy + $yp * ($y + 1) + $ya, $diffColor); imageLine($img, $cx + $xp * $x + $xa, $cy + $yp * $y + $ya, $cx + $xp * $x + $xa, $cy + $ya, $fillColor); } for ($y = 0; $y < $b; $y += 1) { $x = $a * sqrt(1 - $y * $y / ($b * $b)); $error = $x - (int) $x; $x = (int) $x; $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127 - (127 - $color[3]) * $error); imageSetPixel($img, $cx + $xp * ($x + 1) + $xa, $cy + $yp * $y + $ya, $diffColor); } }