/** * Compile Tree datas * * @param $datas, ex : * array( * 'key1' => array('key1.1' => val, 'key1.2' => val, 'key1.3' => val), * 'key2' => array('key2.1' => val, 'key2.2' => val, 'key2.3' => val) * ) * @param $unit, ex : '%', 'Kg' (optionnal) * @return nothing */ function initDatasTree($datas, $unit = '') { $datas = PluginMreportingCommon::compileDatasForUnit($datas, $unit); echo "var datas = " . json_encode($datas) . ";"; echo "var sum = " . PluginMreportingMisc::getArraySum($datas) . ";"; return $datas; }
function drawSunburstLevel($image, $datas, $params = array()) { global $LANG; $width = $params['width'] - 70; $height = $params['height'] - 120; $gsum = PluginMreportingMisc::getArraySum($datas); $index = 0; $x = $width / 2; $y = $height / 2 + 60; $params['depth'] = isset($params['depth']) ? $params['depth'] : PluginMreportingMisc::getArrayDepth($datas); $params['start_angle'] = isset($params['start_angle']) ? $params['start_angle'] : 0; $params['max_angle'] = isset($params['max_angle']) ? $params['max_angle'] : 360; $params['level'] = isset($params['level']) ? $params['level'] : 0; $params['current_index'] = isset($params['current_index']) ? $params['current_index'] : false; $step = $height / $params['depth']; $radius = $step * ($params['level'] + 1); $darkerpalette = self::getDarkerPalette(); foreach ($datas as $key => $data) { if (is_array($data)) { arsort($data); $params2 = array(); $params2 = $params; $sum = PluginMreportingMisc::getArraySum($data); $angle = $params['max_angle'] * $sum / $gsum; $params2['max_angle'] = $angle; $params2['start_angle'] = $params['start_angle']; $params2['level'] = $params['level'] + 1; $params2['current_index'] = $params['current_index'] === false ? $index : $params['current_index']; $this->drawSunburstLevel($image, $data, $params2); } else { $angle = $params['max_angle'] * $data / $gsum; } //get colors $palette = $this->getPalette(5); if ($params['current_index'] === false) { $color = $palette[$index]; } else { $color = $palette[$params['current_index']]; //get lighter color $color = "0x00" . substr(self::lighter($color, 15 * $params['level'] * $index), 0, 6); } $darkercolor = "0x00" . substr(self::darker($color), 0, 6); $color_rbg = self::colorHexToRGB($color); $darkercolor_rbg = self::colorHexToRGB($darkercolor); //show data arc (tow arcs : 1st border color, 2nd content color) //(Never use deg2rad() in loops, use $rad = ($deg * M_PI / 180) instead which is faster!) imageSmoothArc($image, $x, $y, $radius + 1, $radius + 1, $darkercolor_rbg, $params['start_angle'] * M_PI / 180, ($params['start_angle'] + $angle) * M_PI / 180); imageSmoothArc($image, $x, $y, $radius - 1, $radius - 1, $color_rbg, ($params['start_angle'] + 0.8 / ($params['level'] + 1)) * M_PI / 180, ($params['start_angle'] + $angle - 0.8 / ($params['level'] + 1)) * M_PI / 180); //text associated with pie arc (only for angle > 2°) $am = $params['start_angle'] + $angle / 2; //mediant angle $amr = $am * M_PI / 180; //mediant angle in radiant //adjust label position (in fonction of angle position) $dx = $dy = 0; if ($amr >= 7 * M_PI / 4 || $amr <= M_PI / 4) { $dx = 0; } if ($amr >= M_PI / 4 && $amr <= 3 * M_PI / 4) { $dx = ($amr - M_PI / 4) * 2 / M_PI; } if ($amr >= 3 * M_PI / 4 && $amr <= 5 * M_PI / 4) { $dx = 1; } if ($amr >= 5 * M_PI / 4 && $amr <= 7 * M_PI / 4) { $dx = 1 - ($amr - M_PI * 5 / 4) * 2 / M_PI; } if ($amr >= 7 * M_PI / 4) { $dy = ($amr - M_PI - 3 * M_PI / 4) * 2 / M_PI; } if ($amr <= M_PI / 4) { $dy = 1 - $amr * 2 / M_PI; } if ($amr >= M_PI / 4 && $amr <= 3 * M_PI / 4) { $dy = 1; } if ($amr >= 3 * M_PI / 4 && $amr <= 5 * M_PI / 4) { $dy = 1 - ($amr - 3 * M_PI / 4) * 2 / M_PI; } if ($amr >= 5 * M_PI / 4 && $amr <= 7 * M_PI / 4) { $dy = 0; } //get label size $box = @imageTTFBbox($this->fontsize, $this->fontangle, $this->font, $key); $tw = abs($box[4] - $box[0]); $th = abs($box[5] - $box[1]); //define label position if (is_array($data)) { //show label inside its arc $xtext = $x - $dx * $tw + cos($amr) * (0.5 * $radius - $step / 3); $ytext = $y + $dy * $th - sin($amr) * (0.5 * $radius - $step / 4); } else { //show label outside of its arc $xtext = $x + 3 - $dx * $tw + cos($amr) * (0.5 * $radius + $step / 16); $ytext = $y + $dy * $th - sin($amr) * (0.5 * $radius + $step / 8); } //draw label imagettftext($image, $this->fontsize, $this->fontangle, $xtext, $ytext, $darkercolor, $this->font, $key); //values labels if ($angle > 5) { //mediant start angle in radiant (adjusted for left align label to its arc) $samr = ($params['start_angle'] + 10 / ($params['level'] + 1)) * M_PI / 180; //get label size $box = @imageTTFBbox($this->fontsize, $this->fontangle, $this->font, is_array($data) ? $gsum : $data); $tw = abs($box[4] - $box[0]); $th = abs($box[5] - $box[1]); //define label position $xtext = $x - $dx * $tw + cos($samr) * (0.5 * $radius - $step / 8); $ytext = $y + $dy * $th - sin($samr) * (0.5 * $radius - $step / 16); //draw label imagettftext($image, $this->fontsize, $this->fontangle, $xtext, $ytext, $this->black, $this->font, is_array($data) ? $sum : $data); } $params['start_angle'] += $angle; $index++; } return $image; }