Ejemplo n.º 1
0
 protected function drawProfile($profile, $width, $height)
 {
     $margint = 50;
     $marginr = 50;
     $marginb = 50;
     $marginl = 50;
     $last = end($profile);
     $maxdist = $last[0];
     $minalti = array(array(0, INF));
     $maxalti = array(array(0, -INF));
     foreach ($profile as $coords) {
         $alti = $coords[1];
         if ($alti == $minalti[0][1]) {
             $minalti[] = array($coords[0], $alti);
         } else {
             if ($alti < $minalti[0][1]) {
                 $minalti = array(array($coords[0], $alti));
             }
         }
         if ($alti == $maxalti[0][1]) {
             $maxalti[] = array($coords[0], $alti);
         } else {
             if ($alti > $maxalti[0][1]) {
                 $maxalti = array(array($coords[0], $alti));
             }
         }
     }
     $canvas = new Canvas($width, $height, $margint, $marginr, $marginb, $marginl);
     $canvas->setViewBox(0, $minalti[0][1], $maxdist, $maxalti[0][1]);
     $canvas->rect(0, 0, $width, $height, "FFFFFF");
     $slopecolor = function ($slope) {
         if ($slope > 18) {
             return "FF0000";
             // red
         } else {
             if ($slope > 12) {
                 return "FF4000";
             } else {
                 if ($slope > 7) {
                     return "FF8000";
                 } else {
                     if ($slope > 3) {
                         return "FFC000";
                     } else {
                         if ($slope > 0) {
                             return "FFFF00";
                             // yellow
                         } else {
                             if ($slope > -3) {
                                 return "00FFFF";
                             } else {
                                 if ($slope > -7) {
                                     return "00C0FF";
                                 } else {
                                     if ($slope > -12) {
                                         return "0080FF";
                                     } else {
                                         if ($slope > -18) {
                                             return "0040FF";
                                         } else {
                                             return "0000FF";
                                             // blue;
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     };
     $canvas->setThickness(2);
     $prev = null;
     foreach ($profile as $coord) {
         if (!is_null($prev)) {
             $dist = $coord[0];
             $alti = $coord[1];
             $prevdist = $prev[0];
             $prevalti = $prev[1];
             $slope = 100 * ($alti - $prevalti) / ($dist - $prevdist);
             $canvas->line($canvas->canvasXPos($prevdist), $canvas->canvasYPos($prevalti), $canvas->canvasXPos($dist), $canvas->canvasYPos($alti), $slopecolor($slope), true);
         }
         $prev = $coord;
     }
     $canvas->setThickness(1);
     $canvas->setFont(APPLICATION_PATH . '/resources/' . 'DejaVuSans.ttf', 10);
     list($minx, $miny, $maxx, $maxy) = $canvas->getViewBox();
     $deltax = pow(10, floor(log10($maxx - $minx)));
     foreach (range($minx, $maxx, $deltax) as $x) {
         $canvas->line($canvas->canvasXPos($x), $height - $marginb + 10, $canvas->canvasXPos($x), $height - $marginb, "000000");
         if ($deltax < 1000) {
             $text = $x . "m";
         } else {
             $text = round($x / 1000) . "km";
         }
         $canvas->text($canvas->canvasXPos($x), $height - $marginb + 10 + 3, $text, "000000", "cb");
     }
     $canvas->line($marginl, $height - $marginb, $width - $marginr, $height - $marginb, "000000");
     $deltay = pow(10, floor(log10($maxy - $miny)));
     foreach (range($miny, $maxy, $deltay) as $y) {
         $canvas->line($marginl - 10, $canvas->canvasYPos($y), $marginl, $canvas->canvasYPos($y), "000000");
         $text = $y . "m";
         $canvas->text($marginl - 10 - 3, $canvas->canvasYPos($y), $text, "000000", "rc");
     }
     $canvas->line($marginl, $height - $marginb, $marginr, $margint, "000000");
     list($minx, $miny, $maxx, $maxy) = $canvas->getViewBox();
     $limits = array($canvas->canvasYPos($maxy) + 3, $canvas->canvasXPos($maxx) - 3, $canvas->canvasYPos($miny) - 3, $canvas->canvasXPos($minx) + 3);
     $prev = null;
     foreach ($minalti as $coords) {
         list($dist, $alti) = $coords;
         if (!is_null($prev)) {
             $xdist = $canvas->canvasXPos($dist) - $canvas->canvasXPos($prev[0]);
             /* second label would be less than 10px from previous one. Do
                not display it */
             if ($xdist < 10) {
                 continue;
             }
         }
         $text = round($alti) . "m";
         $xpos = $canvas->canvasXPos($dist);
         $ypos = $canvas->canvasYPos($alti);
         $canvas->text($xpos, $ypos + 5, $text, "000000", "cb", $limits);
         $canvas->rect($xpos - 1, $ypos - 1, $xpos + 1, $ypos + 1, "000000");
         $prev = $coords;
     }
     $prev = null;
     foreach ($maxalti as $coords) {
         list($dist, $alti) = $coords;
         if (!is_null($prev)) {
             $xdist = $canvas->canvasXPos($dist) - $canvas->canvasXPos($prev[0]);
             /* second label would be less than 10px from previous one. Do
                not display it */
             if ($xdist < 10) {
                 continue;
             }
         }
         $text = round($alti) . "m";
         $xpos = $canvas->canvasXPos($dist);
         $ypos = $canvas->canvasYPos($alti);
         $canvas->text($xpos, $ypos - 5, $text, "000000", "ct", $limits);
         $canvas->rect($xpos - 1, $ypos - 1, $xpos + 1, $ypos + 1, "000000");
         $prev = $coords;
     }
     return $canvas;
 }