class smolGraph
{
//Used for making a small graph on a bigger one.
public $physicalWidth;
public $physicalHeight;
//what is the incoming data going to look like
public $minValueX;
public $maxValueX;
public $minValueY;
public $maxValueY;
//Where does it live physicall on the screen
public $startX;
public $widthX;
public $startY;
public $heightY;
//cartesian center relative to the X Y of physical screen
public $cartCenterX;
public $cartCenterY;
function svgHeader()
{
$SVGDOCUMENT="";
$GRAPHWIDTH=$this->physicalWidth;
$GRAPHHEIGHT=$this->physicalHeight;
$SVGDOCUMENT.="\n";
}
function graphLine($x,$y,$h,$v,$width,$color)
{
$x1=$this->map($x,$this->minValueX,$this->maxValueX,$this->startX,$this->startX+$this->widthX)-($this->cartCenterX);
$x2=$this->map($h,$this->minValueX,$this->maxValueX,$this->startX,$this->startX+$this->widthX)-($this->cartCenterX);
$y1=$this->map($y,$this->minValueY,$this->maxValueY,$this->startY+$this->heightY,$this->startY)+$this->cartCenterY;
$y2=$this->map($v,$this->minValueY,$this->maxValueY,$this->startY+$this->heightY,$this->startY)+$this->cartCenterY;
$SVGDOCUMENT="\n";
return $SVGDOCUMENT;
}
function graphRectangle($x,$y,$h,$v,$color)
{
$SVGDOCUMENT="";
$x1=$this->map($x,$this->minValueX,$this->maxValueX,$this->startX,$this->startX+$this->widthX)-($this->cartCenterX);
$x2=$this->map($h,$this->minValueX,$this->maxValueX,$this->startX,$this->startX+$this->widthX)-($this->cartCenterX);
$y1=$this->map($y,$this->minValueY,$this->maxValueY,$this->startY+$this->heightY,$this->startY)+$this->cartCenterY;
$y2=$this->map($v,$this->minValueY,$this->maxValueY,$this->startY+$this->heightY,$this->startY)+$this->cartCenterY;
$SVGDOCUMENT.="\n";
return $SVGDOCUMENT;
}
function graphCircle($x,$y,$radius,$color)
{
$SVGDOCUMENT="";
$x1=$this->map($x,$this->minValueX,$this->maxValueX,$this->startX,$this->startX+$this->widthX)-($this->cartCenterX);
$y1=$this->map($y,$this->minValueY,$this->maxValueY,$this->startY+$this->heightY,$this->startY)+$this->cartCenterY;
$SVGDOCUMENT.="\n";
return $SVGDOCUMENT;
}
function graphText($textValue,$x,$y,$color,$size)
{
$SVGDOCUMENT="";
$x1=$this->map($x,$this->minValueX,$this->maxValueX,$this->startX,$this->startX+$this->widthX)-($this->cartCenterX);
$y1=$this->map($y,$this->minValueY,$this->maxValueY,$this->startY+$this->heightY,$this->startY)+$this->cartCenterY;
$y1=$y1+($size/3);
$SVGDOCUMENT.="$textValue\n";
return $SVGDOCUMENT;
}
function map($value, $fromLow, $fromHigh, $toLow, $toHigh)
{
$fromRange = $fromHigh - $fromLow;
$toRange = $toHigh - $toLow;
$scaleFactor = $toRange / $fromRange;
$tmpValue = $value - $fromLow;
$tmpValue *= $scaleFactor;
return $tmpValue + $toLow;
}
function degreesToRadians($degrees)
{
$radians=(pi()/180)*$degrees;
return $radians;
}
function radiansToDegrees($radians)
{
$degrees=$radians*(180/pi());
return $degrees;
}
}
$AGraph=new smolGraph();
$AGraph->physicalWidth=1000;
$AGraph->physicalHeight=1000;
$AGraph->minValueX=-100;
$AGraph->maxValueX=100;
$AGraph->minValueY=-100;
$AGraph->maxValueY=100;
$AGraph->startX=100;
$AGraph->startY=100;
$AGraph->widthX=200;
$AGraph->heightY=200;
$AGraph->cartCenterX=0;
$AGraph->cartCenterY=0;
$retV="";
$retV.=$AGraph->svgHeader();
//grid X
for ($x=$AGraph->minValueX; $x<$AGraph->maxValueX+1; $x+=10)
{
$retV.=$AGraph->graphLine($x,$AGraph->minValueY,$x,$AGraph->maxValueY,1.0,"#888888");
}
//grid Y
for ($y=$AGraph->minValueY; $y<$AGraph->maxValueY+1; $y+=10)
{
$retV.=$AGraph->graphLine($AGraph->minValueX,$y,$AGraph->maxValueX,$y,1.0,"#888888");
}
$retV.=$AGraph->graphLine(-100,0,100,0,2,"#444444");
$retV.=$AGraph->graphLine(0,-100,0,100,2,"#444444");
$retV.=$AGraph->graphLine(0,0,100,100,2,"#882222");
$retV.=$AGraph->graphLine(0,0,100,-100,2,"#228822");
$retV.=$AGraph->graphRectangle(-50,-50,50,50,"#222288");
$retV.=$AGraph->graphCircle(50,50,10,"#440000");
$retV.=$AGraph->graphText("Hello Graph",0,0,"#000000",12);
$retV.=$AGraph->graphText("Hello Graph",-100,-110,"#000000",15);
$retV.=$AGraph->svgFooter();
file_put_contents("/tmp/misc/test.svg", $retV);
//generates a small graph within a larger screen.
//the graph is auto scaled
?>