Sector

Add-On Sector

Informations

Author: Maxime Delorme
License: FPDF

Description

This script allows to draw the sector of a circle. It can be used for example to render a pie chart.

Sector(float xc, float yc, float r, float a, float b [, string style [, boolean cw [, float o]]])

xc: abscissa of the center.
yc: ordinate of the center.
r: radius.
a: starting angle (in degrees).
b: ending angle (in degrees).
style: D, F, FD or DF (draw, fill, fill and draw). Default value: FD.
cw: indicates whether to go clockwise (default value: true).
o: origin of angles (0 for right, 90 for top, 180 for left, 270 for bottom). Default value: 90.

Source

<?php
require('fpdf.php');

class PDF_Sector extends FPDF
{
    function Sector($xc, $yc, $r, $a, $b, $style='FD', $cw=true, $o=90)
    {
        $d0 = $a - $b;
        if($cw){
            $d = $b;
            $b = $o - $a;
            $a = $o - $d;
        }else{
            $b += $o;
            $a += $o;
        }
        while($a<0)
            $a += 360;
        while($a>360)
            $a -= 360;
        while($b<0)
            $b += 360;
        while($b>360)
            $b -= 360;
        if ($a > $b)
            $b += 360;
        $b = $b/360*2*M_PI;
        $a = $a/360*2*M_PI;
        $d = $b - $a;
        if ($d == 0 && $d0 != 0)
            $d = 2*M_PI;
        $k = $this->k;
        $hp = $this->h;
        if (sin($d/2))
            $MyArc = 4/3*(1-cos($d/2))/sin($d/2)*$r;
        else
            $MyArc = 0;
        //first put the center
        $this->_out(sprintf('%.2F %.2F m', ($xc)*$k, ($hp-$yc)*$k));
        //put the first point
        $this->_out(sprintf('%.2F %.2F l', ($xc+$r*cos($a))*$k, (($hp-($yc-$r*sin($a)))*$k)));
        //draw the arc
        if ($d < M_PI/2){
            $this->_Arc($xc+$r*cos($a)+$MyArc*cos(M_PI/2+$a), 
                        $yc-$r*sin($a)-$MyArc*sin(M_PI/2+$a), 
                        $xc+$r*cos($b)+$MyArc*cos($b-M_PI/2), 
                        $yc-$r*sin($b)-$MyArc*sin($b-M_PI/2), 
                        $xc+$r*cos($b), 
                        $yc-$r*sin($b)
                        );
        }else{
            $b = $a + $d/4;
            $MyArc = 4/3*(1-cos($d/8))/sin($d/8)*$r;
            $this->_Arc($xc+$r*cos($a)+$MyArc*cos(M_PI/2+$a), 
                        $yc-$r*sin($a)-$MyArc*sin(M_PI/2+$a), 
                        $xc+$r*cos($b)+$MyArc*cos($b-M_PI/2), 
                        $yc-$r*sin($b)-$MyArc*sin($b-M_PI/2), 
                        $xc+$r*cos($b), 
                        $yc-$r*sin($b)
                        );
            $a = $b;
            $b = $a + $d/4;
            $this->_Arc($xc+$r*cos($a)+$MyArc*cos(M_PI/2+$a), 
                        $yc-$r*sin($a)-$MyArc*sin(M_PI/2+$a), 
                        $xc+$r*cos($b)+$MyArc*cos($b-M_PI/2), 
                        $yc-$r*sin($b)-$MyArc*sin($b-M_PI/2), 
                        $xc+$r*cos($b), 
                        $yc-$r*sin($b)
                        );
            $a = $b;
            $b = $a + $d/4;
            $this->_Arc($xc+$r*cos($a)+$MyArc*cos(M_PI/2+$a), 
                        $yc-$r*sin($a)-$MyArc*sin(M_PI/2+$a), 
                        $xc+$r*cos($b)+$MyArc*cos($b-M_PI/2), 
                        $yc-$r*sin($b)-$MyArc*sin($b-M_PI/2), 
                        $xc+$r*cos($b), 
                        $yc-$r*sin($b)
                        );
            $a = $b;
            $b = $a + $d/4;
            $this->_Arc($xc+$r*cos($a)+$MyArc*cos(M_PI/2+$a), 
                        $yc-$r*sin($a)-$MyArc*sin(M_PI/2+$a), 
                        $xc+$r*cos($b)+$MyArc*cos($b-M_PI/2), 
                        $yc-$r*sin($b)-$MyArc*sin($b-M_PI/2), 
                        $xc+$r*cos($b), 
                        $yc-$r*sin($b)
                        );
        }
        //terminate drawing
        if($style=='F')
            $op='f';
        elseif($style=='FD' || $style=='DF')
            $op='b';
        else
            $op='s';
        $this->_out($op);
    }

    function _Arc($x1, $y1, $x2, $y2, $x3, $y3 )
    {
        $h = $this->h;
        $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c', 
            $x1*$this->k, 
            ($h-$y1)*$this->k, 
            $x2*$this->k, 
            ($h-$y2)*$this->k, 
            $x3*$this->k, 
            ($h-$y3)*$this->k));
    }
}
?>

Example

<?php
require('sector.php');

$pdf=new PDF_Sector();
$pdf->AddPage();
$xc=105;
$yc=60;
$r=40;
$pdf->SetFillColor(120, 120, 255);
$pdf->Sector($xc, $yc, $r, 20, 120);
$pdf->SetFillColor(120, 255, 120);
$pdf->Sector($xc, $yc, $r, 120, 250);
$pdf->SetFillColor(255, 120, 120);
$pdf->Sector($xc, $yc, $r, 250, 20);
$pdf->Output();
?>
View the result here.

Download

ZIP | TGZ
An Error Occurred:Internal Server Error

Oops! An Error Occurred

The server returned a "500Internal Server Error".

Something is broken. Please let us know what you were doing when this error occurred. We will fix it as soon as possible. Sorry for any inconvenience caused.