Add-On Sector
Informations
Author: Maxime DelormeLicense: 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();
?>