151 lines
5.6 KiB
PHP
151 lines
5.6 KiB
PHP
<?php
|
|
|
|
include_once 'Cluster.php';
|
|
/*
|
|
* To change this template, choose Tools | Templates
|
|
* and open the template in the editor.
|
|
*/
|
|
|
|
/**
|
|
* Description of View
|
|
*
|
|
* @author stubbfel
|
|
*/
|
|
class View {
|
|
|
|
private $viewArray;
|
|
private $clusterCount;
|
|
private $peerCount;
|
|
private $viewId;
|
|
private $peerClusterRatioRef;
|
|
private $peerClusterRatioNormVar;
|
|
private $peerClusterRatioNormStDev;
|
|
private $peerClusterRatioNormMed;
|
|
private $clusterList;
|
|
|
|
public function __construct($viewArray = array(), $viewId) {
|
|
$this->viewArray = $viewArray;
|
|
$this->clusterCount = $this->viewArray["cn"];
|
|
$this->peerCount = $this->viewArray["pn"];
|
|
$this->viewId = $viewId;
|
|
$this->createClusterList();
|
|
$this->calcPeerClusterRatio();
|
|
}
|
|
|
|
private function createClusterList() {
|
|
$clusterArray = $this->viewArray["clusters"];
|
|
$this->clusterList = array();
|
|
foreach ($clusterArray as $key => $value) {
|
|
$cluster = new Cluster($value, $key);
|
|
array_push($this->clusterList, $cluster);
|
|
}
|
|
}
|
|
|
|
private function clusterListToHTML() {
|
|
$result = "<table width=\"100%\">";
|
|
foreach ($this->clusterList as $value) {
|
|
$result .= "<tr><td>";
|
|
$result .= $value->toHTML();
|
|
$result .= "</td></tr>";
|
|
}
|
|
return $result . "</table>";
|
|
}
|
|
|
|
private function calcPeerClusterRatio() {
|
|
$this->peerClusterRatioRef = round($this->peerCount / $this->clusterCount, 5);
|
|
$variance = 0.0;
|
|
$medianArray = array();
|
|
foreach ($this->clusterList as $value) {
|
|
$value->calcPeerClusterRatioNorm($this->peerClusterRatioRef);
|
|
$variance += pow($value->clusterSize - $this->peerClusterRatioRef, 2);
|
|
array_push($medianArray, $value->clusterSize);
|
|
}
|
|
|
|
$variance /= $this->peerCount;
|
|
$this->peerClusterRatioNormVar = round($variance, 5);
|
|
$this->peerClusterRatioNormStDev = round(sqrt($variance), 5);
|
|
|
|
asort($medianArray);
|
|
|
|
$medianArraySize = count($medianArray);
|
|
$medianMidIndex = round(($medianArraySize - 1) / 2, 0, PHP_ROUND_HALF_DOWN);
|
|
if ($medianArraySize % 2 == 0) {
|
|
$this->peerClusterRatioNormMed = ($medianArray[$medianMidIndex] + $medianArray[$medianMidIndex + 1]) / 2;
|
|
} else {
|
|
$this->peerClusterRatioNormMed = $medianArray[$medianMidIndex];
|
|
}
|
|
}
|
|
|
|
public function toHTML() {
|
|
$table = "<table border=\"1\"><colgroup width=\"100%\" span=\"8\"></colgroup>";
|
|
$table .= "<tr>";
|
|
$table .= "<th colspan=\"4\">ViewId:</th><th colspan=\"4\">$this->viewId</th>";
|
|
$table .= "</tr>";
|
|
$table .= "<tr>";
|
|
$table .= "<td colspan=\"1\">ClusterCount:</td><td colspan=\"3\" align=\"center\" >$this->clusterCount</td>";
|
|
$table .= "<td colspan=\"1\">PeerCount:</td><td colspan=\"3\" align=\"center\" >$this->peerCount</td>";
|
|
$table .= "</tr>";
|
|
$table .= "<tr>";
|
|
$table .= "<td>PeerClusterRatioRef:</td><td align=\"center\" >$this->peerClusterRatioRef </td>";
|
|
$table .= "<td>PeerClusterRatioNormVar:</td><td align=\"center\" >$this->peerClusterRatioNormVar</td>";
|
|
$table .= "<td>PeerClusterRatioNormStDev:</td><td align=\"center\" >$this->peerClusterRatioNormStDev</td>";
|
|
$table .= "<td>PeerClusterRatioNormMed:</td><td align=\"center\" >$this->peerClusterRatioNormMed</td>";
|
|
$table .= "</tr>";
|
|
$table .= "<tr><td>ClusterListe:</td> <td colspan=\"7\">";
|
|
$table .= $this->clusterListToHTML();
|
|
$table .= "</td></tr>";
|
|
$table .= "<tr><td colspan=\"8\">";
|
|
$table .= $this->toSVG();
|
|
$table .= "</td></tr>";
|
|
$table .= "</table>";
|
|
return $table;
|
|
}
|
|
|
|
public function toSVG() {
|
|
$svg = '<svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" xmlns:ev = "http://www.w3.org/2001/xml-events" version = "1.1" baseProfile = "full" width="100%" height="350">';
|
|
$svg .= $this->createClusterSVG();
|
|
//$svg .= '<circle cx = "110" cy = "110" r = "10" fill = "full" />';
|
|
//$svg .= '<circle cx = "410" cy = "110" r = "100" stroke = "#4e9a06" stroke-width = "4" fill = "none" />';
|
|
//$svg .= '<circle cx = "410" cy = "110" r = "10" fill = "full" />';
|
|
//$svg .= '<line x1 = "110" y1 = "110" x2 = "410" y2 = "110" style = "stroke:rgb(255,0,0);stroke-width:2"/>';
|
|
$svg .= '</svg >';
|
|
return $svg;
|
|
}
|
|
|
|
public function createClusterSVG() {
|
|
$midX = 160;
|
|
$midY = 160;
|
|
$svg = "";
|
|
foreach ($this->clusterList as $value) {
|
|
$clSize = $value->clusterSize;
|
|
$r = $clSize * 15;
|
|
$strokebg = "gray";
|
|
if (strcmp($value->bgColor,"white") != 0) {
|
|
$strokebg = $value->bgColor;
|
|
}
|
|
$svg .= '<circle cx = "' . $midX . '" cy = "' . $midY . '" r = "' . $r . '" stroke = "'.$strokebg.'" stroke-width = "4" fill = "none" />';
|
|
$svg .= $this->fillPoints($midX, $midY, $clSize, $r);
|
|
$midX += 2.5 * $r;
|
|
}
|
|
|
|
return $svg;
|
|
}
|
|
|
|
public function fillPoints($midX, $midY, $count, $r) {
|
|
$startX = $midX - $r;
|
|
$endX = $midX + $r;
|
|
$startY = $midY - $r;
|
|
$endY = $midY + $r;
|
|
$midXT = $startX + 15;
|
|
$midYT = $midY;
|
|
$svg = "";
|
|
for ($i = 0; $i < $count; $i++) {
|
|
$svg .= '<circle cx = "' . $midXT . '" cy = "' . $midYT . '" r = "10" fill = "full" />';
|
|
$midXT += 30;
|
|
}
|
|
return $svg;
|
|
}
|
|
|
|
}
|
|
?>
|