} $vImagegHeight = GRAPH_HEIGHT + 30; $vImage = imagecreatetruecolor(GRAPH_WIDTH + 50, $vImagegHeight); $vBgColor = imagecolorallocate($vImage, 160, 160, 160); $vTextColor = imagecolorallocate($vImage, 0, 0, 0); $vAxisColor = imagecolorallocate($vImage, 0, 0, 0); $vDotColor = imagecolorallocate($vImage, 192, 64, 64); imagefill($vImage, 0, 0, $vBgColor); $oPlot = new Plot($aCoords); $oPlot->drawDots($vImage, $vDotColor, 10, GRAPH_HEIGHT, 8); $oCurve = new CubicSplines(); $vColor = imagecolorallocate($vImage, 225, 64, 64); $iStart = microtime(1); if ($oCurve) { $oCurve->setInitCoords($aCoords, 1); $r = $oCurve->processCoords(); if ($r) { $curveGraph = new Plot($r); } else { continue; } } else { $curveGraph = $oPlot; } $curveGraph->drawLine($vImage, $vColor, 10, GRAPH_HEIGHT); // unset($oCurve); $sTime = sprintf("%1.4f", microtime(1) - $iStart); imagefilledrectangle($vImage, 0, GRAPH_HEIGHT, GRAPH_WIDTH + 50, $vImagegHeight, $vBgColor); $oPlot->drawAxis($vImage, $vAxisColor, 10, GRAPH_HEIGHT); $iPanelY = GRAPH_HEIGHT; imagefilledrectangle($vImage, 10, $iPanelY + 10, 20, $iPanelY + 20, $vColor);
public function drawDestructorsChart($imgFile, $destructors, $skale) { $destructorsCnt = count($destructors); $scaler = 1.53; $width = round(600 * $scaler); $height = round((50 + 60 * $destructorsCnt) * $scaler); $img = imagecreatetruecolor($width, $height); $min = round($skale['min']); $max = round($skale['max']); $bgColor = imagecolorallocate($img, 255, 255, 255); imagefill($img, 0, 0, $bgColor); // рисуем оси $axisColor = imagecolorallocate($img, 134, 134, 134); imageline($img, 20 * $scaler, 50 * $scaler, 400 * $scaler, 50 * $scaler, $axisColor); imageline($img, 20 * $scaler, 50 * $scaler + 1, 400 * $scaler, 50 * $scaler + 1, $axisColor); imageline($img, 400 * $scaler, 50 * $scaler, 400 * $scaler, (50 + $destructorsCnt * 55) * $scaler, $axisColor); imageline($img, 401 * $scaler, 48 * $scaler, 401 * $scaler, (48 + $destructorsCnt * 55) * $scaler, $axisColor); imagettftext($img, round(10 * $scaler), 0, 397 * $scaler, 42 * $scaler, $axisColor, dirname(__FILE__) . '/fonts/georgia.ttf', $min); imagettftext($img, round(10 * $scaler), 0, 430 * $scaler, 42 * $scaler, $axisColor, dirname(__FILE__) . '/fonts/georgia.ttf', 'баллы'); // рисуем вспомогательные линии $steps = $max - $min; $onePointWidth = (400 - 20) / $steps * $scaler; for ($i = $min; $i < $max; $i++) { $x = 400 * $scaler - $i * $onePointWidth; imageline($img, $x, 48 * $scaler, $x, (50 + $destructorsCnt * 55) * $scaler, $axisColor); // подписываем шкалу imagettftext($img, round(10 * $scaler), 0, $x - 3 * $scaler, (48 - 6) * $scaler, $axisColor, dirname(__FILE__) . '/fonts/georgia.ttf', $i + 1); } // рассчитываем какой деструктор каким цветом красим $maxValue = 0; $warningDestructorsKeys = array(); $badDestructorsKeys = array(); foreach ($destructors as $dKey => $desructor) { if ($desructor['val'] > $maxValue) { $badDestructorsKeys = array(); $badDestructorsKeys[] = $dKey; $maxValue = $desructor['val']; } elseif ($desructor['val'] == $maxValue) { $badDestructorsKeys[] = $dKey; } if ($desructor['val'] - 1 > 0.4) { $warningDestructorsKeys[] = $dKey; } } // обрабатываем деструкторы $ind = 0; $destructorsTextColor = imagecolorallocate($img, 0, 0, 0); $destructorBadColor = imagecolorallocate($img, 227, 133, 163); $destructorComColor = imagecolorallocate($img, 255, 255, 255); $destructorWarnColor = imagecolorallocate($img, 232, 198, 130); $averageColor = imagecolorallocate($img, 210, 142, 5); $bordersColor = imagecolorallocate($img, 127, 127, 127); $averageCoords = array(); foreach ($destructors as $dKey => $desructor) { // подписываем шкалы деструкторов $sizes = imagettfbbox(round(12 * $scaler), 0, dirname(__FILE__) . '/fonts/time.ttf', $desructor['name']); if ($sizes[2] > (600 - 410) * $scaler) { $name = $this->divideString($desructor['name']); $nameY = (75 + $ind * 55) * $scaler; if (!$name) { $name = $desructor['name']; $nameY = (84 + $ind * 55) * $scaler; } } else { $name = $desructor['name']; $nameY = (84 + $ind * 55) * $scaler; } imagettftext($img, round(12 * $scaler), 0, 405 * $scaler, $nameY, $destructorsTextColor, dirname(__FILE__) . '/fonts/time.ttf', $name); // рисуемы бары деструкторов $barWidth = ($desructor['val'] - $min) * $onePointWidth; $barHeight = 39 * $scaler; $dColor = in_array($dKey, $badDestructorsKeys) ? $destructorBadColor : (in_array($dKey, $warningDestructorsKeys) ? $destructorWarnColor : $destructorComColor); $this->drawBar($img, 400 * $scaler - $barWidth, (58 + $ind * 55) * $scaler, 400 * $scaler - 1, (97 + $ind * 55) * $scaler, $dColor); // рисуем границу бара $style = array($axisColor, $axisColor, $axisColor, $axisColor, $axisColor, $axisColor, $axisColor, $bgColor, $bgColor, $bgColor); imagesetstyle($img, $style); imageline($img, 400 * $scaler - $barWidth, (58 + $ind * 55) * $scaler, 400 * $scaler - 1, (58 + $ind * 55) * $scaler, IMG_COLOR_STYLED); imageline($img, 400 * $scaler - $barWidth, (58 + $ind * 55) * $scaler, 400 * $scaler - $barWidth, (97 + $ind * 55) * $scaler, IMG_COLOR_STYLED); imageline($img, 400 * $scaler - $barWidth, (97 + $ind * 55) * $scaler, 400 * $scaler - 1, (97 + $ind * 55) * $scaler, IMG_COLOR_STYLED); // выводим значение бара imagettftext($img, round(12 * $scaler), 0, 400 * $scaler - $barWidth - 26 * $scaler, (84 + $ind * 55) * $scaler, $axisColor, dirname(__FILE__) . '/fonts/time.ttf', str_replace('.', ',', number_format(round($desructor['val'], 1), 1))); imagettftext($img, round(12 * $scaler), 0, 400 * $scaler - $barWidth - 26 * $scaler - 1, (84 + $ind * 55) * $scaler, $axisColor, dirname(__FILE__) . '/fonts/time.ttf', str_replace('.', ',', number_format(round($desructor['val'], 1), 1))); // отмечаем средние + подготавливаем их для кривой if ($desructor['av']) { $averageCoords[(78 + $ind * 55) * $scaler] = 400 * $scaler - ($desructor['av'] - $min) * $onePointWidth; $this->drawDiamond($img, 400 * $scaler - ($desructor['av'] - $min) * $onePointWidth - 5 * $scaler, (78 + $ind * 55) * $scaler - 5 * $scaler, 10 * $scaler, $averageColor); } $ind++; } // делаем легенду $style = array($axisColor, $axisColor, $axisColor, $axisColor, $axisColor, $axisColor, $axisColor, $bgColor, $bgColor, $bgColor); imagesetstyle($img, $style); imageline($img, 30 * $scaler, 10 * $scaler, 55 * $scaler, 10 * $scaler, IMG_COLOR_STYLED); imageline($img, 30 * $scaler, 10 * $scaler, 30 * $scaler, 20 * $scaler, IMG_COLOR_STYLED); imageline($img, 30 * $scaler, 20 * $scaler, 55 * $scaler, 20 * $scaler, IMG_COLOR_STYLED); imageline($img, 55 * $scaler, 10 * $scaler, 55 * $scaler, 20 * $scaler, IMG_COLOR_STYLED); imagettftext($img, 10 * $scaler, 0, 60 * $scaler, 20 * $scaler, $destructorsTextColor, dirname(__FILE__) . '/fonts/time.ttf', 'Все без самооценки'); if (count($averageCoords)) { $style = array($averageColor, $averageColor, $averageColor, $averageColor, $averageColor, $averageColor, $averageColor, $bgColor, $bgColor, $bgColor); imagesetstyle($img, $style); imagesetthickness($img, 3); imageline($img, 210 * $scaler, 15 * $scaler, 255 * $scaler, 15 * $scaler, IMG_COLOR_STYLED); imagettftext($img, 10 * $scaler, 0, 264 * $scaler, 20 * $scaler, $destructorsTextColor, dirname(__FILE__) . '/fonts/time.ttf', 'Среднее по всем оцениваемым руководителям'); $this->drawDiamond($img, 227 * $scaler, 10 * $scaler, 10 * $scaler, $averageColor); // рисуем кривую среднюю //imageantialias($img, true); if (count($averageCoords) > 1) { $curve = new CubicSplines(); $curve->setInitCoords($averageCoords, 1); $curveCoords = $curve->processCoords(); $this->drawCurve($img, $curveCoords, $averageColor); } } imagepng($img, $imgFile); imagedestroy($img); }
/** * function imageCubicSmoothLine() - * Draws a smooth line * * @param image the image to draw on * @param color color created by imagecolorallocatealpha * @param coords array with points coordinates (x1 => y1, x2 => y2, etc) * */ function imageCubicSmoothLine($image, $color, $coords) { $oCurve = new CubicSplines(); if ($oCurve->setInitCoords($coords, 6) !== false) { if (!($r = $oCurve->processCoords())) { $r = $coords; } } else { $r = $coords; } list($iPrevX, $iPrevY) = each($r); while (list($x, $y) = each($r)) { $this->imageSmoothAlphaLineLarge($image, round($iPrevX), round($iPrevY), round($x), round($y), $color); $iPrevX = $x; $iPrevY = $y; } }