intermédiaire - no use

This commit is contained in:
2018-10-06 09:56:23 +02:00
parent ebf5b0d648
commit e121c6f6dd
11 changed files with 1440 additions and 0 deletions

123
global/inc/colors.php Normal file
View File

@@ -0,0 +1,123 @@
<?php
class ColorGradient
{
public $pct;
public $color;
public static function RGB2HSV($R, $G, $B) // RGB values: 0-255, 0-255, 0-255
{ // HSV values: 0-360, 0-100, 0-100
// Convert the RGB byte-values to percentages
$R = ($R / 255);
$G = ($G / 255);
$B = ($B / 255);
// Calculate a few basic values, the maximum value of R,G,B, the
// minimum value, and the difference of the two (chroma).
$maxRGB = max($R, $G, $B);
$minRGB = min($R, $G, $B);
$chroma = $maxRGB - $minRGB;
// Value (also called Brightness) is the easiest component to calculate,
// and is simply the highest value among the R,G,B components.
// We multiply by 100 to turn the decimal into a readable percent value.
$computedV = 100 * $maxRGB;
// Special case if hueless (equal parts RGB make black, white, or grays)
// Note that Hue is technically undefined when chroma is zero, as
// attempting to calculate it would cause division by zero (see
// below), so most applications simply substitute a Hue of zero.
// Saturation will always be zero in this case, see below for details.
if ($chroma == 0)
return array(0, 0, $computedV);
// Saturation is also simple to compute, and is simply the chroma
// over the Value (or Brightness)
// Again, multiplied by 100 to get a percentage.
$computedS = 100 * ($chroma / $maxRGB);
// Calculate Hue component
// Hue is calculated on the "chromacity plane", which is represented
// as a 2D hexagon, divided into six 60-degree sectors. We calculate
// the bisecting angle as a value 0 <= x < 6, that represents which
// portion of which sector the line falls on.
if ($R == $minRGB)
$h = 3 - (($G - $B) / $chroma);
elseif ($B == $minRGB)
$h = 1 - (($R - $G) / $chroma);
else // $G == $minRGB
$h = 5 - (($B - $R) / $chroma);
// After we have the sector position, we multiply it by the size of
// each sector's arc (60 degrees) to obtain the angle in degrees.
$computedH = 60 * $h;
return array($computedH, $computedS, $computedV);
}
public static function HSV2RGB($h, $s, $v)
{
$s /= 256.0;
if ($s == 0.0) return array($v,$v,$v);
$h /= (256.0 / 6.0);
$i = floor($h);
$f = $h - $i;
$p = (integer)($v * (1.0 - $s));
$q = (integer)($v * (1.0 - $s * $f));
$t = (integer)($v * (1.0 - $s * (1.0 - $f)));
switch($i) {
case 0: return array($v,$t,$p);
case 1: return array($q,$v,$p);
case 2: return array($p,$v,$t);
case 3: return array($p,$q,$v);
case 4: return array($t,$p,$v);
default: return array($v,$p,$q);
}
}
public static function gradient($from_color, $to_color, $graduations = 10)
{
$graduations--;
$startcol = str_replace("#", "", $from_color);
$endcol = str_replace("#", "", $to_color);
$RedOrigin = hexdec(substr($startcol, 0, 2));
$GrnOrigin = hexdec(substr($startcol, 2, 2));
$BluOrigin = hexdec(substr($startcol, 4, 2));
if ($graduations >= 2) { // for at least 3 colors
$GradientSizeRed = (hexdec(substr($endcol, 0, 2)) - $RedOrigin) / $graduations; //Graduation Size Red
$GradientSizeGrn = (hexdec(substr($endcol, 2, 2)) - $GrnOrigin) / $graduations;
$GradientSizeBlu = (hexdec(substr($endcol, 4, 2)) - $BluOrigin) / $graduations;
for ($i = 0; $i <= $graduations; $i++) {
$RetVal[$i] = strtoupper("#" . str_pad(dechex($RedOrigin + ($GradientSizeRed * $i)), 2, '0', STR_PAD_LEFT) .
str_pad(dechex($GrnOrigin + ($GradientSizeGrn * $i)), 2, '0', STR_PAD_LEFT) .
str_pad(dechex($BluOrigin + ($GradientSizeBlu * $i)), 2, '0', STR_PAD_LEFT));
}
} elseif ($graduations == 1) { // exactlly 2 colors
$RetVal[] = $from_color;
$RetVal[] = $to_color;
} else { // one color
$RetVal[] = $from_color;
}
return $RetVal;
}
public static function hex2rgb($hex)
{
return sscanf($hex, "#%02x%02x%02x");
}
// ---
// --- Local fonctions
// ---
public static function rgb2hex($rgb)
{
$hex = "#";
$hex .= str_pad(dechex($rgb[0]), 2, "0", STR_PAD_LEFT);
$hex .= str_pad(dechex($rgb[1]), 2, "0", STR_PAD_LEFT);
$hex .= str_pad(dechex($rgb[2]), 2, "0", STR_PAD_LEFT);
return $hex; // returns the hex value including the number sign (#)
}
}
?>

View File

@@ -20,6 +20,8 @@ define('SOLD_PATH', TOPISTO_PATH.'/sold');
define('OFFLINE_PATH', RESS_PATH.'/offline');
define('TX_HASH_LEN',64);
define('GRAPH_WIDTH', 400);
define('GRAPH_HEIGHT', 300);

153
global/inc/cubic.php Normal file
View File

@@ -0,0 +1,153 @@
<?php
class Plot
{
private $aCoords;
function __construct(&$aCoords)
{
$this->aCoords = &$aCoords;
}
public function drawLine($vImage, $vColor, $iPosX = 0, $imaxX = false)
{
$maxX = $imaxX;
if ($imaxX === false) $maxX = imagesx($vImage);
reset($this->aCoords);
list($iPrevX, $iPrevY) = each($this->aCoords);
while (list ($x, $y) = each($this->aCoords))
{
$laCouleur = null;
if (!is_array($vColor)) $laCouleur = $vColor;
else
{
$s = count($vColor) - 1;
$laCouleur = $vColor[$s]->color;
$pct = $x / $maxX;
while(($s>0)&&($pct < $vColor[$s]->pct))
{
$s -= 1;
$laCouleur = $vColor[$s]->color;
}
}
imageline($vImage, round($iPrevX), round($iPrevY), round($x), round($y), $laCouleur);
$iPrevX = $x;
$iPrevY = $y;
}
}
public function drawDots($vImage, $vColor, $iPosX = 0, $iPosY = false, $iDotSize = 1) {
if ($iPosY === false)
$iPosY = imagesy($vImage);
$vBorderColor = imagecolorallocate($vImage, 0, 0, 0);
foreach ($this->aCoords as $x => $y) {
imagefilledellipse($vImage, $iPosX + round($x), $iPosY - round($y), $iDotSize, $iDotSize, $vColor);
imageellipse($vImage, $iPosX + round($x), $iPosY - round($y), $iDotSize, $iDotSize, $vBorderColor);
}
}
public function drawAxis($vImage, $vColor, $iPosX = 0, $iPosY = false) {
if ($iPosY === false) $iPosY = imagesy($vImage);
$vImageWidth = imagesx($vImage);
imageline($vImage, $iPosX, $iPosY, $iPosX, 0, $vColor);
imageline($vImage, $iPosX, $iPosY, $vImageWidth, $iPosY, $vColor);
imagefilledpolygon($vImage, array($iPosX, 0, $iPosX - 3, 5, $iPosX + 3, 5), 3, $vColor);
imagefilledpolygon($vImage, array($vImageWidth, $iPosY, $vImageWidth - 5, $iPosY - 3, $vImageWidth - 5, $iPosY + 3), 3, $vColor);
}
}
class CubicSplines
{
protected $aCoords;
protected $aCrdX;
protected $aCrdY;
protected $aSplines = array();
protected $iMinX;
protected $iMaxX;
protected $iStep;
protected function prepareCoords(&$aCoords, $iStep, $iMinX = -1, $iMaxX = -1) {
$this->aCrdX = array();
$this->aCrdY = array();
$this->aCoords = array();
ksort($aCoords);
foreach ($aCoords as $x => $y) {
$this->aCrdX[] = $x;
$this->aCrdY[] = $y;
}
$this->iMinX = $iMinX;
$this->iMaxX = $iMaxX;
if ($this->iMinX == -1)
$this->iMinX = min($this->aCrdX);
if ($this->iMaxX == -1)
$this->iMaxX = max($this->aCrdX);
$this->iStep = $iStep;
}
public function setInitCoords(&$aCoords, $iStep = 1, $iMinX = -1, $iMaxX = -1) {
$this->aSplines = array();
if (count($aCoords) < 4) {
return false;
}
$this->prepareCoords($aCoords, $iStep, $iMinX, $iMaxX);
$this->buildSpline($this->aCrdX, $this->aCrdY, count($this->aCrdX));
}
public function processCoords() {
for ($x = $this->iMinX; $x <= $this->iMaxX; $x += $this->iStep) {
$this->aCoords[$x] = $this->funcInterp($x);
}
return $this->aCoords;
}
private function buildSpline($x, $y, $n) {
for ($i = 0; $i < $n; ++$i) {
$this->aSplines[$i]['x'] = $x[$i];
$this->aSplines[$i]['a'] = $y[$i];
}
$this->aSplines[0]['c'] = $this->aSplines[$n - 1]['c'] = 0;
$alpha[0] = $beta[0] = 0;
for ($i = 1; $i < $n - 1; ++$i) {
$h_i = $x[$i] - $x[$i - 1];
$h_i1 = $x[$i + 1] - $x[$i];
$A = $h_i;
$C = 2.0 * ($h_i + $h_i1);
$B = $h_i1;
$F = 6.0 * (($y[$i + 1] - $y[$i]) / $h_i1 - ($y[$i] - $y[$i - 1]) / $h_i);
$z = ($A * $alpha[$i - 1] + $C);
$alpha[$i] = - $B / $z;
$beta[$i] = ($F - $A * $beta[$i - 1]) / $z;
}
for ($i = $n - 2; $i > 0; --$i) {
$this->aSplines[$i]['c'] = $alpha[$i] * $this->aSplines[$i + 1]['c'] + $beta[$i];
}
for ($i = $n - 1; $i > 0; --$i) {
$h_i = $x[$i] - $x[$i - 1];
$this->aSplines[$i]['d'] = ($this->aSplines[$i]['c'] - $this->aSplines[$i - 1]['c']) / $h_i;
$this->aSplines[$i]['b'] = $h_i * (2.0 * $this->aSplines[$i]['c'] + $this->aSplines[$i - 1]['c']) / 6.0 + ($y[$i] - $y[$i - 1]) / $h_i;
}
}
private function funcInterp($x) {
$n = count($this->aSplines);
if ($x <= $this->aSplines[0]['x']) {
$s = $this->aSplines[1];
} else {
if ($x >= $this->aSplines[$n - 1]['x']) {
$s = $this->aSplines[$n - 1];
} else {
$i = 0;
$j = $n - 1;
while ($i + 1 < $j) {
$k = $i + ($j - $i) / 2;
if ($x <= $this->aSplines[$k]['x']) {
$j = $k;
} else {
$i = $k;
}
}
$s = $this->aSplines[$j];
}
}
$dx = ($x - $s['x']);
return $s['a'] + ($s['b'] + ($s['c'] / 2.0 + $s['d'] * $dx / 6.0) * $dx) * $dx;
}
}
?>