Initial commit
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
<?php
|
||||
/*=========================================================================*/
|
||||
/* Name: ClipCircle.php */
|
||||
/* Uses: Draw a circle clipped within boundaries */
|
||||
/* Date: 1/1/2008 */
|
||||
/* Author: Andrew Que (http://www.DrQue.net/) */
|
||||
/* Revisions: */
|
||||
/* 1.0 - 1/1/2008 - QUE - Creatuib */
|
||||
/* */
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* */
|
||||
/* X/Y trend with linear regression script */
|
||||
/* Copyright (C) 2008 Andrew Que */
|
||||
/* */
|
||||
/* This program is free software: you can redistribute it and/or modify */
|
||||
/* it under the terms of the GNU General Public License as published by */
|
||||
/* the Free Software Foundation, either version 3 of the License, or */
|
||||
/* (at your option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, */
|
||||
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||
/* GNU General Public License for more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License */
|
||||
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
/* */
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* */
|
||||
/* (C) Copyright 2008 */
|
||||
/* Andrew Que */
|
||||
/* ð|> */
|
||||
/*=========================================================================*/
|
||||
/**
|
||||
* Clip circle
|
||||
*
|
||||
* Contains a function to draw a circle clipped within boundaries
|
||||
* @package XY_Plot
|
||||
* @author Andrew Que ({@link http://www.DrQue.net/})
|
||||
* @copyright Copyright (c) 2008, Andrew Que
|
||||
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Draw a circle with clipping
|
||||
*
|
||||
* <p>
|
||||
* Draw a filled circle and do not allow it to extend byond a defined set of
|
||||
* boundaries.
|
||||
* <p>
|
||||
* This isn't the most efficent implementation, so don't use when speed is
|
||||
* essential
|
||||
* @param $Image Image to draw circle onto
|
||||
* @param $CenterX X-coordinate of center of circle
|
||||
* @param $CenterY Y-coordinate of center of circle
|
||||
* @param $Diameter Diameter of circle
|
||||
* @param $Color Color of circle
|
||||
* @param $ClipLeft Left boundary
|
||||
* @param $ClipTop Top boundary
|
||||
* @param $ClipRight Right boundary
|
||||
* @param $ClipBottom Bottom doundary
|
||||
*/
|
||||
function ClippedFilledCircle(
|
||||
$Image ,
|
||||
$CenterX ,
|
||||
$CenterY ,
|
||||
$Diameter ,
|
||||
$Color ,
|
||||
$ClipLeft = null ,
|
||||
$ClipTop = null ,
|
||||
$ClipRight = null ,
|
||||
$ClipBottom = null )
|
||||
{
|
||||
$Radius = $Diameter / 2.0;
|
||||
$Count = round( -$Radius );
|
||||
while ( $Count <= $Radius )
|
||||
{
|
||||
$y = $CenterY + $Count;
|
||||
$yy = $CenterY + $Count;
|
||||
|
||||
$Delta = ( $Radius * $Radius ) - ( $Count * $Count );
|
||||
|
||||
++$Count;
|
||||
|
||||
if ( $Delta < 0 )
|
||||
continue;
|
||||
|
||||
$Delta = sqrt( $Delta );
|
||||
|
||||
$x = ceil( $CenterX - $Delta );
|
||||
$xx = floor( $CenterX + $Delta );
|
||||
|
||||
// Above the top margin?
|
||||
if ( ( $ClipTop !== null )
|
||||
&& ( $y < $ClipTop ) )
|
||||
continue;
|
||||
|
||||
// Below the bottm margin?
|
||||
if ( ( $ClipBottom !== null )
|
||||
&& ( $yy > $ClipBottom ) )
|
||||
continue;
|
||||
|
||||
// Byond left margin?
|
||||
if ( ( $ClipLeft !== null )
|
||||
&& ( $x < $ClipLeft ) )
|
||||
$x = $ClipLeft;
|
||||
|
||||
// Byond right margin?
|
||||
if ( ( $ClipRight !== null )
|
||||
&& ( $xx > $ClipRight ) )
|
||||
$xx = $ClipRight;
|
||||
|
||||
// Off the chat?
|
||||
if ( ( $ClipLeft !== null )
|
||||
&& ( $xx < $ClipLeft ) )
|
||||
continue;
|
||||
|
||||
if ( ( $ClipLeft !== null )
|
||||
&& ( $x > $ClipRight ) )
|
||||
continue;
|
||||
|
||||
// Draw line
|
||||
ImageLine( $Image , $x , $y , $xx , $y , $Color );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,977 @@
|
||||
<?php
|
||||
/*=========================================================================*/
|
||||
/* Name: ClipLine.php */
|
||||
/* Uses: Used for clipping a line in a define square */
|
||||
/* Date: 12/7/2007 */
|
||||
/* Authors: */
|
||||
/* Andrew Que (http://www.DrQue.net/) */
|
||||
/* References: */
|
||||
/* This unit was constructed mostly from an example in Wikipedia, which */
|
||||
/* had the following credit: */
|
||||
/* "Mark S. Sobkow, Paul Pospisil and Yee-Hong Yang. A Fast Two- */
|
||||
/* Dimensional Line Clipping Algorithm via Line Encoding//Computer & */
|
||||
/* Graphics, Vol. 11, No. 4, pp. 459-467, 1987." */
|
||||
/* The port to PHP was done by Andrew Que */
|
||||
/* Revisions: */
|
||||
/* 1.0 - 12/7/2007 - QUE - Creation */
|
||||
/* 1.1 - 12/31/2007 - QUE - Clipping for complete out-of-bounds */
|
||||
/* */
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* */
|
||||
/* Line clipping function */
|
||||
/* Copyright (C) 2007 Andrew Que */
|
||||
/* */
|
||||
/* This program is free software: you can redistribute it and/or modify */
|
||||
/* it under the terms of the GNU General Public License as published by */
|
||||
/* the Free Software Foundation, either version 3 of the License, or */
|
||||
/* (at your option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, */
|
||||
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||
/* GNU General Public License for more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License */
|
||||
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
/* */
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* */
|
||||
/* (C) Copyright 2007 */
|
||||
/* Andrew Que */
|
||||
/* ð|> */
|
||||
/*=========================================================================*/
|
||||
/**
|
||||
* Used for clipping a line in a define square
|
||||
*
|
||||
* <p>
|
||||
* This unit was constructed mostly from an example in Wikipedia, which
|
||||
* had the following credit:
|
||||
* <p>
|
||||
* "Mark S. Sobkow, Paul Pospisil and Yee-Hong Yang. A Fast Two-
|
||||
* Dimensional Line Clipping Algorithm via Line Encoding//Computer &
|
||||
* Graphics, Vol. 11, No. 4, pp. 459-467, 1987."
|
||||
* <p>
|
||||
* The port to PHP was done by Andrew Que
|
||||
*
|
||||
* @package XY_Plot
|
||||
* @author Andrew Que ({@link http://www.DrQue.net/})
|
||||
* @copyright Copyright (c) 2007, Andrew Que
|
||||
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implementation of the Fast-Clipping algorithm.
|
||||
*
|
||||
* This is a class, but acts more like a function. The reason
|
||||
* implementation is done this way is because of the sub-functions that
|
||||
* need access to the local variables.
|
||||
*/
|
||||
class ClipLine
|
||||
{
|
||||
/**#@+ @ignore */
|
||||
public $x;
|
||||
public $y;
|
||||
public $xx;
|
||||
public $yy;
|
||||
|
||||
public $X_Min;
|
||||
public $Y_Min;
|
||||
public $X_Max;
|
||||
public $Y_Max;
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param x Left corner of line
|
||||
* @param y Top corner of line
|
||||
* @param xx Right corner of line
|
||||
* @param yy Bottom corner of line
|
||||
* @param X_Min Left edge of frame
|
||||
* @param Y_Min Top edge of frame
|
||||
* @param X_Max Right edge of frame
|
||||
* @param Y_Max Bottom edge of frame
|
||||
*/
|
||||
public function __construct
|
||||
(
|
||||
&$x , &$y , &$xx , &$yy ,
|
||||
$X_Min , $Y_Min , $X_Max , $Y_Max
|
||||
)
|
||||
{
|
||||
// Set local variables
|
||||
$this->x = &$x;
|
||||
$this->y = &$y;
|
||||
$this->xx = &$xx;
|
||||
$this->yy = &$yy;
|
||||
$this->X_Min = &$X_Min;
|
||||
$this->Y_Min = &$Y_Min;
|
||||
$this->X_Max = &$X_Max;
|
||||
$this->Y_Max = &$Y_Max;
|
||||
|
||||
// Clip the line
|
||||
$this->Clip();
|
||||
}
|
||||
|
||||
//------------------------------------------------------
|
||||
// Clipping function
|
||||
// (There is one clipping function for each of the 8 areas)
|
||||
//------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Start top
|
||||
*/
|
||||
private function clipStartTop()
|
||||
{
|
||||
$DeltaX = $this->xx - $this->x;
|
||||
$DeltaY = $this->yy - $this->y;
|
||||
$this->x += $DeltaX * ( $this->Y_Min - $this->y ) / $DeltaY;
|
||||
$this->y = $this->Y_Min;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start bottom
|
||||
*/
|
||||
private function clipStartBottom()
|
||||
{
|
||||
$DeltaX = $this->xx - $this->x;
|
||||
$DeltaY = $this->yy - $this->y;
|
||||
$this->x += $DeltaX * ( $this->Y_Max - $this->y ) / $DeltaY;
|
||||
$this->y = $this->Y_Max;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start right
|
||||
*/
|
||||
private function clipStartRight()
|
||||
{
|
||||
$DeltaX = $this->xx - $this->x;
|
||||
$DeltaY = $this->yy - $this->y;
|
||||
$this->y += $DeltaY * ( $this->X_Max - $this->x ) / $DeltaX;
|
||||
$this->x = $this->X_Max;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start left
|
||||
*/
|
||||
private function clipStartLeft()
|
||||
{
|
||||
$DeltaX = $this->xx - $this->x;
|
||||
$DeltaY = $this->yy - $this->y;
|
||||
$this->y += $DeltaY * ( $this->X_Min - $this->x ) / $DeltaX;
|
||||
$this->x = $this->X_Min;
|
||||
}
|
||||
|
||||
/**
|
||||
* End top
|
||||
*/
|
||||
private function clipEndTop()
|
||||
{
|
||||
$DeltaX = $this->xx - $this->x;
|
||||
$DeltaY = $this->yy - $this->y;
|
||||
$this->xx += $DeltaX * ( $this->Y_Min - $this->yy ) / $DeltaY;
|
||||
$this->yy = $this->Y_Min;
|
||||
}
|
||||
|
||||
/**
|
||||
* End bottom
|
||||
*/
|
||||
private function clipEndBottom()
|
||||
{
|
||||
$DeltaX = $this->xx - $this->x;
|
||||
$DeltaY = $this->yy - $this->y;
|
||||
$this->xx += $DeltaX * ( $this->Y_Max - $this->yy ) / $DeltaY;
|
||||
$this->yy = $this->Y_Max;
|
||||
}
|
||||
|
||||
/**
|
||||
* End right
|
||||
*/
|
||||
private function clipEndRight()
|
||||
{
|
||||
$DeltaX = $this->xx - $this->x;
|
||||
$DeltaY = $this->yy - $this->y;
|
||||
$this->yy += $DeltaY * ( $this->X_Max - $this->xx ) / $DeltaX;
|
||||
$this->xx = $this->X_Max;
|
||||
}
|
||||
|
||||
/**
|
||||
* End Left
|
||||
*/
|
||||
private function clipEndLeft()
|
||||
{
|
||||
$DeltaX = $this->xx - $this->x;
|
||||
$DeltaY = $this->yy - $this->y;
|
||||
$this->yy += $DeltaY * ( $this->X_Min - $this->xx ) / $DeltaX;
|
||||
$this->xx = $this->X_Min;
|
||||
}
|
||||
|
||||
/**
|
||||
* Main body of clipping function
|
||||
*
|
||||
* This function does all the clipping work
|
||||
*/
|
||||
private function Clip()
|
||||
{
|
||||
$LineCode = 0;
|
||||
|
||||
// Figure out which sides clip
|
||||
if ( $this->y < $this->Y_Min )
|
||||
$LineCode |= 0x80; // BIT8
|
||||
else
|
||||
if ( $this->y > $this->Y_Max )
|
||||
$LineCode |= 0x40; // BIT7
|
||||
|
||||
if ( $this->x > $this->X_Max )
|
||||
$LineCode |= 0x20; // BIT6
|
||||
else
|
||||
if ( $this->x < $this->X_Min )
|
||||
$LineCode |= 0x10; // BIT5
|
||||
|
||||
if ( $this->yy < $this->Y_Min )
|
||||
$LineCode |= 0x08; // BIT4
|
||||
else
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
$LineCode |= 0x04; // BIT3
|
||||
|
||||
if ( $this->xx > $this->X_Max )
|
||||
$LineCode |= 0x02; // BIT2
|
||||
else
|
||||
if ( $this->xx < $this->X_Min )
|
||||
$LineCode |= 0x01; // BIT1
|
||||
|
||||
// Completely out of bounds? (i.e. not visible on screen)
|
||||
if ( ( ( $LineCode & ( 0x80 | 0x08 ) ) == ( 0x80 | 0x08 ) )
|
||||
|| ( ( $LineCode & ( 0x40 | 0x04 ) ) == ( 0x40 | 0x04 ) )
|
||||
|| ( ( $LineCode & ( 0x20 | 0x02 ) ) == ( 0x20 | 0x02 ) )
|
||||
|| ( ( $LineCode & ( 0x10 | 0x01 ) ) == ( 0x10 | 0x01 ) ) )
|
||||
{
|
||||
$this->x = $this->y = $this->xx = $this->yy = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// 9 - 8 - A
|
||||
// | | |
|
||||
// 1 - 0 - 2
|
||||
// | | |
|
||||
// 5 - 4 - 6
|
||||
switch ( $LineCode )
|
||||
{
|
||||
//------------------------------
|
||||
// Center
|
||||
//------------------------------
|
||||
|
||||
case 0x00:
|
||||
{
|
||||
// Line is perfect, no clipping needed
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x01:
|
||||
{
|
||||
$this->clipEndLeft();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x02:
|
||||
{
|
||||
$this->clipEndRight();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x04:
|
||||
{
|
||||
$this->clipEndBottom();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x05:
|
||||
{
|
||||
$this->clipEndLeft();
|
||||
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
$this->clipEndBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x06:
|
||||
{
|
||||
$this->clipEndRight();
|
||||
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
$this->clipEndBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x08:
|
||||
{
|
||||
$this->clipEndTop();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x09:
|
||||
{
|
||||
$this->clipEndLeft();
|
||||
|
||||
if ( $this->yy < $this->Y_Min )
|
||||
$this->clipEndTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x0A:
|
||||
{
|
||||
$this->clipEndRight();
|
||||
|
||||
if ( $this->yy < $this->Y_Min )
|
||||
$this->clipEndTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//------------------------------
|
||||
// Left
|
||||
//------------------------------
|
||||
|
||||
case 0x10:
|
||||
{
|
||||
$this->clipStartLeft();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x12:
|
||||
{
|
||||
$this->clipStartLeft();
|
||||
$this->clipEndRight();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x14:
|
||||
{
|
||||
$this->clipStartLeft();
|
||||
|
||||
if ( $this->y > $this->Y_Max )
|
||||
break;
|
||||
|
||||
$this->clipEndBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x16:
|
||||
{
|
||||
$this->clipStartLeft();
|
||||
|
||||
if ( $this->y > $this->Y_Max )
|
||||
break;
|
||||
|
||||
$this->clipEndBottom();
|
||||
|
||||
if ( $this->xx > $this->X_Max )
|
||||
$this->clipEndRight();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x18:
|
||||
{
|
||||
$this->clipStartLeft();
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
break;
|
||||
|
||||
$this->clipEndTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x1A:
|
||||
{
|
||||
$this->clipStartLeft();
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
break;
|
||||
|
||||
$this->clipEndTop();
|
||||
|
||||
if ( $this->xx > $this->X_Max )
|
||||
$this->clipEndRight();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//------------------------------
|
||||
// Right
|
||||
//------------------------------
|
||||
|
||||
case 0x20:
|
||||
{
|
||||
$this->clipStartRight();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x21:
|
||||
{
|
||||
$this->clipStartRight();
|
||||
$this->clipEndLeft();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x24:
|
||||
{
|
||||
$this->clipStartRight();
|
||||
|
||||
if ( $this->y > $this->Y_Max )
|
||||
break;
|
||||
|
||||
$this->clipEndBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x25:
|
||||
{
|
||||
$this->clipStartRight();
|
||||
if ( $this->y > $this->Y_Max )
|
||||
break;
|
||||
|
||||
$this->clipEndBottom();
|
||||
|
||||
if ( $this->xx < $this->X_Min )
|
||||
$this->clipEndLeft();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x28:
|
||||
{
|
||||
$this->clipStartRight();
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
break;
|
||||
|
||||
$this->clipEndTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x29:
|
||||
{
|
||||
$this->clipStartRight();
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
break;
|
||||
|
||||
$this->clipEndTop();
|
||||
|
||||
if ( $this->xx < $this->X_Min )
|
||||
$this->clipEndLeft();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//------------------------------
|
||||
// Bottom
|
||||
//------------------------------
|
||||
|
||||
case 0x40:
|
||||
{
|
||||
$this->clipStartBottom();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x41:
|
||||
{
|
||||
$this->clipStartBottom();
|
||||
|
||||
if ( $this->x < $this->X_Min )
|
||||
break;
|
||||
|
||||
$this->clipEndLeft();
|
||||
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
$this->clipEndBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x42:
|
||||
{
|
||||
$this->clipStartBottom();
|
||||
|
||||
if ( $this->x > $this->X_Max )
|
||||
break;
|
||||
|
||||
$this->clipEndRight();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x48:
|
||||
{
|
||||
$this->clipStartBottom();
|
||||
$this->clipEndTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x49:
|
||||
{
|
||||
$this->clipStartBottom();
|
||||
|
||||
if ( $this->x < $this->X_Min )
|
||||
break;
|
||||
|
||||
$this->clipEndLeft();
|
||||
|
||||
if ( $this->yy < $this->Y_Min )
|
||||
$this->clipEndTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x4A:
|
||||
{
|
||||
$this->clipStartBottom();
|
||||
|
||||
if ( $this->x > $this->X_Max )
|
||||
break;
|
||||
|
||||
$this->clipEndRight();
|
||||
|
||||
if ( $this->yy < $this->Y_Min )
|
||||
$this->clipEndTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//------------------------------
|
||||
// Bottom-left
|
||||
//------------------------------
|
||||
|
||||
case 0x50:
|
||||
{
|
||||
$this->clipStartLeft();
|
||||
|
||||
if ( $this->y > $this->Y_Max )
|
||||
$this->clipStartBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x52:
|
||||
{
|
||||
$this->clipEndRight();
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
break;
|
||||
|
||||
$this->clipStartBottom();
|
||||
|
||||
if ( $this->x < $this->X_Min )
|
||||
$this->clipStartLeft();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x58:
|
||||
{
|
||||
$this->clipEndTop();
|
||||
|
||||
if ( $this->xx < $this->X_Min )
|
||||
break;
|
||||
|
||||
$this->clipStartBottom();
|
||||
|
||||
if ( $this->x < $this->X_Min )
|
||||
$this->clipStartLeft();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x5A:
|
||||
{
|
||||
$this->clipStartLeft();
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
break;
|
||||
|
||||
$this->clipEndRight();
|
||||
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
break;
|
||||
|
||||
if ( $this->y > $this->Y_Max )
|
||||
$this->clipStartBottom();
|
||||
|
||||
if ( $this->yy < $this->Y_Min )
|
||||
$this->clipEndTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//------------------------------
|
||||
// Bottom-right
|
||||
//------------------------------
|
||||
|
||||
case 0x60:
|
||||
{
|
||||
$this->clipStartRight();
|
||||
|
||||
if ( $this->y > $this->Y_Max )
|
||||
$this->clipStartBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x61:
|
||||
{
|
||||
$this->clipEndLeft();
|
||||
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
break;
|
||||
|
||||
$this->clipStartBottom();
|
||||
|
||||
if ( $this->x > $this->X_Max )
|
||||
$this->clipStartRight();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x68:
|
||||
{
|
||||
$this->clipEndTop();
|
||||
|
||||
if ( $this->xx > $this->X_Max )
|
||||
break;
|
||||
|
||||
$this->clipStartRight();
|
||||
|
||||
if ( $this->y > $this->Y_Max )
|
||||
$this->clipStartBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x69:
|
||||
{
|
||||
$this->clipEndLeft();
|
||||
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
break;
|
||||
|
||||
$this->clipStartRight();
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
break;
|
||||
|
||||
if ( $this->yy < $this->Y_Min )
|
||||
$this->clipEndTop();
|
||||
|
||||
if ( $this->y > $this->Y_Max )
|
||||
$this->clipStartBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//------------------------------
|
||||
// Top
|
||||
//------------------------------
|
||||
|
||||
case 0x80:
|
||||
{
|
||||
$this->clipStartTop();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x81:
|
||||
{
|
||||
$this->clipStartTop();
|
||||
|
||||
if ( $this->x < $this->X_Min )
|
||||
break;
|
||||
|
||||
$this->clipEndLeft();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x82:
|
||||
{
|
||||
$this->clipStartTop();
|
||||
|
||||
if ( $this->x > $this->X_Max )
|
||||
break;
|
||||
|
||||
$this->clipEndRight();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x84:
|
||||
{
|
||||
$this->clipStartTop();
|
||||
$this->clipEndBottom();
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x85:
|
||||
{
|
||||
$this->clipStartTop();
|
||||
|
||||
if ( $this->x < $this->X_Min )
|
||||
break;
|
||||
|
||||
$this->clipEndLeft();
|
||||
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
$this->clipEndBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x86:
|
||||
{
|
||||
$this->clipStartTop();
|
||||
|
||||
if ( $this->x > $this->X_Max )
|
||||
break;
|
||||
|
||||
$this->clipEndRight();
|
||||
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
$this->clipEndBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//------------------------------
|
||||
// Top-left
|
||||
//------------------------------
|
||||
|
||||
case 0x90:
|
||||
{
|
||||
$this->clipStartLeft();
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
$this->clipStartTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x92:
|
||||
{
|
||||
$this->clipEndRight();
|
||||
|
||||
if ( $this->yy < $this->Y_Min )
|
||||
break;
|
||||
|
||||
$this->clipStartTop();
|
||||
|
||||
if ( $this->x < $this->X_Min )
|
||||
$this->clipStartLeft();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x94:
|
||||
{
|
||||
$this->clipEndBottom();
|
||||
|
||||
if ( $this->xx < $this->X_Min )
|
||||
break;
|
||||
|
||||
$this->clipStartLeft();
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
$this->clipStartTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x96:
|
||||
{
|
||||
$this->clipStartLeft();
|
||||
|
||||
if ( $this->y > $this->Y_Max )
|
||||
break;
|
||||
|
||||
$this->clipEndRight();
|
||||
|
||||
if ( $this->yy < $this->Y_Min )
|
||||
break;
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
$this->clipStartTop();
|
||||
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
$this->clipEndBottom();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//------------------------------
|
||||
// Top-right
|
||||
//------------------------------
|
||||
|
||||
case 0xA0:
|
||||
{
|
||||
$this->clipStartRight();
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
$this->clipStartTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0xA1:
|
||||
{
|
||||
$this->clipEndLeft();
|
||||
|
||||
if ( $this->yy < $this->Y_Min )
|
||||
break;
|
||||
|
||||
$this->clipStartTop();
|
||||
|
||||
if ( $this->x > $this->X_Max )
|
||||
$this->clipStartRight();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0xA4:
|
||||
{
|
||||
$this->clipEndBottom();
|
||||
|
||||
if ( $this->xx > $this->X_Max )
|
||||
break;
|
||||
|
||||
$this->clipStartRight();
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
$this->clipStartTop();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case 0xA5:
|
||||
{
|
||||
$this->clipEndLeft();
|
||||
|
||||
if ( $this->yy < $this->Y_Min )
|
||||
break;
|
||||
|
||||
$this->clipStartRight();
|
||||
|
||||
if ( $this->y > $this->Y_Max )
|
||||
break;
|
||||
|
||||
if ( $this->yy > $this->Y_Max )
|
||||
$this->clipEndBottom();
|
||||
|
||||
if ( $this->y < $this->Y_Min )
|
||||
$this->clipStartTop();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Round result
|
||||
$this->x = round( $this->x );
|
||||
$this->y = round( $this->y );
|
||||
$this->xx = round( $this->xx );
|
||||
$this->yy = round( $this->yy );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clip line
|
||||
*
|
||||
* <p>
|
||||
* This will take the corners of a line segment and clip them in a define
|
||||
* area.
|
||||
* <p>
|
||||
* Examples of use:
|
||||
* <code>
|
||||
* $x = 5;
|
||||
* $y = 8;
|
||||
* $xx = 70;
|
||||
* $yy = 65;
|
||||
* ClipLine(
|
||||
* $x , $y , $xx , $yy ,
|
||||
* 10 , 10 , 50 , 50 );
|
||||
* </code>
|
||||
* <p>
|
||||
* In this example, the values in <var>$x</var>, <var>$y</var>,
|
||||
* <var>$xx</var>, <var>$yy</var> will be adjusted so they are within
|
||||
* the (10,10) (50,50) window.
|
||||
* @param x Left corner of line
|
||||
* @param y Top corner of line
|
||||
* @param xx Right corner of line
|
||||
* @param yy Bottom corner of line
|
||||
* @param X_Min Left edge of frame
|
||||
* @param Y_Min Top edge of frame
|
||||
* @param X_Max Right edge of frame
|
||||
* @param Y_Max Bottom edge of frame
|
||||
* @return x, y, xx, yy are all modified (if necessary)
|
||||
*/
|
||||
function ClipLine(
|
||||
&$x , &$y , &$xx , &$yy ,
|
||||
$X_Min , $Y_Min , $X_Max , $Y_Max )
|
||||
{
|
||||
// All of the work is done simply by creating a clip class
|
||||
$Clip = new
|
||||
ClipLine
|
||||
(
|
||||
$x , $y , $xx , $yy ,
|
||||
$X_Min , $Y_Min , $X_Max , $Y_Max
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw clipped line
|
||||
*
|
||||
* <p>
|
||||
* Draw a line that has been clipped into the specified image.
|
||||
* <p>
|
||||
* Examples of use:
|
||||
* <code>
|
||||
* DrawClippedLine(
|
||||
* $Image ,
|
||||
* 5 , 8 , 70 , 65 ,
|
||||
* 10 , 10 , 50 , 50 ,
|
||||
* $Black );
|
||||
* </code>
|
||||
* In this example, a line will be drawn onto <var>$Image</var> clipped
|
||||
* within the window (10,10) (50,50).
|
||||
* @param image Image to draw line on
|
||||
* @param x Left corner of line
|
||||
* @param y Top corner of line
|
||||
* @param xx Right corner of line
|
||||
* @param yy Bottom corner of line
|
||||
* @param X_Min Left edge of frame
|
||||
* @param Y_Min Top edge of frame
|
||||
* @param X_Max Right edge of frame
|
||||
* @param Y_Max Bottom edge of frame
|
||||
* @param Color Color of line
|
||||
*/
|
||||
function DrawClippedLine(
|
||||
$Image ,
|
||||
$x , $y , $xx , $yy ,
|
||||
$X_Min , $Y_Min , $X_Max , $Y_Max ,
|
||||
$Color )
|
||||
{
|
||||
// Clip this line
|
||||
ClipLine(
|
||||
$x , $y , $xx , $yy ,
|
||||
$X_Min , $Y_Min , $X_Max , $Y_Max );
|
||||
|
||||
// Draw the results
|
||||
imageline( $Image , $x , $y , $xx , $yy , $Color );
|
||||
}
|
||||
|
||||
// "Those who dream by day are cognizant of many things which escape those
|
||||
// who dream only by night." - Edgar Allan Poe
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,395 @@
|
||||
<?php
|
||||
/*=========================================================================*/
|
||||
/* Name: PolynomialRegression.php */
|
||||
/* Uses: Calculates and returns coefficients for polynomial regression. */
|
||||
/* Date: 06/01/2009 */
|
||||
/* Author: Andrew Que (http://www.DrQue.net/) */
|
||||
/* Revisions: */
|
||||
/* 0.8 - 06/01/2009- QUE - Creation. */
|
||||
/* 0.9 - 06/14/2012- QUE - */
|
||||
/* + Bug fix: removed notice causes by uninitialized variable. */
|
||||
/* + Converted naming convention. */
|
||||
/* + Fix spelling errors (or the ones I found). */
|
||||
/* + Changed to row-echelon method for solving matrix which is much */
|
||||
/* faster than the determinant method. */
|
||||
/* 0.91 - 05/17/2013- QUE - */
|
||||
/* = Changed name to Polynonial regression as this is more fitting to */
|
||||
/* to the function. */
|
||||
/* 0.92 - 12/28/2013- QUE - */
|
||||
/* + Added forced offset. */
|
||||
/* 1.00 - 12/29/2013 - QUE - */
|
||||
/* + Forced offset changed to allow any term to be forced. */
|
||||
/* Unit complete. Correlation coefficient (r-squared) has been */
|
||||
/* implemented externally in the demos. */
|
||||
/* */
|
||||
/* This project is maintained at: */
|
||||
/* http://www.drque.net/Projects/PolynomialRegression/ */
|
||||
/* */
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* */
|
||||
/* Polynomial regression class. */
|
||||
/* Copyright (C) 2009, 2012-2013 Andrew Que */
|
||||
/* */
|
||||
/* This program is free software: you can redistribute it and/or modify */
|
||||
/* it under the terms of the GNU General Public License as published by */
|
||||
/* the Free Software Foundation, either version 3 of the License, or */
|
||||
/* (at your option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, */
|
||||
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||
/* GNU General Public License for more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License */
|
||||
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
/* */
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* */
|
||||
/* (C) Copyright 2009, 2012-2013 */
|
||||
/* Andrew Que */
|
||||
/* �|> */
|
||||
/*=========================================================================*/
|
||||
/**
|
||||
* Polynomial regression.
|
||||
*
|
||||
* <p>
|
||||
* Used for calculating polynomial regression coefficients. Useful for
|
||||
* linear and non-linear regression, and polynomial curve fitting.
|
||||
*
|
||||
* @package PolynomialRegression
|
||||
* @author Andrew Que ({@link http://www.DrQue.net/})
|
||||
* @copyright Copyright (c) 2009, 2012-2013, Andrew Que
|
||||
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
|
||||
* @version 1.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* Used for calculating polynomial regression coefficients and interpolation using
|
||||
* those coefficients. Useful for linear and non-linear regression, and polynomial
|
||||
* curve fitting.
|
||||
*
|
||||
* Note: Requires BC math to be compiled into PHP. Higher-degree polynomials end up
|
||||
* with very large/small numbers, requiring an arbitrary precision arithmetic. Make sure
|
||||
* to set "bcscale" as coefficients will likely have decimal values.
|
||||
*
|
||||
* Quick example of using this unit to calculate linear regression (1st degree polynomial):
|
||||
*
|
||||
* <code>
|
||||
* $regression = new PolynomialRegression( 2 );
|
||||
* // ...
|
||||
* $regression->addData( $x, $y );
|
||||
* // ...
|
||||
* $coefficients = $regression->getCoefficients();
|
||||
* // ...
|
||||
* $y = $regression->interpolate( $coefficients, $x );
|
||||
* </code>
|
||||
*
|
||||
*
|
||||
* @package PolynomialRegression
|
||||
*/
|
||||
class PolynomialRegression
|
||||
{
|
||||
private $X_Powers;
|
||||
private $XY_Powers;
|
||||
private $degree;
|
||||
private $forcedValue;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Create new class.
|
||||
* @param int $degree Degree + 1 of polynomial.
|
||||
*/
|
||||
public function __construct( $degree = 3 )
|
||||
{
|
||||
$this->degree = $degree;
|
||||
$this->reset();
|
||||
|
||||
} // __construct
|
||||
|
||||
/**
|
||||
* Reset data.
|
||||
*
|
||||
* Clear all internal data and prepare for new calculation.
|
||||
* Must be called *after* setDegree if degree is changed.
|
||||
*/
|
||||
public function reset()
|
||||
{
|
||||
$this->forcedValue = array();
|
||||
$this->X_Powers = array();
|
||||
$this->XY_Powers = array();
|
||||
|
||||
$squares = ( $this->degree - 1 ) * 2;
|
||||
|
||||
// Initialize power arrays.
|
||||
for ( $index = 0; $index <= $squares; ++$index )
|
||||
{
|
||||
$this->X_Powers[ $index ] = 0;
|
||||
$this->XY_Powers[ $index ] = 0;
|
||||
}
|
||||
|
||||
} // reset
|
||||
|
||||
/**
|
||||
* Set degree.
|
||||
*
|
||||
* This is the maximum degree polynomial function that will be
|
||||
* calculated. Note that the request for coefficients can be lower
|
||||
* then this value. If degree is higher, data must be reset and
|
||||
* added again.
|
||||
* @param int $degree Max degree
|
||||
*/
|
||||
public function setDegree( $degree )
|
||||
{
|
||||
$this->degree = $degree;
|
||||
|
||||
} // setDegree
|
||||
|
||||
/**
|
||||
* Set a forced coefficient.
|
||||
*
|
||||
* Force a coefficient to be assumed a specific value for the calculation.
|
||||
* Most often used to force an offset of zero, but can be used to set any
|
||||
* known coefficient for a set of data.
|
||||
* @param int $coefficient Which coefficient to force.
|
||||
* @param int $value Value to force this coefficient.
|
||||
*/
|
||||
public function setForcedCoefficient( $coefficient, $value )
|
||||
{
|
||||
$this->forcedValue[ $coefficient ] = $value;
|
||||
|
||||
} // setForcedCoefficient
|
||||
|
||||
/**
|
||||
* Add data.
|
||||
*
|
||||
* Add a data point to calculation.
|
||||
* @param float $x Some real value.
|
||||
* @param float $y Some real value corresponding to $x.
|
||||
*/
|
||||
public function addData( $x, $y )
|
||||
{
|
||||
$squares = ( $this->degree - 1 ) * 2;
|
||||
|
||||
// Remove the effect of the forced coefficient from this value.
|
||||
foreach ( $this->forcedValue as $coefficient => $value )
|
||||
{
|
||||
$sub = bcpow( $x, $coefficient );
|
||||
$sub = bcmul( $sub, $value );
|
||||
$y = bcsub( $y, $sub );
|
||||
}
|
||||
|
||||
// Accumulate new data to power sums.
|
||||
for ( $index = 0; $index <= $squares; ++$index )
|
||||
{
|
||||
$this->X_Powers[ $index ] =
|
||||
bcadd( $this->X_Powers[ $index ], bcpow( $x, $index ) );
|
||||
|
||||
$this->XY_Powers[ $index ] =
|
||||
bcadd
|
||||
(
|
||||
$this->XY_Powers[ $index ],
|
||||
bcmul( $y, bcpow( $x, $index ) )
|
||||
);
|
||||
}
|
||||
|
||||
} // addData
|
||||
|
||||
/**
|
||||
* Get coefficients.
|
||||
*
|
||||
* Calculate and return coefficients based on current data.
|
||||
* @param int $degree Integer value of the degree polynomial desired. Default
|
||||
* is -1 which is the max degree set by class.
|
||||
* @return array Array of coefficients (as BC strings).
|
||||
*/
|
||||
public function getCoefficients( $degree = -1 )
|
||||
{
|
||||
// If no degree specified, use standard.
|
||||
if ( $degree == -1 )
|
||||
$degree = $this->degree;
|
||||
|
||||
// Build a matrix.
|
||||
// The matrix is made up of the sum of powers. So if the number represents the power,
|
||||
// the matrix will look like this for a 4th degree polynomial:
|
||||
// [ 0 1 2 3 4 ]
|
||||
// [ 1 2 3 4 5 ]
|
||||
// [ 2 3 4 5 6 ]
|
||||
// [ 3 4 5 6 7 ]
|
||||
// [ 4 5 6 7 8 ]
|
||||
//
|
||||
$matrix = array();
|
||||
for ( $row = 0; $row < $degree; ++$row )
|
||||
{
|
||||
$matrix[ $row ] = array();
|
||||
for ( $column = 0; $column < $degree; ++$column )
|
||||
$matrix[ $row ][ $column ] =
|
||||
$this->X_Powers[ $row + $column ];
|
||||
}
|
||||
|
||||
// Create augmented matrix by adding X*Y powers.
|
||||
for ( $row = 0; $row < $degree; ++$row )
|
||||
$matrix[ $row ][ $degree ] = $this->XY_Powers[ $row ];
|
||||
|
||||
// Add in the forced coefficients. This is done by nulling the row and column
|
||||
// for each forced coefficient. For example, a 3th degree polynomial
|
||||
// matrix with have the 2nd coefficient set to F:
|
||||
// [ a b c d w ] [ a 0 c d w ]
|
||||
// [ b c d e x ] -> [ 0 1 0 0 F ]
|
||||
// [ c d e f y ] [ c 0 e f y ]
|
||||
// [ d e f g z ] [ d 0 f g z ]
|
||||
foreach ( $this->forcedValue as $coefficient => $value )
|
||||
{
|
||||
for ( $index = 0; $index < $degree; ++$index )
|
||||
{
|
||||
$matrix[ $index ][ $coefficient ] = "0";
|
||||
$matrix[ $coefficient ][ $index ] = "0";
|
||||
}
|
||||
|
||||
$matrix[ $coefficient ][ $coefficient ] = "1";
|
||||
$matrix[ $coefficient ][ $degree ] = $value;
|
||||
}
|
||||
|
||||
// Determine number of rows in matrix.
|
||||
$rows = count( $matrix );
|
||||
|
||||
// Initialize done.
|
||||
$isDone = array();
|
||||
for ( $column = 0; $column < $rows; ++$column )
|
||||
$isDone[ $column ] = false;
|
||||
|
||||
// This loop will result in an upper-triangle matrix with the
|
||||
// diagonals all 1--the first part of row-reduction--using 2
|
||||
// elementary row operations: multiplying a row by a scalar, and
|
||||
// subtracting a row by a multiple of an other row.
|
||||
// NOTE: This loop can be done out-of-order. That is, the first
|
||||
// row may not begin with the first term. Order is tracked in the
|
||||
// "order" array.
|
||||
$order = array();
|
||||
for ( $column = 0; $column < $rows; ++$column )
|
||||
{
|
||||
// Find a row to work with.
|
||||
// A row that has a term in this column, and has not yet been
|
||||
// reduced.
|
||||
$activeRow = 0;
|
||||
while ( ( ( 0 == $matrix[ $activeRow ][ $column ] )
|
||||
|| ( $isDone[ $activeRow ] ) )
|
||||
&& ( $activeRow < $rows ) )
|
||||
{
|
||||
++$activeRow;
|
||||
}
|
||||
|
||||
// Do we have a term in this row?
|
||||
if ( $activeRow < $rows )
|
||||
{
|
||||
// Remember the order.
|
||||
$order[ $column ] = $activeRow;
|
||||
|
||||
// Normalize row--results in the first term being 1.
|
||||
$firstTerm = $matrix[ $activeRow ][ $column ];
|
||||
for ( $subColumn = $column; $subColumn <= $rows; ++$subColumn )
|
||||
$matrix[ $activeRow ][ $subColumn ] =
|
||||
bcdiv( $matrix[ $activeRow ][ $subColumn ], $firstTerm );
|
||||
|
||||
// This row is finished.
|
||||
$isDone[ $activeRow ] = true;
|
||||
|
||||
// Subtract the active row from all rows that are not finished.
|
||||
for ( $row = 0; $row < $rows; ++$row )
|
||||
if ( ( ! $isDone[ $row ] )
|
||||
&& ( 0 != $matrix[ $row ][ $column ] ) )
|
||||
{
|
||||
// Get first term in row.
|
||||
$firstTerm = $matrix[ $row ][ $column ];
|
||||
for ( $subColumn = $column; $subColumn <= $rows; ++$subColumn )
|
||||
{
|
||||
$accumulator = bcmul( $firstTerm, $matrix[ $activeRow ][ $subColumn ] );
|
||||
$matrix[ $row ][ $subColumn ] =
|
||||
bcsub( $matrix[ $row ][ $subColumn ], $accumulator );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Reset done.
|
||||
for ( $row = 0; $row < $rows; ++$row )
|
||||
$isDone[ $row ] = false;
|
||||
|
||||
$coefficients = array();
|
||||
|
||||
// Back-substitution.
|
||||
// This will solve the matrix completely, resulting in the identity
|
||||
// matrix in the x-locations, and the coefficients in the last column.
|
||||
// | 1 0 0 ... 0 c0 |
|
||||
// | 0 1 0 ... 0 c1 |
|
||||
// | . . . . . |
|
||||
// | . . . . . |
|
||||
// | 0 0 0 ... 1 cn |
|
||||
for ( $column = ( $rows - 1 ); $column >= 0; --$column )
|
||||
{
|
||||
// The active row is based on order.
|
||||
$activeRow = $order[ $column ];
|
||||
|
||||
// The active row is now finished.
|
||||
$isDone[ $activeRow ] = true;
|
||||
|
||||
// For all rows not finished...
|
||||
for ( $row = 0; $row < $rows; ++$row )
|
||||
if ( ! $isDone[ $row ] )
|
||||
{
|
||||
$firstTerm = $matrix[ $row ][ $column ];
|
||||
|
||||
// Back substitution.
|
||||
for ( $subColumn = $column; $subColumn <= $rows; ++$subColumn )
|
||||
{
|
||||
$accumulator =
|
||||
bcmul( $firstTerm, $matrix[ $activeRow ][ $subColumn ] );
|
||||
$matrix[ $row ][ $subColumn ] =
|
||||
bcsub( $matrix[ $row ][ $subColumn ], $accumulator );
|
||||
}
|
||||
}
|
||||
|
||||
// Save this coefficient for the return.
|
||||
$coefficients[ $column ] = $matrix[ $activeRow ][ $rows ];
|
||||
}
|
||||
|
||||
// Coefficients are stored backward, so sort them.
|
||||
ksort( $coefficients );
|
||||
|
||||
// Return the coefficients.
|
||||
return $coefficients;
|
||||
|
||||
} // getCoefficients
|
||||
|
||||
/**
|
||||
* Interpolate
|
||||
*
|
||||
* Return y point for given x and coefficient set.
|
||||
* @param array $coefficients Coefficients as calculated by 'getCoefficients'.
|
||||
* @param float $x X-coordinate from which to calculate Y.
|
||||
* @return float Y-coordinate (as floating-point).
|
||||
*/
|
||||
public function interpolate( $coefficients, $x )
|
||||
{
|
||||
$degree = count( $coefficients );
|
||||
|
||||
$y = 0;
|
||||
for ( $coefficentIndex = 0; $coefficentIndex < $degree; ++$coefficentIndex )
|
||||
$y =
|
||||
bcadd
|
||||
(
|
||||
$y,
|
||||
bcmul
|
||||
(
|
||||
$coefficients[ $coefficentIndex ],
|
||||
bcpow( $x, $coefficentIndex )
|
||||
)
|
||||
);
|
||||
|
||||
return floatval( $y );
|
||||
|
||||
} // interpolate
|
||||
|
||||
} // Class
|
||||
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,91 @@
|
||||
<?php //0046a
|
||||
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
|
||||
?>
|
||||
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
|
||||
It0=
|
||||
@@ -0,0 +1,132 @@
|
||||
<?php //0046a
|
||||
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
|
||||
?>
|
||||
HR+cPveZRTP8a5KQ0VxuzRwIJZvzhs0w4tsqpTTelHbfwzDZZrL1m8mUzZMz8SjJiEs8Vvf04O/C
|
||||
vYmzuOYEPBHz35uWSGYQWfCSN7miPuHxPpVDZHxcS6BTnevJJMEne2Zr03AK0TaPNpWGPohiba4j
|
||||
xzfBn5DqsXvxerYmTYmcsGewToUuGp3mX6ljbzgJiNIm6JxeJxpidq3BxUbhW6XVKhCp2acJrLZo
|
||||
lmUGct38P7vKQRhXB8C5DwWlttocsYU1mk5zozFyN9AVOWl9jec5vaDiEO/4YNwFE23RbDa9239w
|
||||
7ACr2chgEG1p4WVqCDLl2umbc/Vjd7pokvWAOQsRWqJ5v8Ua0crQAp6q+r3pNRQnq14jCjqUIC+M
|
||||
8eqh2mVfcIfX4D/Oci6T6VJkaFTeVaTomDJrBeGoze78Jegyo2Pz1/GNPuju/nFXaFPlhykL3q0w
|
||||
0vRjMQLnZGq1yTRL5+A37NrHq7wHd9c8Le8G/kWn+33rFuosgEQtE2YxFZZutHysGDbAcV+pjY6P
|
||||
YU61JT1DCsJy3BXGDyMYEtAPgj7wpOAe+3ltT1khEu5yTJ14YtxW3ZZefCwTnjhQKIkKtJzQHPM5
|
||||
J7ehEstzsbqJaNBYWbCaq1DrmnQI9euYZnb9/te3Soj9qlAXsXTE67vXNgX13BNymJPs5X+3Dnix
|
||||
jtaaLxgoh3J2c7fnOMpHrhKgRyR+9uH2uTzfzviBgOiifnAcJVwDB9Jf98Si8WZJFQvucNn6Z4gG
|
||||
i9y6rB9EyDi3Ca/nFMPaqQVXHPRJNUQ6WFiDQgYs+QPrUhraRD2J037ZgEqfB7pQOw7iJccYpdmR
|
||||
rHioy0pyecPyXWYPWKv6vmxo1vXMq5wyyE9DnadLCfGM1IzyMiHSKLFK7L0/91TfYQ20zhYOzF2p
|
||||
D0K6wxDx1QRJAo3dm+RJt2mKwRDmZmy3OgI0cPiJWzGhCG9R9IVveSgqdpq1Pas9egg6HBix8XV/
|
||||
GnlyHYjl7Q4MQM1672jlOZgidLSdg6j+Ho54kstJeSiZdQcVrdNWByItASecG/WRtlXQUA7vlCw6
|
||||
5+s24c5/w3EvYqUVHwsfVjT3KL/2di4VYTJYWyBuAey+OK4oWNOXWY9zXggh1jG1CjGKKQhrfDgF
|
||||
jplS+K0/uyaD1suD9QaVt0o62M4DJZJnlOndcJg+iSj42mylqqmb8Eusb2PWNNoAzROFBQuAzQFX
|
||||
Nl4STYHx2Bz5eO8Zgyv5l+A03uquYksXrbVQW0xy+T1t7p7mkSIE+8RgrYY2vac1MIdl92MNHAc2
|
||||
Yb8Mk+rQzqUM8Lzz+DVZpcLFZGvXbqcfjpPdNbuiyN6uZ1VTpNvB3wsykHSf5T9MlWbWWxPorqjI
|
||||
vwMDVotE0FFCgae/g/IEZTwCR+K8r+Wf6zndGX4PBYAhiRon1KwFRksQJhkdblznLGw4wt3M5Oja
|
||||
qQ8sjmKYZl1Rdb5m4fcVR88JG8opckcxvKIjd/Amt91OL8qxSJWugornoVC/dMZe/aeBJ+pA7fA2
|
||||
zzwZ7MA66Hxlr70Z0etbkPyjXSd4Q2KSJTw8XkD5qEQji7kJLfy94vx7o9W32dqK3AhpW7JQSzax
|
||||
TxcT+yhVpVvbaUDL+dmkb8fZQGQzZMhnyFWYKyEeVgx3NFNkOzeKejAU9zPu/1nMO5rKsa5Sfyoa
|
||||
oiFdk2WtwjHAhHzYHoa6c1cfsGHgDc/WcVg7FGFFmD+chCmB345jIVSc4Z3o+nPeIXX7Bx3tsvte
|
||||
MMw8X5pr9JG4gTSB9SOBlxfysMuK4hiHIqvwIeVgD1CpOfoVPnLZYSrdzcHc6Vf5wK740wWYzOai
|
||||
Siimhi5kL+kIRnAsKw+Mc6nzScf1nDhikcOT1XISew+9CoIAKi2m3nN8qhjxkLx++X1bJWBecZku
|
||||
+ZqZ6RmlUuuT3S+D0CtqONRFI1ktL6UnUAdj2MnFbYXVPQ8qS/vNEp8FMbBixUd+HLcj5ckWR2p8
|
||||
d6DQ1gyJCdNA7PYAKPS56HG1nCMStNXRlZR1ddBVBN1Xh7cuoZZ/Fgiai3u5hgMgT1g7DT0fRdDF
|
||||
vI+RaGiAi58kcII1oe+RKr1qj6UpMIRuPPDEwE34RgSlp//eC8AyjWDSa1FNblU0JBc7CF8Q2wHZ
|
||||
1cbt+qDpXKAsryVKfnjcOd1g4OHCIg0Wjnjmw9Uu/9l0Fowcj03/+yxQxP3cR01vjYFNpuKhuyvM
|
||||
l946pHdbsi7ef0TLTeLKIy4DAqoniZMY0hMSKGHSJyC3+TU2f6d5TkEPy43iadzZVOKOf8uGexsO
|
||||
Nw1XAGg2ZTc8//BPuBilaLThL2EvlTFdwZcJRzDCoDGL5Px06BFSa0K7HU5cekE7KByTsNZWCdWb
|
||||
bcgfUAzNMZ/sR//WjbOlkGmHa8p+QUKlVBKSD0xwk4m+5/Ql9Pmhl2WDfdgCFItpqVFvWaRpGiwQ
|
||||
5EVf2onWw9tlffvVmjruV8bGiPX/zL7Zpm+e1hHdoqbTwexGVFIOmyccpf2Y7s1X6AjhMNukoAb3
|
||||
HOmFmqhdTH9KdAqPTry+QN/jX9y+Dc8TXDW8XHNkd/ndjjtiGh5IRe5kgUloWfcqRLJ4+vbCN919
|
||||
j+kGKb4D6X9fX9XeYx8cz1Sn7Sw84Aq0KqT6ZmJ7jEpxFPl1JwLM/wA2tjKU5HfrHDM+uwcNW8H5
|
||||
UaBQarCAdS2qliyrkzzJWDI+juwQ8yTy8kHN2uyHgvbAyZh9XTv3G0sB49HQm+Krm1f2J6gP7k+u
|
||||
5GzrLN0IC5tE0CfE+bFCwCRfEYm4Z7HvN2QebQVXVqRMBqAslOFme23Kym13M1U3e0Y+664PxBS4
|
||||
S9kBkY8F7FcyDA1vgVD460WINYkA94JjiFTm048hXOWwUPIaXuyjLuKbihFRjFi1NkD/MoxnIvkl
|
||||
7MWwwPinu43udQR8rulfdMhGMEQE1JRTUOcCnKu3k/FJRct+q199Glr3wOGGCY2kAid56/vFGV1N
|
||||
BLSfld9G20cWRyUEFoPB7UsV4PBuI17yUGmjI4/gvh6qgeoW8OUuyrwFB6MjesN7RznEWqjXM5q/
|
||||
f5WQKPE0TD8XhETv4J0DXvB5D0im1WdcsyOlxv2b7omzlvW+HR5yFuYnipvQ4oIcWxz6ZUkQOqWe
|
||||
vI96ceGwi/kXL9UF9K2mNZWhqPygMxAgWkHi+NIIKPHnQEXIXkIY63DGFwA4B1VtJpEIS75xyQxm
|
||||
9+IVBXoCgvPkVJtZE3cwOw3/CV3WWRNEpkRISlvWHIqRVs7nnhIeANDtSqgKakrFYvtdVCkCe3Od
|
||||
b5gfrCfieciMPqU//uXQjNL0MQ0+/5igbQG++65UsMN6oRtLJRkgmpMxnWky3Yw0Xjv7hPsbruzK
|
||||
SbFu275GjzQghlEjpEbguFg6Ha3Mo8fpcn/MCD7Nstjl3s4CE08drHj7e09anApckO/22m7XVt8S
|
||||
wMluBorZ5uQDTKqujhQrtQmjqCuTH7AIqRj99Cx2TMDU/OxEcsY+ygTyoYR0aQuWlwWTgKFPm3zu
|
||||
taOb8TB9985t7IV3J31stGS2ebzNUG2BTH6VrwFeaRszDw+byke6O6YS/RJMdUfkn1Cg9rbb3YMV
|
||||
Eqeuo2iGBkuI5F9EtSLh9y7uHNfSiH44ybIDZkMiV+0YkhsomYTsTGwxCb3JkolUi410XX1+cVkw
|
||||
QRYA5NPJbdEXXGRpqGWni8zZfqggo48d3ecnCf+j/z1sgW6lXprb2MvkDGrlMXj42NDWQ/q+otJY
|
||||
oipgQpUbIp6MhP5XxkNZbVcAp9gyt7t4blcTAeoWamoFVmUp0H/xclUKvQEB3v4VhEBcflp+u8mq
|
||||
+HzRmqPM1mXbbVGpA/1VlMXhHzZfBMoJ0dMOUXOYiyVH7D9ZzCQh4daHAEMPulpjJMuVFmnTwluk
|
||||
TbNQtu3inRbtAssNSQLOegoXArjHEwYTLACg/j9w7JLHm9E4t+7z2VXl8lULnZhtTLGUBpdoj1m3
|
||||
bK5QBw05njqavXXNt/wcjZ/NCIrlSY4IyK47fTvQ6WrYZ+AMBgpNTeHhaS67Q49AyWED4GUDvGLB
|
||||
BK3E3WF0BaSYMv54BCNUit4bXApiyZAC2rLeEqDzClZew/3PKqIwycnVTWjvJTcFXCckXM/jr8aO
|
||||
bJMONs/7yWLx//gG9iovSOzgDnZ8roYTFTGNHU9vMNaSVh7YFzLuOkLhA5CgegCJw3kwdLgrh17Q
|
||||
aiXHlFis6Mlhqo1Nhm3sV0WU5wiuDfcQPfrkVsSNbOn8Tv1vRJ3XNZML8UmzsjGHycOMp68sIE3K
|
||||
Y8tBNj7oBMzaOLP8Y/QtxzNyfkkW3bnSeF4lUE+xFLhbwX+jXl8nykcIKiPZLblBLypqjfsLfPng
|
||||
iTr74ZEzWB5gRRIQ0Q/5HcknJJBofYOCScxSKxbBM2cw3nhJTwM9RnXrE7OHbegzCgAguezExYVZ
|
||||
OR/b2K8mVCaDpWd59gM6/MSfSV8e4CeVTvB+xEfS16ZDIx1eiJV/tFPwLC8ddaZfSHHqMPMvzHOJ
|
||||
fvO9iGATfkngSLuEpY68Jku4gq4XjIWppJZvmyb2OeQz+rgZ3a6EzgxK3nZTBORhJe19PmEm/AfY
|
||||
h/fiW8iVNO7vYmN95+OHfGgrPSnQl+fSgNBZTMyLsIZK4Hk8gqhJcXzZ/lHFzN5FRQUwNxrIzM0G
|
||||
O+KWzH0FVwwnl/45wXTAROm+ZNOtDb43zCH+R6wCfN+DNj/KmObLNJzFwpLFxwoR7obtQvlLL0tB
|
||||
5Z9k8whA60W8p3uWw7QAv8DRTxwI3SEBfYFWpfzZ/9690LyCt3luZV3D5wln5vYvCzcwepcsJlUa
|
||||
OvgpHtfK5b97TV+LjI5dJRxVNyFffwWB6gFr9Hn11q1fC0FMoRBK2MXfZ9xn7FDyPdQpoi5PtFny
|
||||
p8lYuu5igmIr61VNFJtECwhMNdStaO1ttRmopm2/iLJ6qUl+eR/Msle8oVMu8Vv3jjQGD7mjcqTO
|
||||
At5tQJF504IXol+RMp7NHouHvr7m/whsQKTMvcz3mWvP2nUEMfBYPkmjWsBW9aSBJhJkMc0W3Qvv
|
||||
1sM4kHDGwalcUqrelz9Zs4y6Ijm7d5h+wyLtWDqs0xMbFWPHZnq0tgIF26+J+GMBpy68Dzqv3ddr
|
||||
q97lprsYA8v2RCiKdfhkZfFFsRSfHd3nf0ODZjWwizPldHVonle4/se1HK4PnEldmRORXO+C4T7w
|
||||
0a0N2AmBvj4pVXTU1uvPPxRFBRI5RcQNnWqBi3CSwhy1cYNzEnJOHxcEUii/z5OS5ztrg73fkaBr
|
||||
8OTI+2c5do6ZqA65qcsyGYixas+rLX4hATishSK6iV2Uu30Tv/0v5aA66fDFJ6CjpRkeSOq+mKqt
|
||||
rsNIBv49gZD34CX6C/p3o88QSlMEmtSputXTLpx3DzGNpDnXQfe0L8IgI5YwlttzTLc5qp9f+IIr
|
||||
D1NpaqvazmiTro21McKMfRL/sDJlUGBfOvV1BgiCnZZRQXvxpPZ14N32wMIUsdcCh6Duoq2gIFo9
|
||||
qkrAAnUV69AJmdx/fqDxzjWbelqH3XmM4BJpN6ZxSwez5UEa/qlFUgX2LtSRQf9t2H/tWPIx4Ft+
|
||||
RlXw6kP0qhObmrfEYDkltK6nwonRH7SrLixc6PRG815ACVL0pdVAmIWbv75q4krBaNd5q89aGhvi
|
||||
XAXG6J4zDvcUXvJkU7xI94j8KBgyV1VLPaB8zLOMS1wdnbCl5SaLEcgRWjlPrOrWzo1LL3TiihZu
|
||||
IEiJkWf2FyvQQOYmAoKXhiIllC8atoD0isWZuQ/NicRxd+2Z2ZVkvSqtMNT/qoRqsxD9zAnN0BIX
|
||||
QnQ+mTskcRIVNZCZEStNs7x4SE+uD9MEijYELOBUv2/RMQRFugbZFLQHhBiNM6NR3C9in+yXZ+1c
|
||||
XUKt+L4XCIJumM/k5zrDq99QEPT0roaVjSjBTUSqz9RzkB64JZH/pD8WgGqMblFHebdcVVLnPqPQ
|
||||
mcpF9G+mFWNHIKrdtfstOw9Dr2z+nnTFMyP/jMxZYD4l1wPnDLAm0BhWKJ3PQ0eip6boGHK8iZz4
|
||||
clDudRh6fd5dCngx1NeuG4dXeQfGbcEEjYoeGW29x7xv9/9obNyPwQav/BU0T/35BYkU75r4skKM
|
||||
qIsuNRJnVp4GTSgH0NI3N9W8A/yEA1q33J/IVO9Z+5Fa2JHOSwqRDG2oQYW63wXa5ujITfZx21Lj
|
||||
E/EV81KpdVQ3EXe5ZR3j1wrTw6tcw2eaYx8drKBsBJD1UL/zKsV46cPLMgamxxViHQ7e5L3P/AsO
|
||||
ZbKDIhS02Y7QmLrLQ8rV/3CvAtA3+LV77Wgssqi/POP4pcWC5V69tY0H9gCQyn3N7C0CcJ940pkN
|
||||
aut2FhmR61rEjiLMhvmv54HtLzVXjXsmRg5G7yfUm3O12Dq9vM+E/Ltiocoh+2XHgRiKbQ4pbSrt
|
||||
T1/v/mUYDpIEuJWatSmxWSvuxRSwQOLvEgCmmvi90L94Pf0C/RPP6MeDY0SMK2kXmynv1Co+4vAu
|
||||
0kg2ruJ75hbDOFltxc0+E0yk3cNg8rYT+ISMRqc7o/u+8xthSAr8CAWE/AfX5CRxQGt/9gIHSCBf
|
||||
s+0mht+F++2xaJ1VKsHvPVZ1yXMWeuBe3vMg9f6oLfomExbqsICUlGQgvCRYmrwhcM6tHKvjIk8K
|
||||
XaTdpX8pY7PsS7z2JH2EFv6rxUk+E4dpo/MzN7HmR+dWQgo9u5SVb5rpceGUSCY44jpPPx1Xh7US
|
||||
dQDFDD/QIYyd91y1sllrdaVLhMkEBVdcHs6AhXAf/hVphD7QCPdlWkNe7euxAjZaDNqZ96UsMC/9
|
||||
8qz5FRPSATFoX/PSivWUN9z+ghCFJ4M6r+5/sw6tBJr5lRXirm9WbsSCHQExdXmEz64x6ExiDQ9Z
|
||||
m8zhEDVaQr/6psa3xtxIK8A0OE8jAV/LkDWYY5NW9r+ty+uO/A5Ln4bwHbKbqMJRCXd8tkPCtvBa
|
||||
+Ktreo7UI/7SOzeRZ7rI2d+TYWEj5OnXB85C6Y8ATFaw1OA4lbEro5adp7fKXybVq20uaVNnj6RK
|
||||
/KXWg4SiEiEc4xjzX68/agIY2ZYMAmMQodmjOL9YzW1eeL8cMS1F0a17rX5AIImI5476m5lgZik1
|
||||
CqGLKuVDa3RHuI6EC58QkAFKzTZj21yB2ItEq4E5KQTN2rhG9jIL7OC6qWV5kBpBZ1TCs4cbBNdB
|
||||
N2jBSjQAlnBbPcX5dWbfsysUidBuC7InVT5NDhb+rj7tEUEaVZXbuIIX2hebn6t5QPa3/tVlezT6
|
||||
BTzo9Yf79BRprWEnjaMDE9116JqwTXIcQt90AVZmFoF4Rf4kmp50vWKHamaAoWM41ORIkbvfvg6C
|
||||
uKsoZX7HWwF7wlcGoVC9KYEmsGgU+wo3aOBiHi7Q0nNZFWXzCjb5HQhGBUruKtOYVdgKYMhwstXH
|
||||
J8Wtn4lqEkcGBxYS/n1wf0KdU0IihajXrE85cHMSgmlFUahvWdQhk3CgypBjfijwmonJiMeSrFO5
|
||||
ZcYbLo/hwF/uytaSyUp+rOCDQcEdNTZ4U+pW4Rp+UoztQuLH2LKty4YWVwJcwtd7pOjhbG3KkXyF
|
||||
3BKSTKiqksV4ORHE17OGHdtI50iutWt/VjAwcMTBttmuPg3+dcnz5p5v6QOpxJcOmQHTiPPNEvO+
|
||||
jTdLFoLFSg/vGUkQbQcZ/RSdZwEN9qumkfyVdHZ/dAfgJnZPOJExL8MEhr7FRHdW3kkupSrVropl
|
||||
kferZXU6DhPZE8uEmuuQAVazmnuxO471s467vMjB/N2EAwkLt5A7R836RowFw4ZeP+9NfD0muJO4
|
||||
q1eP7hyAEcbUSB1f2apC/K8Gzx94CmjED2P+Vn6j2Si27WYG2RScnQEk8BDc//vZJDEQAveNWpU0
|
||||
iqQ2QRlgUsCe2V0VL+M+77izgyY4tN7wJryF5QD8qZGWsZFBYo4CTbz5a2/mDWD7s8c+EnZc11oK
|
||||
kgiEKoCVJH7DlRPnNyseZnJ7GvER+HZcs7DyXVrkCV8PqM/OEj+Ct1AbAHVW66EJmlKG2qUYDohs
|
||||
SrumdomSSQZuXtfNJ0Oa+rd/1yTo8hx9hckbi5t6fzdNROquvxaeTwbyVy2VbwL80PcFINDxqq0C
|
||||
XZwSlFsSpOr3cdotxq6qgAKlvILLHCkywxe5OrZqiaaNafrbC7VtziV8bOH8vr28VG9Fd5jXojVk
|
||||
leYBYeJ2XsJ0qvtB3ZFMnU5yOXvZKAhW9sXjRUoBqBHHk0WOIa1KzIJ0YuTfFQaNreZp2a1bfWk4
|
||||
zOVrf7fjbVdlGhC48Uc/xDqOdtVEY5Xk53KqXyiv+KuPx8xbAk6BlsmROfWZerlOUo/E/wfU4647
|
||||
0kWIYrhWuFLJFiz1tl3bwxICob58GT1xa2YGvUS3/Wyws1sxSU0Jm+wzdA4xEWtp6k7YoiKS/kjl
|
||||
mhjp2pP8ssEiwd2EaAl0XWePBzMBFkHUXM3NsDQ1SoaCDqDEk1SNmvo1saw0Nh056vJBJtVaxnDl
|
||||
hMxAa85Ruvm1JdohkrB+hFqB2dCmxo4WHI8Y4cl1i8yHYtyKBVgHdKhlt3JumbdoCtIXRAUDQY8t
|
||||
+iaah9xKQnp6bTkxzGunhy7L1PiVY8h9KIFHe6lhCfBDCGgV/3l02XQQEpiPgTz6idoLOBg/rdqM
|
||||
NGR//mTorq0kjt8gf36DYL0wnaHQPzRmaOwCT9Xc9/6/d4COhMuEY7hw13fQTbyIKAso7Z2ZYbC2
|
||||
5IeUVZYvkjBiYRhzhUABUflkxAM77rF0C22zPO6yGfn1jo5Keq5TkK8VIMAJv4ZmWsL4e/ITtsfH
|
||||
IYRzGxW3OXBQ6ftF6CAJDVi/L23lt73lwPdtCvHAHRrVaKRwfJ/vCH+/nsPfq3q4nxNl5qXAvFnO
|
||||
BtRe6oYXTIEHYDrgZW8bctAzOGcZwYuK0BOz/JVT5qf/nQ8sW6zsqLXlwciSbayek+kMFgYN/suP
|
||||
bUJAqKbgMItZu/vmu0ZFt+BU5+HPC567T/gGRIBb20R+AQ1Q1o68r6FFtJgn6JgOFsWDLXouB3A3
|
||||
zCnvgSaG92SqhGlZU+xqZqZp9K0PIxH0mvq5CphEbb+Nh0xfQUtCf/0INOrG6cXyDeOlgVlmRhhE
|
||||
nXuRMLzgJWDl1b3E+lAdiH1sWPsKmK7jFqMomBwXsxVG2OxGt5h/QpKx8eoSdEQtl3+AoxgISPiA
|
||||
hokdQvM5vXg9v95dwCdh4BDrHGWhybUPbS+f1xFM3qtuj4NoICqiteWjyrVTjygo2rWM+rJves3g
|
||||
z3HRmUFjzIpGFzPryV37sPjbZfeUW+GK3tCMQthfo5jwWkZfqvsxO9IWTHYOHKB09XnL+C6plt7C
|
||||
wm0nFSGNvuidB2e+K4LUnNoOHjvfoH+eMtPh8vjCgiNKlp/GufSiT8olqdyDYjSPTtF6r8EMYX3B
|
||||
Z5ZSnNPwqRtl/mmTkrj5O3q6+klNZxB2MV51DTVMV+jRGn6ZdlGthjFoHJgd2S1F74ax0gwsDNkM
|
||||
/933DLGRMo8CMxHEJCvI7mM2nh8fveWC/5pgKB8SE9zP6P7wPLbhfWot//XoMYs5wY0lqjwyCCb3
|
||||
CwZYsynQyFqKGRvK4yapkhKKFKNOpCWXyd2cod1sEQMpvnr5QJ1s1xtkk0D2V80UVyc90ovHr59m
|
||||
I1qKm32ccwA1ut7mZiYDNRJtUCM6C9UulQwry2CL1TqqrtJTCFniA1BNJ6js0C2r9JAgFoOBs/ik
|
||||
XwepY7V0wPLxddjLwK+Gqn1oD4oI1z4rYF9jl4BR9D1iV6Abc6ysBw5NFqQL6/oPx9FsFiPtgr9G
|
||||
+PLtFKlLdobETA9oWOOtdcJ1y7Nc54i/cwS9u7WdqYzN5sg6huS95K3MvNzvkbptsQ/wvlmf
|
||||
@@ -0,0 +1,90 @@
|
||||
<?php //0046a
|
||||
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
|
||||
?>
|
||||
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
|
||||
@@ -0,0 +1,623 @@
|
||||
<?php
|
||||
if (file_exists('./polynomial/math.php'))
|
||||
require_once('./polynomial/math.php');
|
||||
else
|
||||
require_once('../polynomial/math.php');
|
||||
|
||||
|
||||
|
||||
// Eta
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createEtaChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0)
|
||||
{
|
||||
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwy�sza� warto�� dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = $max_XVal;
|
||||
$max_YVal = 1;
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'ETA');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 5, 5, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
$step = round(1/$wspX,2);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
if ($i<=$pupData[2]) $color = $red;
|
||||
else if ($i>$pupData[2] && $i<=$pupData[3]) $color = $yellow;
|
||||
else if ($i>$pupData[3] && $i<=$pupData[5]) $color = $green;
|
||||
else if ($i>$pupData[5] && $i<=$pupData[6]) $color = $yellow;
|
||||
else $color = $red;
|
||||
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $color);
|
||||
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
|
||||
// Eta
|
||||
// site 401
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createEtaAssesChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0)
|
||||
{
|
||||
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwy�sza� warto�� dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = $max_XVal;
|
||||
$max_YVal = ceil(($max_YVal+($max_YVal*0.1))*10)/10;
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
|
||||
if ($qVal<=$pupData[2]) imagefilledrectangle($im, 40, 30, 40+$wspX*$pupData[2], $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 240));
|
||||
elseif ($qVal>$pupData[2] && $qVal<=$pupData[3]) imagefilledrectangle($im, 40+$wspX*$pupData[2], 30, 40+$wspX*$pupData[3], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 240));
|
||||
elseif ($qVal>$pupData[3] && $qVal<=$pupData[5]) imagefilledrectangle($im, 40+$wspX*$pupData[3], 30, 40+$wspX*$pupData[5], $imgHeight-30, imagecolorallocatealpha($im, 0, 255, 0, 240));
|
||||
elseif ($qVal>$pupData[5] && $qVal<=$pupData[6]) imagefilledrectangle($im, 40+$wspX*$pupData[5], 30, 40+$wspX*$pupData[6], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 240));
|
||||
else $color = imagefilledrectangle($im, 40+$wspX*$pupData[6], 30, $imgWidth-30, $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 240));
|
||||
|
||||
|
||||
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'ETA');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// rysuje pionową kreskę dla Q
|
||||
// ========================================================================================================================
|
||||
//imageline($im, 40+$wspX*$qVal, ($imgHeight-30), 40+$wspX*$qVal, 30, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 5, 5, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
//$step = round(1/$wspX,2);
|
||||
$step = (1/$wspX);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
if ($i<=$pupData[2]) $color = $red;
|
||||
else if ($i>$pupData[2] && $i<=$pupData[3]) $color = $yellow;
|
||||
else if ($i>$pupData[3] && $i<=$pupData[5]) $color = $green;
|
||||
else if ($i>$pupData[5] && $i<=$pupData[6]) $color = $yellow;
|
||||
else $color = $red;
|
||||
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $color);
|
||||
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje kropk�
|
||||
// ========================================================================================================================
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$polynomial->get_y($qVal), 10, 10, $gray);
|
||||
// ========================================================================================================================
|
||||
imagettftext($im, 10, 0, $imgWidth-60, 12,$blue, $font, 'Q='.round($qVal/60,3));
|
||||
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
|
||||
// Eta - stacja pr�b
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createEtaTestChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0)
|
||||
{
|
||||
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwy�sza� warto�� dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = ceil($max_XVal+($max_XVal*0.1));
|
||||
$max_YVal = ceil(($max_YVal+($max_YVal*0.1))*10)/10;
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
imagefilledrectangle($im, 40, 30, 40+$wspX*$pupData[2], $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[2], 30, 40+$wspX*$pupData[3], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[3], 30, 40+$wspX*$pupData[5], $imgHeight-30, imagecolorallocatealpha($im, 0, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[5], 30, 40+$wspX*$pupData[6], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[6], 30, $imgWidth-30, $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'ETA');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
$step = round(1/$wspX,2);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<=($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $black);
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 7, 7, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
|
||||
// Eta - wizard (kreator doboru)
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createEtaPumpWizardChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0)
|
||||
{
|
||||
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwy�sza� warto�� dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = ceil($max_XVal+($max_XVal*0.1));
|
||||
$max_YVal = ceil(($max_YVal+($max_YVal*0.1))*10)/10;
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
//$bool = imagecolorallocate($im, 185, 0, 0);
|
||||
$bool = imagecolorallocate($im, 0, 128, 255);
|
||||
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
imagefilledrectangle($im, 40, 30, 40+$wspX*$pupData[2], $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[2], 30, 40+$wspX*$pupData[3], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[3], 30, 40+$wspX*$pupData[5], $imgHeight-30, imagecolorallocatealpha($im, 0, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[5], 30, 40+$wspX*$pupData[6], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[6], 30, $imgWidth-30, $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'ETA');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
$step = round(1/$wspX,2);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<=($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $black);
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 5, 5, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje kropk� + opis
|
||||
// ========================================================================================================================
|
||||
if ($qVal>0)
|
||||
{
|
||||
$qyVal = $polynomial->get_y($qVal);
|
||||
//imagesetstyle($im, Array($bool,$bool,$bool,$bool,IMG_COLOR_TRANSPARENT,IMG_COLOR_TRANSPARENT,IMG_COLOR_TRANSPARENT,IMG_COLOR_TRANSPARENT));
|
||||
//imagedashedline($im, 40+$wspX*$qVal, 30, 40+$wspX*$qVal, $imgHeight-30, IMG_COLOR_STYLED);
|
||||
//imageline($im, 40, ($imgHeight-30)-$wspY*$qyVal, $imgWidth-30, ($imgHeight-30)-$wspY*$qyVal, IMG_COLOR_STYLED);
|
||||
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$qyVal, 9, 9, $bool);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, '(Q='.round($qVal*$m3h,$ilosc_po_przecinku).'; ETA='.round($qyVal,2).')');
|
||||
$xPos = ($imgWidth-47) - ($right - $left);
|
||||
imagettftext($im, 10, 0, $xPos, 17,$bool, $font, '(Q='.round($qVal*$m3h,$ilosc_po_przecinku).'; ETA='.round($qyVal,2).')');
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
|
||||
// Eta - pompy stacjonarne
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createRoomEtaChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0, $pointColor)
|
||||
{
|
||||
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwy�sza� warto�� dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = ceil($max_XVal+($max_XVal*0.1));
|
||||
$max_YVal = ceil(($max_YVal+($max_YVal*0.1))*10)/10;
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'ETA');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 5, 5, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
$step = round(1/$wspX,2);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $blue);
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// rysuje kropk�
|
||||
// ========================================================================================================================
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$polynomial->get_y($qVal), 10, 10, imagecolorallocate($im, $pointColor['R'], $pointColor['G'], $pointColor['B']));
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
@@ -0,0 +1,839 @@
|
||||
<?php
|
||||
|
||||
if (file_exists('./polynomial/math.php'))
|
||||
require_once('./polynomial/math.php');
|
||||
else
|
||||
require_once('../polynomial/math.php');
|
||||
|
||||
|
||||
|
||||
|
||||
// Podnoszenie
|
||||
// site 401
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createHpChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0, $point=0)
|
||||
{
|
||||
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwy�sza� warto�� dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = $max_XVal;
|
||||
$max_YVal = ceil($max_YVal+($max_YVal*0.1));
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
// $font = './fonts/calibri.ttf';
|
||||
// $fontBold = './fonts/Calibri_b.ttf';
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'H[m]');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
/*
|
||||
// rysuje pionową kreskę dla Q
|
||||
// ========================================================================================================================
|
||||
if ($qVal>0)
|
||||
imageline($im, 40+$wspX*$qVal, ($imgHeight-30), 40+$wspX*$qVal, 30, $blue);
|
||||
// ========================================================================================================================
|
||||
*/
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 5, 5, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
//$step = round(1/$wspX,2);
|
||||
$step = (1/$wspX);
|
||||
if ($step>0)
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
if ($i<=$pupData[2]) $color = $red;
|
||||
else if ($i>$pupData[2] && $i<=$pupData[3]) $color = $yellow;
|
||||
else if ($i>$pupData[3] && $i<=$pupData[5]) $color = $green;
|
||||
else if ($i>$pupData[5] && $i<=$pupData[6]) $color = $yellow;
|
||||
else $color = $red;
|
||||
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $color);
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje kropk�
|
||||
// 0 nie rysuje, 1 - zielona, 2 - ��ta, 3 - czerwona, 4 - bia�a
|
||||
// ========================================================================================================================
|
||||
if ($point==1)
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$polynomial->get_y($qVal), 10, 10, $green);
|
||||
elseif ($point==2)
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-28)-$wspY*$polynomial->get_y($qVal), 10, 10, $yellow);
|
||||
elseif ($point==3)
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-25)-$wspY*$polynomial->get_y($qVal), 10, 10, $red);
|
||||
else
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$polynomial->get_y($qVal), 10, 10, $dark_gray);
|
||||
|
||||
// ========================================================================================================================
|
||||
imagettftext($im, 10, 0, $imgWidth-60, 12,$blue, $font, 'Q='.round($qVal/60,3));
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
|
||||
|
||||
// Podnoszenie - Lift
|
||||
// site 401lift
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createLiftChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0, $currentHp)
|
||||
{
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwy�sza� warto�� dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = $max_XVal;
|
||||
$max_YVal = ceil($max_YVal+($max_YVal*0.1));
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'H[m]');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 5, 5, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
//$step = round(1/$wspX,2);
|
||||
$step = (1/$wspX);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
if ($i<=$pupData[2]) $color = $red;
|
||||
else if ($i>$pupData[2] && $i<=$pupData[3]) $color = $yellow;
|
||||
else if ($i>$pupData[3] && $i<=$pupData[5]) $color = $green;
|
||||
else if ($i>$pupData[5] && $i<=$pupData[6]) $color = $yellow;
|
||||
else $color = $red;
|
||||
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $color);
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje kropk�
|
||||
// powyżej wykresu
|
||||
// ========================================================================================================================
|
||||
if ($currentHp>$polynomial->get_y($qVal)+6)
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$polynomial->get_y($qVal)-6, 8, 8, $red);
|
||||
else
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$currentHp, 8, 8, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
|
||||
|
||||
// Podnoszenie - stacja pr�b
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createHpTestChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0)
|
||||
{
|
||||
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwy�sza� warto�� dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = ceil($max_XVal+($max_XVal*0.1));
|
||||
$max_YVal = ceil($max_YVal+($max_YVal*0.1));
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
|
||||
imagefilledrectangle($im, 40, 30, 40+$wspX*$pupData[2], $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[2], 30, 40+$wspX*$pupData[3], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[3], 30, 40+$wspX*$pupData[5], $imgHeight-30, imagecolorallocatealpha($im, 0, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[5], 30, 40+$wspX*$pupData[6], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[6], 30, $imgWidth-30, $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'H[m]');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
$step = round(1/$wspX,2);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<=($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $black);
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 7, 7, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
|
||||
|
||||
// Podnoszenie - wizard (kreator doboru)
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createHpPumpWizardChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0)
|
||||
{
|
||||
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwy�sza� warto�� dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = ceil($max_XVal+($max_XVal*0.1));
|
||||
$max_YVal = ceil($max_YVal+($max_YVal*0.1));
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
//$bool = imagecolorallocate($im, 185, 0, 0);
|
||||
$bool = imagecolorallocate($im, 0, 128, 255);
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
|
||||
imagefilledrectangle($im, 40, 30, 40+$wspX*$pupData[2], $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[2], 30, 40+$wspX*$pupData[3], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[3], 30, 40+$wspX*$pupData[5], $imgHeight-30, imagecolorallocatealpha($im, 0, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[5], 30, 40+$wspX*$pupData[6], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[6], 30, $imgWidth-30, $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'H[m]');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
$step = round(1/$wspX,2);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<=($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $black);
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 5, 5, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje kropk� + opis
|
||||
// ========================================================================================================================
|
||||
if ($qVal>0)
|
||||
{
|
||||
$qyVal = $polynomial->get_y($qVal);
|
||||
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$qyVal, 9, 9, $bool);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, '(Q='.round($qVal*$m3h,$ilosc_po_przecinku).'; H='.round($qyVal,2).')');
|
||||
$xPos = ($imgWidth-47) - ($right - $left);
|
||||
imagettftext($im, 10, 0, $xPos, 17,$bool, $font, '(Q='.round($qVal*$m3h,$ilosc_po_przecinku).'; H='.round($qyVal,2).')');
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
|
||||
|
||||
// Podnoszenie - wyszukiwarka Wyb�r agregatu pompowego (site 201)
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createSearchPumpsChart($inPupArray, $qVal, $hVal, $imgFileName, $imgWidth=900, $imgHeight=400, $xDiv=10, $yDiv=10, $m3min=0)
|
||||
{
|
||||
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
unset($outArray);
|
||||
|
||||
// ustanawia najwy�sza� warto�� dla X i Y
|
||||
for($i=0; $i<count($inPupArray); $i++)
|
||||
{
|
||||
if ($inPupArray[$i]['PUP_Q_MAX']>$max_XVal) $max_XVal=$inPupArray[$i]['PUP_Q_MAX'];
|
||||
if ($inPupArray[$i]['PUP_H_MAX']>$max_YVal) $max_YVal=$inPupArray[$i]['PUP_H_MAX'];
|
||||
}
|
||||
|
||||
$max_XVal = ceil($max_XVal+($max_XVal*0.1));
|
||||
$max_YVal = ceil($max_YVal+($max_YVal*0.1));
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
$bool = imagecolorallocate($im, 185, 0, 0);
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'H[m]');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
//rysuje poszczeg�lne wykresy dla pomp
|
||||
for($p=0; $p<count($inPupArray); $p++)
|
||||
{
|
||||
unset($dataP); unset($dataH); unset($dataEta);
|
||||
$wynik = mysql_query("select tb1.PEP_X_PARAM X, tb1.PEP_Y_PARAM Y1, tb2.PEP_Y_PARAM Y2 from (select PEP_X_PARAM,PEP_Y_PARAM from seg_pump_eng_param where PEP_PUP_ID=".$inPupArray[$p]['PUP_ID']." and PEP_TYPE='H') tb1,(select PEP_X_PARAM,PEP_Y_PARAM from seg_pump_eng_param where PEP_PUP_ID=".$inPupArray[$p]['PUP_ID']." and PEP_TYPE='ETA') tb2 where tb1.PEP_X_PARAM=tb2.PEP_X_PARAM order by X");
|
||||
if($wynik)while ($r = mysql_fetch_array($wynik))
|
||||
{
|
||||
$dataP[] = $r["X"];
|
||||
$dataH[] = array(
|
||||
getFloatValue($r["X"]),
|
||||
getFloatValue($r["Y1"])
|
||||
);
|
||||
$dataEta[] = array(
|
||||
getFloatValue($r["X"]),
|
||||
getFloatValue($r["Y2"])
|
||||
);
|
||||
}
|
||||
|
||||
unset($polynomial);
|
||||
$polynomial = new zc_math_polynomial($dataH);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
unset($polynomialEta);
|
||||
$polynomialEta = new zc_math_polynomial($dataEta);
|
||||
$polynomialEta->calculate_coefficients();
|
||||
|
||||
// wyszukuje pomp spe�niaj�cych za�o�enia
|
||||
$hTmp = 0;
|
||||
$hTmp = $polynomial->get_y($qVal);
|
||||
|
||||
|
||||
// dla podanej wysoko�ci H
|
||||
if ($hVal>0 )
|
||||
{
|
||||
if ($hTmp>=$hVal-5 && $hTmp<=$hVal+8)
|
||||
{
|
||||
$outArray[] = array(
|
||||
'pupID' => $inPupArray[$p]['PUP_ID'],
|
||||
'qVal' => $qVal,
|
||||
'hVal' => round($hTmp,2),
|
||||
'etaVal' => round($polynomialEta->get_y($qVal),2)
|
||||
);
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
$step = round(1/$wspX,2);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
|
||||
if ($i<=$dataP[2]) $color = $red;
|
||||
else if ($i>$dataP[2] && $i<=$dataP[3]) $color = $yellow;
|
||||
else if ($i>$dataP[3] && $i<=$dataP[5]) $color = $green;
|
||||
else if ($i>$dataP[5] && $i<=$dataP[6]) $color = $yellow;
|
||||
else $color = $red;
|
||||
|
||||
if ($color==$yellow || $color==$green)
|
||||
{
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<=($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $color);
|
||||
}
|
||||
}
|
||||
// ========================================================================================================================
|
||||
}
|
||||
}
|
||||
//rszta
|
||||
else
|
||||
{
|
||||
$outArray[] = array(
|
||||
'pupID' => $inPupArray[$p]['PUP_ID'],
|
||||
'qVal' => $qVal,
|
||||
'hVal' => round($hTmp,2),
|
||||
'etaVal' => round($polynomialEta->get_y($qVal),2)
|
||||
);
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
$step = round(1/$wspX,2);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
|
||||
if ($i<=$dataP[2]) $color = $red;
|
||||
else if ($i>$dataP[2] && $i<=$dataP[3]) $color = $yellow;
|
||||
else if ($i>$dataP[3] && $i<=$dataP[5]) $color = $green;
|
||||
else if ($i>$dataP[5] && $i<=$dataP[6]) $color = $yellow;
|
||||
else $color = $red;
|
||||
|
||||
if ($color==$yellow || $color==$green)
|
||||
{
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<=($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $color);
|
||||
}
|
||||
}
|
||||
// ========================================================================================================================
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
imagesetstyle($im, Array($bool,$bool,$bool,$bool,IMG_COLOR_TRANSPARENT,IMG_COLOR_TRANSPARENT,IMG_COLOR_TRANSPARENT,IMG_COLOR_TRANSPARENT));
|
||||
imagedashedline($im, 40+$wspX*$qVal, 30, 40+$wspX*$qVal, $imgHeight-30, IMG_COLOR_STYLED);
|
||||
|
||||
imagepng($im,$imgFileName);
|
||||
|
||||
unset($resArray);
|
||||
$resArray = array(
|
||||
'file' => $imgFileName,
|
||||
'pump' => $outArray
|
||||
);
|
||||
|
||||
return $resArray;
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
|
||||
|
||||
// Podnoszenie - pompy stacjonarne
|
||||
// site 406
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createRoomHpChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0, $hz=50, $pointColor)
|
||||
{
|
||||
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwy�sza� warto�� dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = ceil($max_XVal+($max_XVal*0.1));
|
||||
$max_YVal = ceil($max_YVal+($max_YVal*0.1));
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'H[m]');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 5, 5, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
$step = round(1/$wspX,2);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
if ($hz<50) $color = $dark_gray;
|
||||
else $color = $blue;
|
||||
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $color);
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
|
||||
// rysuje kropk�
|
||||
// ========================================================================================================================
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$polynomial->get_y($qVal), 10, 10, imagecolorallocate($im, $pointColor['R'], $pointColor['G'], $pointColor['B']));
|
||||
// ========================================================================================================================
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
@@ -0,0 +1,255 @@
|
||||
<?php
|
||||
|
||||
// Load the least-square regression class.
|
||||
require_once('./polynomial/XY_Plot.php' );
|
||||
|
||||
//-----------------------------------------------------------
|
||||
$imageWidth = 969;
|
||||
$imageHeight = 600;
|
||||
|
||||
$leftMargin = 25;
|
||||
$rightMargin = 50;
|
||||
|
||||
$topMargin = 25;
|
||||
$bottomMargin = 40;
|
||||
|
||||
// Verticle scale
|
||||
$Y_MajorScale = 0.1;
|
||||
$Y_MinorScale = $Y_MajorScale / 5;
|
||||
$X_MajorScale = 0.1;
|
||||
$X_MinorScale = $X_MajorScale / 5;
|
||||
//-----------------------------------------------------------
|
||||
|
||||
// Create image
|
||||
$image = @imageCreate( $imageWidth , $imageHeight )
|
||||
or die( "Cannot Initialize new GD image stream" );
|
||||
|
||||
//---------------------------------
|
||||
// Create basic color map
|
||||
//---------------------------------
|
||||
$colorMap = array();
|
||||
|
||||
//$colorMap[ "Background" ] = imageColorAllocate( $image , 0xDB , 0xB3 , 0xE6 );
|
||||
$colorMap[ "Background" ] = imageColorAllocate( $image , 255, 255, 255 );
|
||||
|
||||
// Create a standard color palette
|
||||
$colorMap[ "Black" ] = imagecolorallocate( $image, 0, 0, 0 );
|
||||
$colorMap[ "Red" ] = imagecolorallocate( $image, 192, 0, 0 );
|
||||
$colorMap[ "Green" ] = imagecolorallocate( $image, 0, 192, 0 );
|
||||
$colorMap[ "Blue" ] = imagecolorallocate( $image, 0, 0, 192 );
|
||||
$colorMap[ "Brown" ] = imagecolorallocate( $image, 48, 48, 0 );
|
||||
$colorMap[ "Cyan" ] = imagecolorallocate( $image, 0, 192, 192 );
|
||||
$colorMap[ "Purple" ] = imagecolorallocate( $image, 192, 0, 192 );
|
||||
$colorMap[ "LightGray" ] = imagecolorallocate( $image, 192, 192, 192 );
|
||||
|
||||
$colorMap[ "DarkGray" ] = imagecolorallocate( $image, 48, 48, 48 );
|
||||
$colorMap[ "LightRed" ] = imagecolorallocate( $image, 255, 0, 0 );
|
||||
$colorMap[ "LightGreen" ] = imagecolorallocate( $image, 0, 255, 0 );
|
||||
$colorMap[ "LightBlue" ] = imagecolorallocate( $image, 0, 0, 255 );
|
||||
$colorMap[ "Yellow" ] = imagecolorallocate( $image, 255, 255, 0 );
|
||||
$colorMap[ "LightCyan" ] = imagecolorallocate( $image, 0, 255, 255 );
|
||||
$colorMap[ "LightPurple" ] = imagecolorallocate( $image, 255, 0, 255 );
|
||||
$colorMap[ "White" ] = imagecolorallocate( $image, 255, 255, 255 );
|
||||
$colorMap[ "DarkYellow" ] = imagecolorallocate( $image, 255, 214, 0 );
|
||||
|
||||
$colorMap[ "Gray10" ] = imagecolorallocate( $image , 26 , 26 , 26 );
|
||||
$colorMap[ "Gray20" ] = imagecolorallocate( $image , 51 , 51 , 51 );
|
||||
$colorMap[ "Gray30" ] = imagecolorallocate( $image , 77 , 77 , 77 );
|
||||
$colorMap[ "Gray40" ] = imagecolorallocate( $image , 102 , 102 , 102 );
|
||||
$colorMap[ "Gray50" ] = imagecolorallocate( $image , 128 , 128 , 128 );
|
||||
$colorMap[ "Gray60" ] = imagecolorallocate( $image , 154 , 154 , 154 );
|
||||
$colorMap[ "Gray70" ] = imagecolorallocate( $image , 180 , 180 , 180 );
|
||||
$colorMap[ "Gray80" ] = imagecolorallocate( $image , 205 , 205 , 205 );
|
||||
$colorMap[ "Gray90" ] = imagecolorallocate( $image , 230 , 230 , 230 );
|
||||
|
||||
// New plot
|
||||
$plot = new XY_PlotClass( $image );
|
||||
|
||||
// Setup boundaries
|
||||
$plot->sizeWindow
|
||||
(
|
||||
$leftMargin,
|
||||
$topMargin,
|
||||
$imageWidth - $rightMargin,
|
||||
$imageHeight - $bottomMargin
|
||||
);
|
||||
|
||||
// Draw border around graph area.
|
||||
imageRectangle
|
||||
(
|
||||
$image,
|
||||
$leftMargin,
|
||||
$topMargin,
|
||||
$imageWidth - $rightMargin,
|
||||
$imageHeight - $bottomMargin,
|
||||
$colorMap[ "LightGray" ]
|
||||
);
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
function plotRenderData( $data, $color )
|
||||
{
|
||||
global $plot;
|
||||
|
||||
$plot->resetData();
|
||||
foreach ( $data as $point )
|
||||
$plot->addData( $point[ 0 ], $point[ 1 ] );
|
||||
|
||||
$plot->setColor( $color );
|
||||
|
||||
$plot->autoScaleX_MinMax( 0 );
|
||||
$plot->autoScaleY_MinMax( 1 );
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Custom vertical text-- just return value with dolor sign in front
|
||||
//---------------------------------------------------------------------------
|
||||
function textCallback( $Value )
|
||||
{
|
||||
return number_format( $Value, 2 );
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
function plotAddScale()
|
||||
{
|
||||
global $plot;
|
||||
global $X_MajorScale;
|
||||
global $X_MinorScale;
|
||||
global $Y_MajorScale;
|
||||
global $Y_MinorScale;
|
||||
global $colorMap;
|
||||
|
||||
// Setup and draw minor horizontal scale (right to left).
|
||||
$plot->SetX_MinorDivisionScale( $X_MinorScale );
|
||||
$plot->SetX_MinorDivisionColor( $colorMap[ "Gray90" ] );
|
||||
$plot->DrawX_MinorDivisions();
|
||||
|
||||
// Setup and draw minor vertical scale (top to bottom).
|
||||
$plot->SetY_MinorDivisionScale( $Y_MinorScale );
|
||||
$plot->SetY_MinorDivisionColor( $colorMap[ "Gray90" ] );
|
||||
$plot->DrawY_MinorDivisions();
|
||||
|
||||
//----------------------------------
|
||||
// Setup and draw major horizontal scale (right to left).
|
||||
//----------------------------------
|
||||
|
||||
// Extend lines 5 pixels past margins for label.
|
||||
$plot->SetX_MajorDivisionExtention( 5 );
|
||||
|
||||
// Scale.
|
||||
$plot->SetX_MajorDivisionScale( $X_MajorScale );
|
||||
|
||||
// Division lines are blue.
|
||||
$plot->SetX_MajorDivisionColor( $colorMap[ "Gray80" ] );
|
||||
|
||||
// Text labels are dark gray.
|
||||
$plot->SetX_MajorDivisionTextColor( $colorMap[ "Black" ] );
|
||||
$plot->SetX_MajorTextCallback( "textCallback" );
|
||||
|
||||
// Draw it.
|
||||
$plot->DrawX_MajorDivisions();
|
||||
|
||||
//----------------------------------
|
||||
// Setup and draw major vertical scale (top to bottom)
|
||||
//----------------------------------
|
||||
|
||||
// Extend lines 5 pixels past margins for label.
|
||||
$plot->SetY_MajorDivisionExtention( 5 );
|
||||
|
||||
// Scale.
|
||||
$plot->SetY_MajorDivisionScale( $Y_MajorScale );
|
||||
|
||||
// Divisions in dark gray.
|
||||
$plot->SetY_MajorDivisionColor( $colorMap[ "Gray80" ] );
|
||||
$plot->SetY_MajorTextCallback( "textCallback" );
|
||||
|
||||
// Lables in dark gray.
|
||||
$plot->SetY_MajorDivisionTextColor( $colorMap[ "Black" ] );
|
||||
|
||||
// Draw it.
|
||||
$plot->DrawY_MajorDivisions();
|
||||
}
|
||||
|
||||
function plotRenderRegression( $regression, $coefficients, $min, $max, $color )
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
|
||||
$plot->resetData();
|
||||
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
for ( $xIndex = 0; $xIndex < $frameWidth; ++$xIndex )
|
||||
{
|
||||
$x = $xIndex * ( $max - $min ) / $frameWidth + $min;
|
||||
$y = $regression->interpolate( $coefficients, $x );
|
||||
$plot->addData( $x, $y );
|
||||
}
|
||||
|
||||
$plot->setColor( $color );
|
||||
$plot->renderWithLines();
|
||||
|
||||
}
|
||||
|
||||
|
||||
function plotRectangleRange($scaleFrom,$scaleTo,$xFrom,$xTo, $color)
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $imageHeight;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
$scaleCounter = $frameWidth/($scaleTo-$scaleFrom);
|
||||
|
||||
if ($color == 'green_value')
|
||||
$rgb = imagecolorallocatealpha($image, 0, 255, 0, 100);
|
||||
else if ($color == 'yellow_value')
|
||||
$rgb = imagecolorallocatealpha($image, 255, 255, 0, 100);
|
||||
else if ($color == 'red_value')
|
||||
$rgb = imagecolorallocatealpha($image, 255, 0, 0, 100);
|
||||
|
||||
|
||||
if ($leftMargin+$xTo*$scaleCounter > $imageWidth-$rightMargin) $val=$imageWidth-$rightMargin;
|
||||
else $val=$leftMargin+$xTo*$scaleCounter;
|
||||
|
||||
imagefilledrectangle($image, $leftMargin+$xFrom*$scaleCounter, $topMargin, $val, $imageHeight-$bottomMargin, $rgb);
|
||||
}
|
||||
|
||||
|
||||
function plotCircleRange($scaleXFrom,$scaleXTo,$scaleYFrom,$scaleYTo,$xParam,$yParam, $color)
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $imageHeight;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
$frameHeight = $imageHeight - $topMargin - $bottomMargin;
|
||||
$scaleXCounter = $frameWidth/($scaleXTo-$scaleXFrom);
|
||||
$scaleYCounter = $frameHeight/($scaleYTo-$scaleYFrom);
|
||||
if ($leftMargin+$xParam*$scaleXCounter > $imageWidth-$rightMargin) $valX=$imageWidth-$rightMargin;
|
||||
else $valX=$leftMargin+$xParam*$scaleXCounter;
|
||||
|
||||
$valY=($imageHeight-$bottomMargin)-$yParam*$scaleYCounter;
|
||||
//$grey = imagecolorallocatealpha($image, 150, 150, 150, 100);
|
||||
imagefilledellipse($image, $valX, $valY, 9, 9, $color);
|
||||
}
|
||||
|
||||
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,91 @@
|
||||
<?php
|
||||
require_once('regression.php');
|
||||
/* function zc_math_autoloader($class) {
|
||||
require_once($class . ".php");
|
||||
}
|
||||
|
||||
spl_autoload_register('zc_math_autoloader'); */
|
||||
|
||||
/**
|
||||
* Math class
|
||||
*
|
||||
* Math helper functions
|
||||
* -- INDEX --
|
||||
* matrix_multiply
|
||||
* matrix_transpose
|
||||
*
|
||||
* @author Han Lin Yap < http://zencodez.net/ >
|
||||
* @copyright 2010 zencodez.net
|
||||
* @license http://creativecommons.org/licenses/by-sa/3.0/
|
||||
* @package math
|
||||
* @version 1.0 - 2010-08-13
|
||||
*/
|
||||
class zc_math {
|
||||
/**
|
||||
* Factory
|
||||
* @param string $classname optional math class to initialize
|
||||
* @param mixed $args optional arguments of the class constructor
|
||||
* @return instance of math class
|
||||
* @since 1.0
|
||||
*/
|
||||
public static function factory() {
|
||||
$args = func_get_args();
|
||||
$class = array_shift($args);
|
||||
$reflection = new ReflectionClass(__CLASS__ . '_' . $class);
|
||||
return $reflection->newInstanceArgs($args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Matrix multiplication
|
||||
* @link http://en.wikipedia.org/wiki/Matrix_multiplication Wikipedia
|
||||
* @param matrix $left Left matrix
|
||||
* @param matrix $right Right matrix
|
||||
* @return matrix
|
||||
* @since 1.0
|
||||
*/
|
||||
public static function matrix_multiply($left, $right) {
|
||||
$m = array_fill(0, count($left), array());
|
||||
|
||||
foreach ($right[0] as $r_col => $v) {
|
||||
foreach ($left as $l_row => $l_col) {
|
||||
$z = 0;
|
||||
foreach ($l_col as $col => $l_value) {
|
||||
$z += $l_value * $right[$col][$r_col];
|
||||
}
|
||||
$m[$l_row][$r_col] = $z;
|
||||
}
|
||||
}
|
||||
|
||||
return $m;
|
||||
}
|
||||
/**
|
||||
* Matrix transpose
|
||||
*
|
||||
* Eg.
|
||||
* [1,2,3]
|
||||
* [4,5,6]
|
||||
* becomes
|
||||
* [1,4]
|
||||
* [2,5]
|
||||
* [3,6]
|
||||
* @link http://en.wikipedia.org/wiki/Transpose Wikipedia
|
||||
* @link http://stackoverflow.com/questions/797251/transposing-multidimensional-arrays-in-php/797268#797268
|
||||
* @param matrix $transpose matrix to transpose
|
||||
* @return matrix Transposed matrix
|
||||
* @since 1.0
|
||||
*/
|
||||
public static function matrix_transpose($transpose) {
|
||||
/* array_unshift($transpose, null);
|
||||
return call_user_func_array('array_map', $transpose); */
|
||||
|
||||
$out = array();
|
||||
foreach ($transpose as $key => $subarr) {
|
||||
foreach ($subarr as $subkey => $subvalue) {
|
||||
$out[$subkey][$key] = $subvalue;
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,265 @@
|
||||
<?php
|
||||
if (file_exists('./polynomial/math.php'))
|
||||
require_once('./polynomial/math.php');
|
||||
else
|
||||
require_once('../polynomial/math.php');
|
||||
|
||||
|
||||
|
||||
// Moc - stacja prób
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createPeTestChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0)
|
||||
{
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwyśszaą wartość dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = ceil($max_XVal+($max_XVal*0.1));
|
||||
$max_YVal = ceil($max_YVal+($max_YVal*0.1));
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
imagefilledrectangle($im, 40, 30, 40+$wspX*$pupData[2], $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[2], 30, 40+$wspX*$pupData[3], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[3], 30, 40+$wspX*$pupData[5], $imgHeight-30, imagecolorallocatealpha($im, 0, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[5], 30, 40+$wspX*$pupData[6], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[6], 30, $imgWidth-30, $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'Pe[kW]');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
$step = round(1/$wspX,2);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<=($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $black);
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 7, 7, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje kropkę
|
||||
// 0 nie rysuje, 1 - zielona, 2 - żółta, 3 - czerwona, 4 - biała
|
||||
// ========================================================================================================================
|
||||
if ($point==1)
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$polynomial->get_y($qVal), 10, 10, $green);
|
||||
elseif ($point==2)
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-28)-$wspY*$polynomial->get_y($qVal), 10, 10, $yellow);
|
||||
elseif ($point==3)
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-25)-$wspY*$polynomial->get_y($qVal), 10, 10, $red);
|
||||
elseif ($point==4)
|
||||
{
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$polynomial->get_y($qVal), 10, 10, $background_color);
|
||||
imageellipse($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$polynomial->get_y($qVal), 10, 10, $black);
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
|
||||
// Moc - wizard (kreator doboru)
|
||||
// ========================================================== //// ========================================================== //
|
||||
function createPePumpWizardChart($pupData, $tstData, $qVal, $imgFileName, $imgWidth=420, $imgHeight=330, $xDiv=10, $yDiv=10, $m3min=0)
|
||||
{
|
||||
$max_XVal=0;
|
||||
$max_YVal=0;
|
||||
|
||||
$polynomial = new zc_math_polynomial($tstData);
|
||||
$polynomial->calculate_coefficients();
|
||||
|
||||
// ustanawia najwyśszaą wartość dla X i Y
|
||||
for($i=0; $i<count($tstData); $i++)
|
||||
{
|
||||
if ($tstData[$i][0]>$max_XVal) $max_XVal=$tstData[$i][0];
|
||||
if ($tstData[$i][1]>$max_YVal) $max_YVal=$tstData[$i][1];
|
||||
}
|
||||
|
||||
$max_XVal = ceil($max_XVal+($max_XVal*0.1));
|
||||
$max_YVal = ceil($max_YVal+($max_YVal*0.1));
|
||||
|
||||
|
||||
//sprawdza, czy m3/min, czy m3/h
|
||||
if ($m3min==1)
|
||||
{
|
||||
$m3h = 1/60;
|
||||
$ilosc_po_przecinku = 3;
|
||||
$m3Desc = 'Q[m3/min]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$m3h = 1;
|
||||
$ilosc_po_przecinku = 2;
|
||||
$m3Desc = 'Q[m3/h]';
|
||||
}
|
||||
|
||||
if (file_exists('./fonts/calibri.ttf')) { $font = './fonts/calibri.ttf'; $fontBold = './fonts/Calibri_b.ttf'; }
|
||||
else { $font = '../fonts/calibri.ttf'; $fontBold = '../fonts/Calibri_b.ttf'; }
|
||||
|
||||
$im = imagecreate($imgWidth, $imgHeight) or die("Cannot Initialize new GD image stream");
|
||||
$background_color = imagecolorallocate($im, 255, 255, 255);
|
||||
$black = imagecolorallocate($im, 0, 0, 0);
|
||||
$gray = imagecolorallocate($im, 200, 200, 200);
|
||||
$dark_gray = imagecolorallocate($im, 180, 180, 180);
|
||||
$red = imagecolorallocate($im, 235, 0, 0);
|
||||
$yellow = imagecolorallocate($im, 240, 240, 0);
|
||||
$green = imagecolorallocate($im, 34, 177, 76);
|
||||
$blue = imagecolorallocate($im, 0, 0, 200);
|
||||
//$bool = imagecolorallocate($im, 185, 0, 0);
|
||||
$bool = imagecolorallocate($im, 0, 128, 255);
|
||||
|
||||
|
||||
$wspX = ($imgWidth-70)/$max_XVal;
|
||||
$wspY = ($imgHeight-60)/$max_YVal;
|
||||
|
||||
imagefilledrectangle($im, 40, 30, 40+$wspX*$pupData[2], $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[2], 30, 40+$wspX*$pupData[3], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[3], 30, 40+$wspX*$pupData[5], $imgHeight-30, imagecolorallocatealpha($im, 0, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[5], 30, 40+$wspX*$pupData[6], $imgHeight-30, imagecolorallocatealpha($im, 255, 255, 0, 245));
|
||||
imagefilledrectangle($im, 40+$wspX*$pupData[6], 30, $imgWidth-30, $imgHeight-30, imagecolorallocatealpha($im, 255, 0, 0, 245));
|
||||
|
||||
|
||||
imagerectangle ($im , 40, 30, $imgWidth-30, $imgHeight-30, $gray);
|
||||
|
||||
// pionowa skala [X]
|
||||
imagettftext($im, 10, 0, $imgWidth-61, $imgHeight-2,$black, $fontBold, $m3Desc);
|
||||
// ========================================================================================================================
|
||||
// ========================================================================================================================
|
||||
for ($i=1; $i<$xDiv; $i++)
|
||||
{
|
||||
$szer=(($imgWidth-70)/$xDiv)*$i;
|
||||
imageline($im, 40+$szer, 30, 40+$szer,$imgHeight-29, $gray);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
$xMove = 15 + ($right - $left)/2;
|
||||
imagettftext($im, 8, 0, $xMove+$szer, $imgHeight-15,$black, $font, number_format((($max_XVal/$xDiv)*$i)*$m3h, $ilosc_po_przecinku, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// pozioma skala [Y]
|
||||
imagettftext($im, 10, 0, 2, 12,$black, $fontBold, 'Pe[kW]');
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<=$yDiv; $i++)
|
||||
{
|
||||
$wys=($imgHeight-60)-(($imgHeight-60)/$yDiv)*$i;
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
$xPos = 36 - ($right - $left);
|
||||
imageline($im, 39, 30+$wys, $imgWidth-31, 30+$wys, $gray);
|
||||
imagettftext($im, 8, 0, $xPos, 34+$wys,$black, $font, number_format(($max_YVal/$yDiv)*$i, 2, ',', ''));
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje linie
|
||||
// ========================================================================================================================
|
||||
$step = round(1/$wspX,2);
|
||||
for ($i=0; $i<$max_XVal; $i+=$step)
|
||||
{
|
||||
$yLineTo = $polynomial->get_y($i+$step);
|
||||
if ($yLineTo>0 && (40+$wspX*($i+$step))<=($imgWidth-32))
|
||||
imageline($im, 40+$wspX*$i, ($imgHeight-30)-$wspY*$polynomial->get_y($i), 40+$wspX*($i+$step), ($imgHeight-30)-$wspY*$yLineTo, $black);
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
// rysuje punkty
|
||||
// ========================================================================================================================
|
||||
for ($i=0; $i<count($tstData); $i++)
|
||||
imagefilledellipse ($im, 40+$wspX*$tstData[$i][0],($imgHeight-30)-$wspY*$tstData[$i][1], 5, 5, $blue);
|
||||
// ========================================================================================================================
|
||||
|
||||
|
||||
// rysuje kropkę + opis
|
||||
// ========================================================================================================================
|
||||
if ($qVal>0)
|
||||
{
|
||||
$qyVal = $polynomial->get_y($qVal);
|
||||
imagefilledellipse ($im, 40+$wspX*$qVal,($imgHeight-30)-$wspY*$qyVal, 9, 9, $bool);
|
||||
|
||||
list($left,,$right) = imageftbbox( 8, 0, $font, '(Q='.round($qVal*$m3h,$ilosc_po_przecinku).'; Pe='.round($qyVal,2).')');
|
||||
$xPos = ($imgWidth-47) - ($right - $left);
|
||||
imagettftext($im, 10, 0, $xPos, 17,$bool, $font, '(Q='.round($qVal*$m3h,$ilosc_po_przecinku).'; Pe='.round($qyVal,2).')');
|
||||
}
|
||||
// ========================================================================================================================
|
||||
|
||||
return imagepng($im,$imgFileName);
|
||||
|
||||
}
|
||||
// ========================================================== //// ========================================================== //
|
||||
|
||||
|
||||
@@ -0,0 +1,257 @@
|
||||
<?php
|
||||
|
||||
// Load the least-square regression class.
|
||||
require_once('./polynomial/XY_Plot.php' );
|
||||
|
||||
//-----------------------------------------------------------
|
||||
$imageWidth = 420;
|
||||
$imageHeight = 330;
|
||||
|
||||
$leftMargin = 25;
|
||||
$rightMargin = 50;
|
||||
|
||||
$topMargin = 25;
|
||||
$bottomMargin = 40;
|
||||
|
||||
// Verticle scale
|
||||
$Y_MajorScale = 0.1;
|
||||
$Y_MinorScale = $Y_MajorScale / 5;
|
||||
$X_MajorScale = 0.1;
|
||||
$X_MinorScale = $X_MajorScale / 5;
|
||||
//-----------------------------------------------------------
|
||||
|
||||
// Create image
|
||||
$image = @imageCreate( $imageWidth , $imageHeight )
|
||||
or die( "Cannot Initialize new GD image stream" );
|
||||
|
||||
//---------------------------------
|
||||
// Create basic color map
|
||||
//---------------------------------
|
||||
$colorMap = array();
|
||||
|
||||
//$colorMap[ "Background" ] = imageColorAllocate( $image , 0xDB , 0xB3 , 0xE6 );
|
||||
$colorMap[ "Background" ] = imageColorAllocate( $image , 255, 255, 255 );
|
||||
|
||||
// Create a standard color palette
|
||||
$colorMap[ "Black" ] = imagecolorallocate( $image, 0, 0, 0 );
|
||||
$colorMap[ "Red" ] = imagecolorallocate( $image, 192, 0, 0 );
|
||||
$colorMap[ "Green" ] = imagecolorallocate( $image, 0, 192, 0 );
|
||||
$colorMap[ "Blue" ] = imagecolorallocate( $image, 0, 0, 192 );
|
||||
$colorMap[ "Brown" ] = imagecolorallocate( $image, 48, 48, 0 );
|
||||
$colorMap[ "Cyan" ] = imagecolorallocate( $image, 0, 192, 192 );
|
||||
$colorMap[ "Purple" ] = imagecolorallocate( $image, 192, 0, 192 );
|
||||
$colorMap[ "LightGray" ] = imagecolorallocate( $image, 192, 192, 192 );
|
||||
|
||||
$colorMap[ "DarkGray" ] = imagecolorallocate( $image, 48, 48, 48 );
|
||||
$colorMap[ "LightRed" ] = imagecolorallocate( $image, 255, 0, 0 );
|
||||
$colorMap[ "LightGreen" ] = imagecolorallocate( $image, 0, 255, 0 );
|
||||
$colorMap[ "LightBlue" ] = imagecolorallocate( $image, 0, 0, 255 );
|
||||
$colorMap[ "Yellow" ] = imagecolorallocate( $image, 255, 255, 0 );
|
||||
$colorMap[ "LightCyan" ] = imagecolorallocate( $image, 0, 255, 255 );
|
||||
$colorMap[ "LightPurple" ] = imagecolorallocate( $image, 255, 0, 255 );
|
||||
$colorMap[ "White" ] = imagecolorallocate( $image, 255, 255, 255 );
|
||||
$colorMap[ "DarkYellow" ] = imagecolorallocate( $image, 255, 214, 0 );
|
||||
|
||||
$colorMap[ "Gray10" ] = imagecolorallocate( $image , 26 , 26 , 26 );
|
||||
$colorMap[ "Gray20" ] = imagecolorallocate( $image , 51 , 51 , 51 );
|
||||
$colorMap[ "Gray30" ] = imagecolorallocate( $image , 77 , 77 , 77 );
|
||||
$colorMap[ "Gray40" ] = imagecolorallocate( $image , 102 , 102 , 102 );
|
||||
$colorMap[ "Gray50" ] = imagecolorallocate( $image , 128 , 128 , 128 );
|
||||
$colorMap[ "Gray60" ] = imagecolorallocate( $image , 154 , 154 , 154 );
|
||||
$colorMap[ "Gray70" ] = imagecolorallocate( $image , 180 , 180 , 180 );
|
||||
$colorMap[ "Gray80" ] = imagecolorallocate( $image , 205 , 205 , 205 );
|
||||
$colorMap[ "Gray90" ] = imagecolorallocate( $image , 230 , 230 , 230 );
|
||||
|
||||
// New plot
|
||||
$plot = new XY_PlotClass( $image );
|
||||
|
||||
// Setup boundaries
|
||||
$plot->sizeWindow
|
||||
(
|
||||
$leftMargin,
|
||||
$topMargin,
|
||||
$imageWidth - $rightMargin,
|
||||
$imageHeight - $bottomMargin
|
||||
);
|
||||
|
||||
// Draw border around graph area.
|
||||
imageRectangle
|
||||
(
|
||||
$image,
|
||||
$leftMargin,
|
||||
$topMargin,
|
||||
$imageWidth - $rightMargin,
|
||||
$imageHeight - $bottomMargin,
|
||||
$colorMap[ "LightGray" ]
|
||||
);
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
function plotRenderData( $data, $color )
|
||||
{
|
||||
global $plot;
|
||||
|
||||
$plot->resetData();
|
||||
foreach ( $data as $point )
|
||||
$plot->addData( $point[ 0 ], $point[ 1 ] );
|
||||
|
||||
$plot->setColor( $color );
|
||||
|
||||
$plot->autoScaleX_MinMax( 0 );
|
||||
$plot->autoScaleY_MinMax( 1 );
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Custom vertical text-- just return value with dolor sign in front
|
||||
//---------------------------------------------------------------------------
|
||||
function textCallback( $Value )
|
||||
{
|
||||
return number_format( $Value, 2 );
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
function plotAddScale()
|
||||
{
|
||||
global $plot;
|
||||
global $X_MajorScale;
|
||||
global $X_MinorScale;
|
||||
global $Y_MajorScale;
|
||||
global $Y_MinorScale;
|
||||
global $colorMap;
|
||||
|
||||
// Setup and draw minor horizontal scale (right to left).
|
||||
$plot->SetX_MinorDivisionScale( $X_MinorScale );
|
||||
$plot->SetX_MinorDivisionColor( $colorMap[ "Gray90" ] );
|
||||
$plot->DrawX_MinorDivisions();
|
||||
|
||||
// Setup and draw minor vertical scale (top to bottom).
|
||||
$plot->SetY_MinorDivisionScale( $Y_MinorScale );
|
||||
$plot->SetY_MinorDivisionColor( $colorMap[ "Gray90" ] );
|
||||
$plot->DrawY_MinorDivisions();
|
||||
|
||||
//----------------------------------
|
||||
// Setup and draw major horizontal scale (right to left).
|
||||
//----------------------------------
|
||||
|
||||
// Extend lines 5 pixels past margins for label.
|
||||
$plot->SetX_MajorDivisionExtention( 5 );
|
||||
|
||||
// Scale.
|
||||
$plot->SetX_MajorDivisionScale( $X_MajorScale );
|
||||
|
||||
// Division lines are blue.
|
||||
$plot->SetX_MajorDivisionColor( $colorMap[ "Gray80" ] );
|
||||
|
||||
// Text labels are dark gray.
|
||||
$plot->SetX_MajorDivisionTextColor( $colorMap[ "Black" ] );
|
||||
$plot->SetX_MajorTextCallback( "textCallback" );
|
||||
|
||||
// Draw it.
|
||||
$plot->DrawX_MajorDivisions();
|
||||
|
||||
//----------------------------------
|
||||
// Setup and draw major vertical scale (top to bottom)
|
||||
//----------------------------------
|
||||
|
||||
// Extend lines 5 pixels past margins for label.
|
||||
$plot->SetY_MajorDivisionExtention( 5 );
|
||||
|
||||
// Scale.
|
||||
$plot->SetY_MajorDivisionScale( $Y_MajorScale );
|
||||
|
||||
// Divisions in dark gray.
|
||||
$plot->SetY_MajorDivisionColor( $colorMap[ "Gray80" ] );
|
||||
$plot->SetY_MajorTextCallback( "textCallback" );
|
||||
|
||||
// Lables in dark gray.
|
||||
$plot->SetY_MajorDivisionTextColor( $colorMap[ "Black" ] );
|
||||
|
||||
// Draw it.
|
||||
$plot->DrawY_MajorDivisions();
|
||||
}
|
||||
|
||||
function plotRenderRegression( $regression, $coefficients, $min, $max, $color )
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
|
||||
$plot->resetData();
|
||||
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
for ( $xIndex = 0; $xIndex < $frameWidth; ++$xIndex )
|
||||
{
|
||||
$x = $xIndex * ( $max - $min ) / $frameWidth + $min;
|
||||
$y = $regression->interpolate( $coefficients, $x );
|
||||
$plot->addData( $x, $y );
|
||||
}
|
||||
|
||||
$plot->setColor( $color );
|
||||
$plot->renderWithLines();
|
||||
|
||||
}
|
||||
|
||||
|
||||
function plotRectangleRange($scaleFrom,$scaleTo,$xFrom,$xTo, $color)
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $imageHeight;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
$scaleCounter = $frameWidth/($scaleTo-$scaleFrom);
|
||||
|
||||
if ($color == 'green_value')
|
||||
$rgb = imagecolorallocatealpha($image, 0, 255, 0, 100);
|
||||
else if ($color == 'yellow_value')
|
||||
$rgb = imagecolorallocatealpha($image, 255, 255, 0, 100);
|
||||
else if ($color == 'red_value')
|
||||
$rgb = imagecolorallocatealpha($image, 255, 0, 0, 100);
|
||||
|
||||
|
||||
if ($leftMargin+$xTo*$scaleCounter > $imageWidth-$rightMargin) $val=$imageWidth-$rightMargin;
|
||||
else $val=$leftMargin+$xTo*$scaleCounter;
|
||||
|
||||
imagefilledrectangle($image, $leftMargin+$xFrom*$scaleCounter, $topMargin, $val, $imageHeight-$bottomMargin, $rgb);
|
||||
}
|
||||
|
||||
|
||||
function plotCircleRange($scaleXFrom,$scaleXTo,$scaleYFrom,$scaleYTo,$xParam,$yParam, $color)
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $imageHeight;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
$frameHeight = $imageHeight - $topMargin - $bottomMargin;
|
||||
$scaleXCounter = $frameWidth/($scaleXTo-$scaleXFrom);
|
||||
$scaleYCounter = $frameHeight/($scaleYTo-$scaleYFrom);
|
||||
if ($leftMargin+$xParam*$scaleXCounter > $imageWidth-$rightMargin) $valX=$imageWidth-$rightMargin;
|
||||
else $valX=$leftMargin+$xParam*$scaleXCounter;
|
||||
|
||||
$valY=($imageHeight-$bottomMargin)-$yParam*$scaleYCounter;
|
||||
//$grey = imagecolorallocatealpha($image, 150, 150, 150, 100);
|
||||
$black = imagecolorallocate( $image , 0 , 0 , 0 );
|
||||
imagefilledellipse($image, $valX, $valY, 10, 10, $black);
|
||||
imagefilledellipse($image, $valX, $valY, 9, 9, $color);
|
||||
}
|
||||
|
||||
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
|
||||
// Load the least-square regression class.
|
||||
require_once('./polynomial/XY_Plot.php' );
|
||||
|
||||
//-----------------------------------------------------------
|
||||
$imageWidth = 420;
|
||||
$imageHeight = 330;
|
||||
|
||||
$leftMargin = 25;
|
||||
$rightMargin = 50;
|
||||
|
||||
$topMargin = 25;
|
||||
$bottomMargin = 40;
|
||||
|
||||
// Verticle scale
|
||||
$Y_MajorScale = 0.1;
|
||||
$Y_MinorScale = $Y_MajorScale / 5;
|
||||
$X_MajorScale = 0.1;
|
||||
$X_MinorScale = $X_MajorScale / 5;
|
||||
//-----------------------------------------------------------
|
||||
|
||||
// Create image
|
||||
$image1 = @imageCreate( $imageWidth , $imageHeight )
|
||||
or die( "Cannot Initialize new GD image stream" );
|
||||
|
||||
//---------------------------------
|
||||
// Create basic color map
|
||||
//---------------------------------
|
||||
$colorMap = array();
|
||||
|
||||
//$colorMap[ "Background" ] = image1ColorAllocate( $image1 , 0xDB , 0xB3 , 0xE6 );
|
||||
$colorMap[ "Background" ] = imageColorAllocate( $image1 , 255, 255, 255 );
|
||||
|
||||
// Create a standard color palette
|
||||
$colorMap[ "Black" ] = imagecolorallocate( $image1, 0, 0, 0 );
|
||||
$colorMap[ "Red" ] = imagecolorallocate( $image1, 192, 0, 0 );
|
||||
$colorMap[ "Green" ] = imagecolorallocate( $image1, 0, 192, 0 );
|
||||
$colorMap[ "Blue" ] = imagecolorallocate( $image1, 0, 0, 192 );
|
||||
$colorMap[ "Brown" ] = imagecolorallocate( $image1, 48, 48, 0 );
|
||||
$colorMap[ "Cyan" ] = imagecolorallocate( $image1, 0, 192, 192 );
|
||||
$colorMap[ "Purple" ] = imagecolorallocate( $image1, 192, 0, 192 );
|
||||
$colorMap[ "LightGray" ] = imagecolorallocate( $image1, 192, 192, 192 );
|
||||
|
||||
$colorMap[ "DarkGray" ] = imagecolorallocate( $image1, 48, 48, 48 );
|
||||
$colorMap[ "LightRed" ] = imagecolorallocate( $image1, 255, 0, 0 );
|
||||
$colorMap[ "LightGreen" ] = imagecolorallocate( $image1, 0, 255, 0 );
|
||||
$colorMap[ "LightBlue" ] = imagecolorallocate( $image1, 0, 0, 255 );
|
||||
$colorMap[ "Yellow" ] = imagecolorallocate( $image1, 255, 255, 0 );
|
||||
$colorMap[ "LightCyan" ] = imagecolorallocate( $image1, 0, 255, 255 );
|
||||
$colorMap[ "LightPurple" ] = imagecolorallocate( $image1, 255, 0, 255 );
|
||||
$colorMap[ "White" ] = imagecolorallocate( $image1, 255, 255, 255 );
|
||||
$colorMap[ "DarkYellow" ] = imagecolorallocate( $image1, 255, 214, 0 );
|
||||
|
||||
$colorMap[ "Gray10" ] = imagecolorallocate( $image1 , 26 , 26 , 26 );
|
||||
$colorMap[ "Gray20" ] = imagecolorallocate( $image1 , 51 , 51 , 51 );
|
||||
$colorMap[ "Gray30" ] = imagecolorallocate( $image1 , 77 , 77 , 77 );
|
||||
$colorMap[ "Gray40" ] = imagecolorallocate( $image1 , 102 , 102 , 102 );
|
||||
$colorMap[ "Gray50" ] = imagecolorallocate( $image1 , 128 , 128 , 128 );
|
||||
$colorMap[ "Gray60" ] = imagecolorallocate( $image1 , 154 , 154 , 154 );
|
||||
$colorMap[ "Gray70" ] = imagecolorallocate( $image1 , 180 , 180 , 180 );
|
||||
$colorMap[ "Gray80" ] = imagecolorallocate( $image1 , 205 , 205 , 205 );
|
||||
$colorMap[ "Gray90" ] = imagecolorallocate( $image1 , 230 , 230 , 230 );
|
||||
|
||||
// New plot
|
||||
$plot = new XY_PlotClass( $image1 );
|
||||
|
||||
// Setup boundaries
|
||||
$plot->sizeWindow
|
||||
(
|
||||
$leftMargin,
|
||||
$topMargin,
|
||||
$imageWidth - $rightMargin,
|
||||
$imageHeight - $bottomMargin
|
||||
);
|
||||
|
||||
// Draw border around graph area.
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function plotRectangleRange1($scaleFrom,$scaleTo,$xFrom,$xTo, $color)
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $imageHeight;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image1;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
$scaleCounter = $frameWidth/($scaleTo-$scaleFrom);
|
||||
|
||||
if ($color == 'green_value')
|
||||
$rgb = imagecolorallocatealpha($image1, 0, 255, 0, 100);
|
||||
else if ($color == 'yellow_value')
|
||||
$rgb = imagecolorallocatealpha($image1, 255, 255, 0, 100);
|
||||
else if ($color == 'red_value')
|
||||
$rgb = imagecolorallocatealpha($image1, 255, 0, 0, 100);
|
||||
|
||||
|
||||
if ($leftMargin+$xTo*$scaleCounter > $imageWidth-$rightMargin) $val=$imageWidth-$rightMargin;
|
||||
else $val=$leftMargin+$xTo*$scaleCounter;
|
||||
|
||||
imagefilledrectangle($image1, $leftMargin+$xFrom*$scaleCounter, $topMargin, $val, $imageHeight-$bottomMargin, $rgb);
|
||||
}
|
||||
|
||||
|
||||
function plotCircleRange1($scaleXFrom,$scaleXTo,$scaleYFrom,$scaleYTo,$xParam,$yParam)
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $imageHeight;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image1;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
$frameHeight = $imageHeight - $topMargin - $bottomMargin;
|
||||
$scaleXCounter = $frameWidth/($scaleXTo-$scaleXFrom);
|
||||
$scaleYCounter = $frameHeight/($scaleYTo-$scaleYFrom);
|
||||
if ($leftMargin+$xParam*$scaleXCounter > $imageWidth-$rightMargin) $valX=$imageWidth-$rightMargin;
|
||||
else $valX=$leftMargin+$xParam*$scaleXCounter;
|
||||
|
||||
$valY=($imageHeight-$bottomMargin)-$yParam*$scaleYCounter;
|
||||
$grey = imagecolorallocate( $image1 , 154 , 154 , 154 );
|
||||
imagefilledellipse($image1, $valX, $valY, 10, 10, $grey);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Custom vertical text-- just return value with dolor sign in front
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,378 @@
|
||||
<?php
|
||||
if (!class_exists('zc_math')) {
|
||||
require_once('math.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* Linear class
|
||||
*
|
||||
* The data format is array in array.
|
||||
* Array containing number of coordinates and the coordinates contain an array of x and y.
|
||||
*
|
||||
* Example usage
|
||||
* <code>
|
||||
* $data = array(array($x1, $y1), array($x2, $y2));
|
||||
* $linear = new zc_math_linear($data);
|
||||
* $linear->calculate();
|
||||
* // y = k*x + m
|
||||
* echo $linear->k;
|
||||
* echo $linear->m;
|
||||
* </code>
|
||||
*
|
||||
* Linear regression formula found at {@link http://en.wikipedia.org/wiki/Numerical_methods_for_linear_least_squares#Computation }
|
||||
*
|
||||
* @author Han Lin Yap < http://zencodez.net/ >
|
||||
* @copyright 2010 zencodez.net
|
||||
* @license http://creativecommons.org/licenses/by-sa/3.0/
|
||||
* @package math
|
||||
* @version 1.0 - 2010-07-29
|
||||
*/
|
||||
class zc_math_linear {
|
||||
/**
|
||||
* Contains the coordinates
|
||||
* @var array
|
||||
*/
|
||||
public $data;
|
||||
|
||||
// needed for linear regression formula
|
||||
public $sum_x;
|
||||
public $sum_x2;
|
||||
public $sum_y;
|
||||
public $sum_xy;
|
||||
public $number_of_coords;
|
||||
|
||||
// y = k*x + m
|
||||
/**
|
||||
* @var float
|
||||
*/
|
||||
public $k;
|
||||
/**
|
||||
* @var float
|
||||
*/
|
||||
public $m;
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
*/
|
||||
function __construct($data) {
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate and make formula
|
||||
* To understand better, {@link http://en.wikipedia.org/wiki/Numerical_methods_for_linear_least_squares#Computation see formula}
|
||||
* @since 1.0
|
||||
*/
|
||||
public function calculate() {
|
||||
$this->number_of_coords = count($this->data);
|
||||
|
||||
$this->sum_x = $this->sum_by_formula($this->data, '$x[0]');
|
||||
$this->sum_x2 = $this->sum_by_formula($this->data, 'pow($x[0],2)');
|
||||
$this->sum_y = $this->sum_by_formula($this->data, '$x[1]');
|
||||
$this->sum_xy = $this->sum_by_formula($this->data, '$x[0] * $x[1]');
|
||||
|
||||
|
||||
$this->k = ($this->number_of_coords * $this->sum_xy - $this->sum_y * $this->sum_x) / ($this->number_of_coords * $this->sum_x2 - pow($this->sum_x, 2));
|
||||
|
||||
$this->m = ($this->sum_y * $this->sum_x2 - $this->sum_x * $this->sum_xy) / ($this->number_of_coords * $this->sum_x2 - pow($this->sum_x, 2));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all by a formula
|
||||
* Turn a multidimention array to a ordinary array with values
|
||||
* @param array $data Multidimention array
|
||||
* @param string $formula How to get what
|
||||
* @return array Get values in multidimention by formula
|
||||
* @since 1.0
|
||||
*/
|
||||
protected function _get_values_by_formula($data, $formula) {
|
||||
return array_map(create_function('$x', 'return ' . $formula . ';'), $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sum all by a formula
|
||||
* @param array $data Data to sum
|
||||
* @param string $formula Formula to sum
|
||||
* @return float sum of $data by formula
|
||||
* @since 1.0
|
||||
*/
|
||||
public function sum_by_formula($data, $formula) {
|
||||
return array_sum($this->_get_values_by_formula($data, $formula));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Polynomial regression
|
||||
*
|
||||
* Example usage
|
||||
* <code>
|
||||
* $polynomial = new zc_math_polynomial($data);
|
||||
* echo print_r($polynomial->calculate_coefficients());
|
||||
* echo "<img src='" . $polynomial->render_formula() . "' />";
|
||||
* echo "<a href='" . $polynomial->render_formula('wolframalpha') . "'>" . $polynomial->render_formula('') . "</a>";
|
||||
* echo $polynomial->get_y(1200);
|
||||
* </code>
|
||||
* {@link http://www.trentfguidry.net/post/2009/06/30/Matrix-Crout-LU-decomposition.aspx }
|
||||
* {@link http://www.trentfguidry.net/post/2009/07/19/Linear-multiple-regression.aspx }
|
||||
* {@link http://www.trentfguidry.net/post/2009/08/01/Linear-regression-polynomial-coefficients.aspx }
|
||||
* @author Han Lin Yap < http://zencodez.net/ >
|
||||
* @copyright 2010 zencodez.net
|
||||
* @license http://creativecommons.org/licenses/by-sa/3.0/
|
||||
* @package math
|
||||
* @version 1.0 - 2010-07-30
|
||||
*/
|
||||
class zc_math_polynomial extends zc_math_linear {
|
||||
/**
|
||||
* The calculated formula in array
|
||||
* @var array
|
||||
*/
|
||||
public $result;
|
||||
/**
|
||||
* Order to calculate
|
||||
* @var integer
|
||||
*/
|
||||
public $order;
|
||||
|
||||
/**
|
||||
* Initialize
|
||||
* @param array $data Format array(array($x1, $y2), array($x2, $y2))
|
||||
* @param integer $order optional What order the formula should be
|
||||
* @since 1.0
|
||||
*/
|
||||
function __construct($data, $order=4) {
|
||||
$this->data = $data;
|
||||
$this->set_order($order);
|
||||
}
|
||||
|
||||
/**
|
||||
* Change order
|
||||
* @param integer $order What order the formula should be
|
||||
* @since 1.0
|
||||
*/
|
||||
public function set_order($order) {
|
||||
$this->order = $order;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the formula
|
||||
* @param integer $order optional What order the formula should be
|
||||
* @return array The found formula in array
|
||||
* @since 1.0
|
||||
*/
|
||||
public function calculate_coefficients($order=false) {
|
||||
if ($order)
|
||||
$this->set_order($order);
|
||||
|
||||
$x = $this->_get_values_by_formula($this->data, '$x[0]');
|
||||
$y = $this->_get_values_by_formula($this->data, '$x[1]');
|
||||
|
||||
$z = array_fill(0, count($y), array());
|
||||
|
||||
for ($i = 0 ; $i < count($y) ; $i++) {
|
||||
for ($j = 0 ; $j <= $this->order ; $j++) {
|
||||
$z[$i][$j] = pow($x[$i],$j);
|
||||
}
|
||||
}
|
||||
$this->result = $this->_polynomial_regress($z, $y);
|
||||
return $this->result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render formula for wolframalpha, google chart, url or plain math text
|
||||
*
|
||||
* NOTE! {@link zc_math_polynomial::calculate_coefficients()} before calling this method
|
||||
* Example usage
|
||||
* <code>
|
||||
* render_formula()
|
||||
* render_formula('wolframalpha')
|
||||
* render_formula('')
|
||||
* render_formula('text');
|
||||
* </code>
|
||||
*
|
||||
* @param string $type optional Available types wolframalpha, text, google or ''
|
||||
* @param string|boolean $replace_x optional If you want to customize x output
|
||||
* @return string URL or text, depends on $type
|
||||
* @uses zc_math_polynomial::calculate_coefficients() Call it before to have something to render
|
||||
* @since 1.0
|
||||
*/
|
||||
public function render_formula($type='google', $replace_x=false) {
|
||||
$formula = array();
|
||||
$text = '';
|
||||
if ($type=='text')
|
||||
$text = '*';
|
||||
if (!$replace_x)
|
||||
$x = 'x';
|
||||
else
|
||||
$x = $replace_x;
|
||||
foreach($this->result AS $k => $v) {
|
||||
if ($k == 0)
|
||||
$formula[] = $v[0];
|
||||
elseif ($k == 1)
|
||||
$formula[] = $v[0] . $text . $x;
|
||||
elseif ($type!='google')
|
||||
$formula[] = $v[0] . $text . $x . "^". $k;
|
||||
else
|
||||
$formula[] = $v[0] . "x^{". $k . "}";
|
||||
}
|
||||
|
||||
if ($type=='wolframalpha')
|
||||
return 'http://www.wolframalpha.com/input/?i=' . implode("+%2b+", $formula);
|
||||
elseif ($type=='text')
|
||||
return implode("%2b", $formula);
|
||||
elseif ($type!='google')
|
||||
return 'y = ' . implode(" + ", $formula);
|
||||
else
|
||||
return 'http://chart.apis.google.com/chart?cht=tx&chl=y+=+' . implode("%2b", $formula);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get y value from x coordinate
|
||||
*
|
||||
* NOTE! {@link zc_math_polynomial::calculate_coefficients()} before calling this method
|
||||
*
|
||||
* @param integer $x X-coordinate
|
||||
* @return integer Y-coordinate
|
||||
* @uses zc_math_polynomial::calculate_coefficients() Call it before to have something to check on
|
||||
* @since 1.0
|
||||
*/
|
||||
public function get_y($x) {
|
||||
$sum = 0;
|
||||
foreach($this->result AS $k => $v) {
|
||||
if ($k == 0)
|
||||
$sum += $v[0];
|
||||
else
|
||||
$sum += $v[0] * pow($x,$k);
|
||||
}
|
||||
|
||||
return $sum;
|
||||
}
|
||||
|
||||
private function _polynomial_regress($z, $y) {
|
||||
$z_transpose = zc_math::matrix_transpose($z);
|
||||
$l = zc_math::matrix_multiply($z_transpose, $z);
|
||||
$r = zc_math::matrix_multiply($z_transpose, zc_math::matrix_transpose(array($y)));
|
||||
|
||||
return $this->_solve_for($l, $r);
|
||||
}
|
||||
|
||||
private function _solve_for($l, $r) {
|
||||
$resultMatrix = array_fill(0, count($l[0]), array());
|
||||
$resDecomp = $this->_lu_decompose($l);
|
||||
|
||||
$nP = $resDecomp['PivotArray'];
|
||||
$lMatrix = $resDecomp['L'];
|
||||
$uMatrix = $resDecomp['U'];
|
||||
for ($k = 0 ; $k < count($r[0]) ; $k++) {
|
||||
$sum = 0.0;
|
||||
$dMatrix = array_fill(0, count($l), array());
|
||||
$dMatrix[0][0] = $r[$nP[0]][$k] / $lMatrix[0][0];
|
||||
for ($i = 1; $i < count($l); $i++) {
|
||||
$sum = 0.0;
|
||||
for ($j = 0; $j < $i; $j++) {
|
||||
$sum += $lMatrix[$i][$j] * $dMatrix[$j][0];
|
||||
}
|
||||
|
||||
$dMatrix[$i][0] = ($r[$nP[$i]][$k] - $sum) / $lMatrix[$i][$i];
|
||||
}
|
||||
|
||||
$resultMatrix[count($l) - 1][$k] = $dMatrix[count($l) - 1][0];
|
||||
for ($i = count($l) - 2; $i >= 0; $i--) {
|
||||
$sum = 0.0;
|
||||
for ($j = $i + 1; $j < count($l); $j++) {
|
||||
$sum += $uMatrix[$i][$j] * $resultMatrix[$j][$k];
|
||||
}
|
||||
$resultMatrix[$i][$k] = $dMatrix[$i][0] - $sum;
|
||||
}
|
||||
}
|
||||
|
||||
return $resultMatrix;
|
||||
}
|
||||
|
||||
private function _lu_decompose($l) {
|
||||
if (!defined('PHP_INT_MIN')) {
|
||||
define('PHP_INT_MIN', ~PHP_INT_MAX);
|
||||
}
|
||||
$_rowCount = count($l);
|
||||
$_columnCount = count($l[0]);
|
||||
|
||||
$uMatrix = array_fill(0, $_rowCount, array());
|
||||
$lMatrix = array_fill(0, $_rowCount, array());
|
||||
$workingUMatrix = $l;
|
||||
$workingLMatrix = array_fill(0, $_rowCount, array());
|
||||
$pivotArray = range(0, $_rowCount-1);
|
||||
|
||||
for ($i = 0; $i < $_rowCount; $i++) {
|
||||
$maxRowRatio = PHP_INT_MIN;
|
||||
$maxRow = -1;
|
||||
$maxPosition = -1;
|
||||
|
||||
for ($j = $i; $j < $_rowCount; $j++) {
|
||||
$rowSum = 0.0;
|
||||
|
||||
for ($k = $i; $k < $_columnCount; $k++) {
|
||||
$rowSum += abs($workingUMatrix[$pivotArray[$j]][$k]);
|
||||
}
|
||||
|
||||
$dCurrentRatio = abs($workingUMatrix[$pivotArray[$j]][$i]) / $rowSum;
|
||||
|
||||
if ($dCurrentRatio > $maxRowRatio) {
|
||||
$maxRowRatio = abs($workingUMatrix[$pivotArray[$j]][$i] / $rowSum);
|
||||
$maxRow = $pivotArray[$j];
|
||||
$maxPosition = $j;
|
||||
}
|
||||
}
|
||||
if ($maxRow != $pivotArray[$i]) {
|
||||
|
||||
$hold = $pivotArray[$i];
|
||||
$pivotArray[$i] = $maxRow;
|
||||
$pivotArray[$maxPosition] = $hold;
|
||||
}
|
||||
$rowFirstElementValue = $workingUMatrix[$pivotArray[$i]][$i];
|
||||
|
||||
|
||||
for ($j = 0; $j < $_columnCount; $j++) {
|
||||
if ($j < $i) {
|
||||
$workingUMatrix[$pivotArray[$i]][$j] = 0.0;
|
||||
} elseif ($j == $i) {
|
||||
$workingLMatrix[$pivotArray[$i]][$j] = $rowFirstElementValue;
|
||||
$workingUMatrix[$pivotArray[$i]][$j] = 1.0;
|
||||
} else {
|
||||
$workingUMatrix[$pivotArray[$i]][$j] /= $rowFirstElementValue;
|
||||
$workingLMatrix[$pivotArray[$i]][$j] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
for ($k = $i + 1; $k < $_rowCount; $k++) {
|
||||
|
||||
$rowFirstElementValue = $workingUMatrix[$pivotArray[$k]][$i];
|
||||
|
||||
for ($j = 0; $j < $_rowCount; $j++) {
|
||||
if ($j < $i) {
|
||||
$workingUMatrix[$pivotArray[$k]][$j] = 0.0;
|
||||
} elseif ($j == $i) {
|
||||
$workingLMatrix[$pivotArray[$k]][$j] = $rowFirstElementValue;
|
||||
$workingUMatrix[$pivotArray[$k]][$j] = 0.0;
|
||||
} else {
|
||||
$workingUMatrix[$pivotArray[$k]][$j] = $workingUMatrix[$pivotArray[$k]][$j] - $rowFirstElementValue * $workingUMatrix[$pivotArray[$i]][$j];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for ($i = 0; $i < $_rowCount; $i++) {
|
||||
for ($j = 0; $j < $_rowCount; $j++) {
|
||||
$uMatrix[$i][$j] = $workingUMatrix[$pivotArray[$i]][$j];
|
||||
$lMatrix[$i][$j] = $workingLMatrix[$pivotArray[$i]][$j];
|
||||
}
|
||||
}
|
||||
|
||||
return array('U' => $uMatrix, 'L' => $lMatrix, 'PivotArray' => $pivotArray);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php //0046a
|
||||
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
|
||||
?>
|
||||
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
|
||||
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
|
||||
// Load the least-square regression class.
|
||||
require_once('./polynomial/XY_Plot.php' );
|
||||
|
||||
//-----------------------------------------------------------
|
||||
$image1Width = 969;
|
||||
$image1Height = 330;
|
||||
|
||||
$leftMargin = 25;
|
||||
$rightMargin = 50;
|
||||
|
||||
$topMargin = 25;
|
||||
$bottomMargin = 40;
|
||||
|
||||
// Verticle scale
|
||||
$Y_MajorScale = 0.1;
|
||||
$Y_MinorScale = $Y_MajorScale / 5;
|
||||
$X_MajorScale = 0.1;
|
||||
$X_MinorScale = $X_MajorScale / 5;
|
||||
//-----------------------------------------------------------
|
||||
|
||||
// Create image
|
||||
$image1 = @imageCreate( $image1Width , $image1Height )
|
||||
or die( "Cannot Initialize new GD image stream" );
|
||||
|
||||
//---------------------------------
|
||||
// Create basic color map
|
||||
//---------------------------------
|
||||
$colorMap = array();
|
||||
|
||||
//$colorMap[ "Background" ] = imageColorAllocate( $image1 , 0xDB , 0xB3 , 0xE6 );
|
||||
$colorMap[ "Background" ] = imageColorAllocate( $image1 , 255, 255, 255 );
|
||||
|
||||
// Create a standard color palette
|
||||
$colorMap[ "Black" ] = imagecolorallocate( $image1, 0, 0, 0 );
|
||||
$colorMap[ "Red" ] = imagecolorallocate( $image1, 192, 0, 0 );
|
||||
$colorMap[ "Green" ] = imagecolorallocate( $image1, 0, 192, 0 );
|
||||
$colorMap[ "Blue" ] = imagecolorallocate( $image1, 0, 0, 192 );
|
||||
$colorMap[ "Brown" ] = imagecolorallocate( $image1, 48, 48, 0 );
|
||||
$colorMap[ "Cyan" ] = imagecolorallocate( $image1, 0, 192, 192 );
|
||||
$colorMap[ "Purple" ] = imagecolorallocate( $image1, 192, 0, 192 );
|
||||
$colorMap[ "LightGray" ] = imagecolorallocate( $image1, 192, 192, 192 );
|
||||
|
||||
$colorMap[ "DarkGray" ] = imagecolorallocate( $image1, 48, 48, 48 );
|
||||
$colorMap[ "LightRed" ] = imagecolorallocate( $image1, 255, 0, 0 );
|
||||
$colorMap[ "LightGreen" ] = imagecolorallocate( $image1, 0, 255, 0 );
|
||||
$colorMap[ "LightBlue" ] = imagecolorallocate( $image1, 0, 0, 255 );
|
||||
$colorMap[ "Yellow" ] = imagecolorallocate( $image1, 255, 255, 0 );
|
||||
$colorMap[ "LightCyan" ] = imagecolorallocate( $image1, 0, 255, 255 );
|
||||
$colorMap[ "LightPurple" ] = imagecolorallocate( $image1, 255, 0, 255 );
|
||||
$colorMap[ "White" ] = imagecolorallocate( $image1, 255, 255, 255 );
|
||||
$colorMap[ "DarkYellow" ] = imagecolorallocate( $image1, 255, 214, 0 );
|
||||
|
||||
$colorMap[ "Gray10" ] = imagecolorallocate( $image1 , 26 , 26 , 26 );
|
||||
$colorMap[ "Gray20" ] = imagecolorallocate( $image1 , 51 , 51 , 51 );
|
||||
$colorMap[ "Gray30" ] = imagecolorallocate( $image1 , 77 , 77 , 77 );
|
||||
$colorMap[ "Gray40" ] = imagecolorallocate( $image1 , 102 , 102 , 102 );
|
||||
$colorMap[ "Gray50" ] = imagecolorallocate( $image1 , 128 , 128 , 128 );
|
||||
$colorMap[ "Gray60" ] = imagecolorallocate( $image1 , 154 , 154 , 154 );
|
||||
$colorMap[ "Gray70" ] = imagecolorallocate( $image1 , 180 , 180 , 180 );
|
||||
$colorMap[ "Gray80" ] = imagecolorallocate( $image1 , 205 , 205 , 205 );
|
||||
$colorMap[ "Gray90" ] = imagecolorallocate( $image1 , 230 , 230 , 230 );
|
||||
|
||||
// New plot
|
||||
$plot = new XY_PlotClass( $image1 );
|
||||
|
||||
// Setup boundaries
|
||||
$plot->sizeWindow
|
||||
(
|
||||
$leftMargin,
|
||||
$topMargin,
|
||||
$image1Width - $rightMargin,
|
||||
$image1Height - $bottomMargin
|
||||
);
|
||||
|
||||
// Draw border around graph area.
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function plotRectangleRange1($scaleFrom,$scaleTo,$xFrom,$xTo, $color)
|
||||
{
|
||||
global $plot;
|
||||
global $image1Width;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $image1Height;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image1;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $image1Width - $leftMargin - $rightMargin;
|
||||
$scaleCounter = $frameWidth/($scaleTo-$scaleFrom);
|
||||
|
||||
if ($color == 'green_value')
|
||||
$rgb = imagecolorallocatealpha($image1, 0, 255, 0, 100);
|
||||
else if ($color == 'yellow_value')
|
||||
$rgb = imagecolorallocatealpha($image1, 255, 255, 0, 100);
|
||||
else if ($color == 'red_value')
|
||||
$rgb = imagecolorallocatealpha($image1, 255, 0, 0, 100);
|
||||
|
||||
|
||||
if ($leftMargin+$xTo*$scaleCounter > $image1Width-$rightMargin) $val=$image1Width-$rightMargin;
|
||||
else $val=$leftMargin+$xTo*$scaleCounter;
|
||||
|
||||
imagefilledrectangle($image1, $leftMargin+$xFrom*$scaleCounter, $topMargin, $val, $image1Height-$bottomMargin, $rgb);
|
||||
}
|
||||
|
||||
|
||||
function plotCircleRange1($scaleXFrom,$scaleXTo,$scaleYFrom,$scaleYTo,$xParam,$yParam)
|
||||
{
|
||||
global $plot;
|
||||
global $image1Width;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $image1Height;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image1;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $image1Width - $leftMargin - $rightMargin;
|
||||
$frameHeight = $image1Height - $topMargin - $bottomMargin;
|
||||
$scaleXCounter = $frameWidth/($scaleXTo-$scaleXFrom);
|
||||
$scaleYCounter = $frameHeight/($scaleYTo-$scaleYFrom);
|
||||
if ($leftMargin+$xParam*$scaleXCounter > $image1Width-$rightMargin) $valX=$image1Width-$rightMargin;
|
||||
else $valX=$leftMargin+$xParam*$scaleXCounter;
|
||||
|
||||
$valY=($image1Height-$bottomMargin)-$yParam*$scaleYCounter;
|
||||
//$grey = imagecolorallocatealpha($image1, 150, 150, 150, 100);
|
||||
$black = imagecolorallocate( $image1 , 0 , 0 , 0 );
|
||||
imagefilledellipse($image1, $valX, $valY, 10, 10, $black);
|
||||
}
|
||||
|
||||
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,256 @@
|
||||
<?php
|
||||
|
||||
// Load the least-square regression class.
|
||||
require_once('./polynomial/XY_Plot.php' );
|
||||
|
||||
//-----------------------------------------------------------
|
||||
$imageWidth = 969;
|
||||
$imageHeight = 330;
|
||||
|
||||
$leftMargin = 25;
|
||||
$rightMargin = 50;
|
||||
|
||||
$topMargin = 25;
|
||||
$bottomMargin = 40;
|
||||
|
||||
// Verticle scale
|
||||
$Y_MajorScale = 0.1;
|
||||
$Y_MinorScale = $Y_MajorScale / 5;
|
||||
$X_MajorScale = 0.1;
|
||||
$X_MinorScale = $X_MajorScale / 5;
|
||||
//-----------------------------------------------------------
|
||||
|
||||
// Create image
|
||||
$image = @imageCreate( $imageWidth , $imageHeight )
|
||||
or die( "Cannot Initialize new GD image stream" );
|
||||
|
||||
//---------------------------------
|
||||
// Create basic color map
|
||||
//---------------------------------
|
||||
$colorMap = array();
|
||||
|
||||
//$colorMap[ "Background" ] = imageColorAllocate( $image , 0xDB , 0xB3 , 0xE6 );
|
||||
$colorMap[ "Background" ] = imageColorAllocate( $image , 255, 255, 255 );
|
||||
|
||||
// Create a standard color palette
|
||||
$colorMap[ "Black" ] = imagecolorallocate( $image, 0, 0, 0 );
|
||||
$colorMap[ "Red" ] = imagecolorallocate( $image, 192, 0, 0 );
|
||||
$colorMap[ "Green" ] = imagecolorallocate( $image, 0, 192, 0 );
|
||||
$colorMap[ "Blue" ] = imagecolorallocate( $image, 0, 0, 192 );
|
||||
$colorMap[ "Brown" ] = imagecolorallocate( $image, 48, 48, 0 );
|
||||
$colorMap[ "Cyan" ] = imagecolorallocate( $image, 0, 192, 192 );
|
||||
$colorMap[ "Purple" ] = imagecolorallocate( $image, 192, 0, 192 );
|
||||
$colorMap[ "LightGray" ] = imagecolorallocate( $image, 192, 192, 192 );
|
||||
|
||||
$colorMap[ "DarkGray" ] = imagecolorallocate( $image, 48, 48, 48 );
|
||||
$colorMap[ "LightRed" ] = imagecolorallocate( $image, 255, 0, 0 );
|
||||
$colorMap[ "LightGreen" ] = imagecolorallocate( $image, 0, 255, 0 );
|
||||
$colorMap[ "LightBlue" ] = imagecolorallocate( $image, 0, 0, 255 );
|
||||
$colorMap[ "Yellow" ] = imagecolorallocate( $image, 255, 255, 0 );
|
||||
$colorMap[ "LightCyan" ] = imagecolorallocate( $image, 0, 255, 255 );
|
||||
$colorMap[ "LightPurple" ] = imagecolorallocate( $image, 255, 0, 255 );
|
||||
$colorMap[ "White" ] = imagecolorallocate( $image, 255, 255, 255 );
|
||||
$colorMap[ "DarkYellow" ] = imagecolorallocate( $image, 255, 214, 0 );
|
||||
|
||||
$colorMap[ "Gray10" ] = imagecolorallocate( $image , 26 , 26 , 26 );
|
||||
$colorMap[ "Gray20" ] = imagecolorallocate( $image , 51 , 51 , 51 );
|
||||
$colorMap[ "Gray30" ] = imagecolorallocate( $image , 77 , 77 , 77 );
|
||||
$colorMap[ "Gray40" ] = imagecolorallocate( $image , 102 , 102 , 102 );
|
||||
$colorMap[ "Gray50" ] = imagecolorallocate( $image , 128 , 128 , 128 );
|
||||
$colorMap[ "Gray60" ] = imagecolorallocate( $image , 154 , 154 , 154 );
|
||||
$colorMap[ "Gray70" ] = imagecolorallocate( $image , 180 , 180 , 180 );
|
||||
$colorMap[ "Gray80" ] = imagecolorallocate( $image , 205 , 205 , 205 );
|
||||
$colorMap[ "Gray90" ] = imagecolorallocate( $image , 230 , 230 , 230 );
|
||||
|
||||
// New plot
|
||||
$plot = new XY_PlotClass( $image );
|
||||
|
||||
// Setup boundaries
|
||||
$plot->sizeWindow
|
||||
(
|
||||
$leftMargin,
|
||||
$topMargin,
|
||||
$imageWidth - $rightMargin,
|
||||
$imageHeight - $bottomMargin
|
||||
);
|
||||
|
||||
// Draw border around graph area.
|
||||
imageRectangle
|
||||
(
|
||||
$image,
|
||||
$leftMargin,
|
||||
$topMargin,
|
||||
$imageWidth - $rightMargin,
|
||||
$imageHeight - $bottomMargin,
|
||||
$colorMap[ "LightGray" ]
|
||||
);
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
function plotRenderData( $data, $color )
|
||||
{
|
||||
global $plot;
|
||||
|
||||
$plot->resetData();
|
||||
foreach ( $data as $point )
|
||||
$plot->addData( $point[ 0 ], $point[ 1 ] );
|
||||
|
||||
$plot->setColor( $color );
|
||||
|
||||
$plot->autoScaleX_MinMax( 0 );
|
||||
$plot->autoScaleY_MinMax( 1 );
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Custom vertical text-- just return value with dolor sign in front
|
||||
//---------------------------------------------------------------------------
|
||||
function textCallback( $Value )
|
||||
{
|
||||
return number_format( $Value, 1 );
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
function plotAddScale()
|
||||
{
|
||||
global $plot;
|
||||
global $X_MajorScale;
|
||||
global $X_MinorScale;
|
||||
global $Y_MajorScale;
|
||||
global $Y_MinorScale;
|
||||
global $colorMap;
|
||||
|
||||
// Setup and draw minor horizontal scale (right to left).
|
||||
$plot->SetX_MinorDivisionScale( $X_MinorScale );
|
||||
$plot->SetX_MinorDivisionColor( $colorMap[ "Gray90" ] );
|
||||
$plot->DrawX_MinorDivisions();
|
||||
|
||||
// Setup and draw minor vertical scale (top to bottom).
|
||||
$plot->SetY_MinorDivisionScale( $Y_MinorScale );
|
||||
$plot->SetY_MinorDivisionColor( $colorMap[ "Gray90" ] );
|
||||
$plot->DrawY_MinorDivisions();
|
||||
|
||||
//----------------------------------
|
||||
// Setup and draw major horizontal scale (right to left).
|
||||
//----------------------------------
|
||||
|
||||
// Extend lines 5 pixels past margins for label.
|
||||
$plot->SetX_MajorDivisionExtention( 5 );
|
||||
|
||||
// Scale.
|
||||
$plot->SetX_MajorDivisionScale( $X_MajorScale );
|
||||
|
||||
// Division lines are blue.
|
||||
$plot->SetX_MajorDivisionColor( $colorMap[ "Gray80" ] );
|
||||
|
||||
// Text labels are dark gray.
|
||||
$plot->SetX_MajorDivisionTextColor( $colorMap[ "Black" ] );
|
||||
$plot->SetX_MajorTextCallback( "textCallback" );
|
||||
|
||||
// Draw it.
|
||||
$plot->DrawX_MajorDivisions();
|
||||
|
||||
//----------------------------------
|
||||
// Setup and draw major vertical scale (top to bottom)
|
||||
//----------------------------------
|
||||
|
||||
// Extend lines 5 pixels past margins for label.
|
||||
$plot->SetY_MajorDivisionExtention( 5 );
|
||||
|
||||
// Scale.
|
||||
$plot->SetY_MajorDivisionScale( $Y_MajorScale );
|
||||
|
||||
// Divisions in dark gray.
|
||||
$plot->SetY_MajorDivisionColor( $colorMap[ "Gray80" ] );
|
||||
$plot->SetY_MajorTextCallback( "textCallback" );
|
||||
|
||||
// Lables in dark gray.
|
||||
$plot->SetY_MajorDivisionTextColor( $colorMap[ "Black" ] );
|
||||
|
||||
// Draw it.
|
||||
$plot->DrawY_MajorDivisions();
|
||||
}
|
||||
|
||||
function plotRenderRegression( $regression, $coefficients, $min, $max, $color )
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
|
||||
$plot->resetData();
|
||||
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
for ( $xIndex = 0; $xIndex < $frameWidth; ++$xIndex )
|
||||
{
|
||||
$x = $xIndex * ( $max - $min ) / $frameWidth + $min;
|
||||
$y = $regression->interpolate( $coefficients, $x );
|
||||
$plot->addData( $x, $y );
|
||||
}
|
||||
|
||||
$plot->setColor( $color );
|
||||
$plot->renderWithLines();
|
||||
|
||||
}
|
||||
|
||||
|
||||
function plotRectangleRange($scaleFrom,$scaleTo,$xFrom,$xTo, $color)
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $imageHeight;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
$scaleCounter = $frameWidth/($scaleTo-$scaleFrom);
|
||||
|
||||
if ($color == 'green_value')
|
||||
$rgb = imagecolorallocatealpha($image, 0, 255, 0, 100);
|
||||
else if ($color == 'yellow_value')
|
||||
$rgb = imagecolorallocatealpha($image, 255, 255, 0, 100);
|
||||
else if ($color == 'red_value')
|
||||
$rgb = imagecolorallocatealpha($image, 255, 0, 0, 100);
|
||||
|
||||
|
||||
if ($leftMargin+$xTo*$scaleCounter > $imageWidth-$rightMargin) $val=$imageWidth-$rightMargin;
|
||||
else $val=$leftMargin+$xTo*$scaleCounter;
|
||||
|
||||
imagefilledrectangle($image, $leftMargin+$xFrom*$scaleCounter, $topMargin, $val, $imageHeight-$bottomMargin, $rgb);
|
||||
}
|
||||
|
||||
|
||||
function plotCircleRange($scaleXFrom,$scaleXTo,$scaleYFrom,$scaleYTo,$xParam,$yParam)
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $imageHeight;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
$frameHeight = $imageHeight - $topMargin - $bottomMargin;
|
||||
$scaleXCounter = $frameWidth/($scaleXTo-$scaleXFrom);
|
||||
$scaleYCounter = $frameHeight/($scaleYTo-$scaleYFrom);
|
||||
if ($leftMargin+$xParam*$scaleXCounter > $imageWidth-$rightMargin) $valX=$imageWidth-$rightMargin;
|
||||
else $valX=$leftMargin+$xParam*$scaleXCounter;
|
||||
|
||||
$valY=($imageHeight-$bottomMargin)-$yParam*$scaleYCounter;
|
||||
//$grey = imagecolorallocatealpha($image, 150, 150, 150, 100);
|
||||
$black = imagecolorallocate( $image , 0 , 0 , 0 );
|
||||
imagefilledellipse($image, $valX, $valY, 10, 10, $black);
|
||||
}
|
||||
|
||||
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
|
||||
// Load the least-square regression class.
|
||||
require_once('./polynomial/XY_Plot.php' );
|
||||
|
||||
//-----------------------------------------------------------
|
||||
$image2Width = 969;
|
||||
$image2Height = 330;
|
||||
|
||||
$leftMargin = 25;
|
||||
$rightMargin = 50;
|
||||
|
||||
$topMargin = 25;
|
||||
$bottomMargin = 40;
|
||||
|
||||
// Verticle scale
|
||||
$Y_MajorScale = 0.1;
|
||||
$Y_MinorScale = $Y_MajorScale / 5;
|
||||
$X_MajorScale = 0.1;
|
||||
$X_MinorScale = $X_MajorScale / 5;
|
||||
//-----------------------------------------------------------
|
||||
|
||||
// Create image
|
||||
$image2 = @imageCreate( $image2Width , $image2Height )
|
||||
or die( "Cannot Initialize new GD image stream" );
|
||||
|
||||
//---------------------------------
|
||||
// Create basic color map
|
||||
//---------------------------------
|
||||
$colorMap = array();
|
||||
|
||||
//$colorMap[ "Background" ] = imageColorAllocate( $image2 , 0xDB , 0xB3 , 0xE6 );
|
||||
$colorMap[ "Background" ] = imageColorAllocate( $image2 , 255, 255, 255 );
|
||||
|
||||
// Create a standard color palette
|
||||
$colorMap[ "Black" ] = imagecolorallocate( $image2, 0, 0, 0 );
|
||||
$colorMap[ "Red" ] = imagecolorallocate( $image2, 192, 0, 0 );
|
||||
$colorMap[ "Green" ] = imagecolorallocate( $image2, 0, 192, 0 );
|
||||
$colorMap[ "Blue" ] = imagecolorallocate( $image2, 0, 0, 192 );
|
||||
$colorMap[ "Brown" ] = imagecolorallocate( $image2, 48, 48, 0 );
|
||||
$colorMap[ "Cyan" ] = imagecolorallocate( $image2, 0, 192, 192 );
|
||||
$colorMap[ "Purple" ] = imagecolorallocate( $image2, 192, 0, 192 );
|
||||
$colorMap[ "LightGray" ] = imagecolorallocate( $image2, 192, 192, 192 );
|
||||
|
||||
$colorMap[ "DarkGray" ] = imagecolorallocate( $image2, 48, 48, 48 );
|
||||
$colorMap[ "LightRed" ] = imagecolorallocate( $image2, 255, 0, 0 );
|
||||
$colorMap[ "LightGreen" ] = imagecolorallocate( $image2, 0, 255, 0 );
|
||||
$colorMap[ "LightBlue" ] = imagecolorallocate( $image2, 0, 0, 255 );
|
||||
$colorMap[ "Yellow" ] = imagecolorallocate( $image2, 255, 255, 0 );
|
||||
$colorMap[ "LightCyan" ] = imagecolorallocate( $image2, 0, 255, 255 );
|
||||
$colorMap[ "LightPurple" ] = imagecolorallocate( $image2, 255, 0, 255 );
|
||||
$colorMap[ "White" ] = imagecolorallocate( $image2, 255, 255, 255 );
|
||||
$colorMap[ "DarkYellow" ] = imagecolorallocate( $image2, 255, 214, 0 );
|
||||
|
||||
$colorMap[ "Gray10" ] = imagecolorallocate( $image2 , 26 , 26 , 26 );
|
||||
$colorMap[ "Gray20" ] = imagecolorallocate( $image2 , 51 , 51 , 51 );
|
||||
$colorMap[ "Gray30" ] = imagecolorallocate( $image2 , 77 , 77 , 77 );
|
||||
$colorMap[ "Gray40" ] = imagecolorallocate( $image2 , 102 , 102 , 102 );
|
||||
$colorMap[ "Gray50" ] = imagecolorallocate( $image2 , 128 , 128 , 128 );
|
||||
$colorMap[ "Gray60" ] = imagecolorallocate( $image2 , 154 , 154 , 154 );
|
||||
$colorMap[ "Gray70" ] = imagecolorallocate( $image2 , 180 , 180 , 180 );
|
||||
$colorMap[ "Gray80" ] = imagecolorallocate( $image2 , 205 , 205 , 205 );
|
||||
$colorMap[ "Gray90" ] = imagecolorallocate( $image2 , 230 , 230 , 230 );
|
||||
|
||||
// New plot
|
||||
$plot = new XY_PlotClass( $image2 );
|
||||
|
||||
// Setup boundaries
|
||||
$plot->sizeWindow
|
||||
(
|
||||
$leftMargin,
|
||||
$topMargin,
|
||||
$image2Width - $rightMargin,
|
||||
$image2Height - $bottomMargin
|
||||
);
|
||||
|
||||
// Draw border around graph area.
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function plotRectangleRange2($scaleFrom,$scaleTo,$xFrom,$xTo, $color)
|
||||
{
|
||||
global $plot;
|
||||
global $image2Width;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $image2Height;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image2;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $image2Width - $leftMargin - $rightMargin;
|
||||
$scaleCounter = $frameWidth/($scaleTo-$scaleFrom);
|
||||
|
||||
if ($color == 'green_value')
|
||||
$rgb = imagecolorallocatealpha($image2, 0, 255, 0, 100);
|
||||
else if ($color == 'yellow_value')
|
||||
$rgb = imagecolorallocatealpha($image2, 255, 255, 0, 100);
|
||||
else if ($color == 'red_value')
|
||||
$rgb = imagecolorallocatealpha($image2, 255, 0, 0, 100);
|
||||
|
||||
|
||||
if ($leftMargin+$xTo*$scaleCounter > $image2Width-$rightMargin) $val=$image2Width-$rightMargin;
|
||||
else $val=$leftMargin+$xTo*$scaleCounter;
|
||||
|
||||
imagefilledrectangle($image2, $leftMargin+$xFrom*$scaleCounter, $topMargin, $val, $image2Height-$bottomMargin, $rgb);
|
||||
}
|
||||
|
||||
|
||||
function plotCircleRange2($scaleXFrom,$scaleXTo,$scaleYFrom,$scaleYTo,$xParam,$yParam)
|
||||
{
|
||||
global $plot;
|
||||
global $image2Width;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
global $image2Height;
|
||||
global $topMargin;
|
||||
global $bottomMargin;
|
||||
global $image2;
|
||||
|
||||
$plot->resetData();
|
||||
$frameWidth = $image2Width - $leftMargin - $rightMargin;
|
||||
$frameHeight = $image2Height - $topMargin - $bottomMargin;
|
||||
$scaleXCounter = $frameWidth/($scaleXTo-$scaleXFrom);
|
||||
$scaleYCounter = $frameHeight/($scaleYTo-$scaleYFrom);
|
||||
if ($leftMargin+$xParam*$scaleXCounter > $image2Width-$rightMargin) $valX=$image2Width-$rightMargin;
|
||||
else $valX=$leftMargin+$xParam*$scaleXCounter;
|
||||
|
||||
$valY=($image2Height-$bottomMargin)-$yParam*$scaleYCounter;
|
||||
//$grey = imagecolorallocatealpha($image2, 150, 150, 150, 100);
|
||||
$black = imagecolorallocate( $image2 , 0 , 0 , 0 );
|
||||
imagefilledellipse($image2, $valX, $valY, 10, 10, $black);
|
||||
}
|
||||
|
||||
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
require_once('./polynomial/XY_Plot.php' );
|
||||
|
||||
function plotRenderData( $data, $color )
|
||||
{
|
||||
global $plot;
|
||||
|
||||
$plot->resetData();
|
||||
foreach ( $data as $point )
|
||||
$plot->addData( $point[ 0 ], $point[ 1 ] );
|
||||
|
||||
$plot->setColor( $color );
|
||||
|
||||
$plot->autoScaleX_MinMax( 0 );
|
||||
$plot->autoScaleY_MinMax( 1 );
|
||||
}
|
||||
function textCallback( $Value )
|
||||
{
|
||||
return number_format( $Value, 1 );
|
||||
}
|
||||
function plotAddScale()
|
||||
{
|
||||
global $plot;
|
||||
global $X_MajorScale;
|
||||
global $X_MinorScale;
|
||||
global $Y_MajorScale;
|
||||
global $Y_MinorScale;
|
||||
global $colorMap;
|
||||
|
||||
// Setup and draw minor horizontal scale (right to left).
|
||||
$plot->SetX_MinorDivisionScale( $X_MinorScale );
|
||||
$plot->SetX_MinorDivisionColor( $colorMap[ "Gray90" ] );
|
||||
$plot->DrawX_MinorDivisions();
|
||||
|
||||
// Setup and draw minor vertical scale (top to bottom).
|
||||
$plot->SetY_MinorDivisionScale( $Y_MinorScale );
|
||||
$plot->SetY_MinorDivisionColor( $colorMap[ "Gray90" ] );
|
||||
$plot->DrawY_MinorDivisions();
|
||||
|
||||
//----------------------------------
|
||||
// Setup and draw major horizontal scale (right to left).
|
||||
//----------------------------------
|
||||
|
||||
// Extend lines 5 pixels past margins for label.
|
||||
$plot->SetX_MajorDivisionExtention( 5 );
|
||||
|
||||
// Scale.
|
||||
$plot->SetX_MajorDivisionScale( $X_MajorScale );
|
||||
|
||||
// Division lines are blue.
|
||||
$plot->SetX_MajorDivisionColor( $colorMap[ "Gray80" ] );
|
||||
|
||||
// Text labels are dark gray.
|
||||
$plot->SetX_MajorDivisionTextColor( $colorMap[ "Black" ] );
|
||||
$plot->SetX_MajorTextCallback( "textCallback" );
|
||||
|
||||
// Draw it.
|
||||
$plot->DrawX_MajorDivisions();
|
||||
|
||||
//----------------------------------
|
||||
// Setup and draw major vertical scale (top to bottom)
|
||||
//----------------------------------
|
||||
|
||||
// Extend lines 5 pixels past margins for label.
|
||||
$plot->SetY_MajorDivisionExtention( 5 );
|
||||
|
||||
// Scale.
|
||||
$plot->SetY_MajorDivisionScale( $Y_MajorScale );
|
||||
|
||||
// Divisions in dark gray.
|
||||
$plot->SetY_MajorDivisionColor( $colorMap[ "Gray80" ] );
|
||||
$plot->SetY_MajorTextCallback( "textCallback" );
|
||||
|
||||
// Lables in dark gray.
|
||||
$plot->SetY_MajorDivisionTextColor( $colorMap[ "Black" ] );
|
||||
|
||||
// Draw it.
|
||||
$plot->DrawY_MajorDivisions();
|
||||
}
|
||||
function plotRenderRegression( $regression, $coefficients, $min, $max, $color )
|
||||
{
|
||||
global $plot;
|
||||
global $imageWidth;
|
||||
global $leftMargin;
|
||||
global $rightMargin;
|
||||
|
||||
$plot->resetData();
|
||||
|
||||
$frameWidth = $imageWidth - $leftMargin - $rightMargin;
|
||||
for ( $xIndex = 0; $xIndex < $frameWidth; ++$xIndex )
|
||||
{
|
||||
$x = $xIndex * ( $max - $min ) / $frameWidth + $min;
|
||||
$y = $regression->interpolate( $coefficients, $x );
|
||||
$plot->addData( $x, $y );
|
||||
}
|
||||
|
||||
$plot->setColor( $color );
|
||||
$plot->renderWithLines();
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
Reference in New Issue
Block a user