graphonline/script/plugins/ModernGraphStyle.js

129 lines
3.0 KiB
JavaScript

/**
* Algorithm for modern style of graph.
*
*/
function ModernGraphStyle(graph, app)
{
BaseAlgorithm.apply(this, arguments);
this.minVertexSize = 20;
this.maxVertexSize = 100;
this.minEdgeSize = 2;
this.maxEdgeSize = 12;
}
// inheritance.
ModernGraphStyle.prototype = Object.create(BaseAlgorithm.prototype);
ModernGraphStyle.prototype.getName = function(local)
{
return local == "ru" ? "Визуализация на основе весов" : "Visualisation based on weight";
}
ModernGraphStyle.prototype.getId = function()
{
return "OlegSh.ModernGraphStyle";
}
// @return message for user.
ModernGraphStyle.prototype.getMessage = function(local)
{
return (local == "ru" ? "Готово" : "Done");
}
ModernGraphStyle.prototype.result = function(resultCallback)
{
var result = {};
result["version"] = 1;
this.vertexVisualization();
this.edgeVisualization();
return result;
}
ModernGraphStyle.prototype.vertexVisualization = function()
{
var degree = getVertexToVertexArray(this.graph, false);
var graph = this.graph;
var maxDegree = 0;
// Search max vertex degree.
for (var i = 0; i < graph.vertices.length; i++)
{
var vertex = graph.vertices[i];
if (degree.hasOwnProperty(vertex.id))
{
var currentDegree = degree[vertex.id].length;
maxDegree = Math.max(maxDegree, currentDegree);
}
}
for (var i = 0; i < graph.vertices.length; i++)
{
var vertex = graph.vertices[i];
if (degree.hasOwnProperty(vertex.id))
{
var currentDegree = degree[vertex.id].length;
vertex.model.diameter = (currentDegree / maxDegree) * (this.maxVertexSize - this.minVertexSize) + this.minVertexSize;
}
else
{
vertex.model.diameter = this.minVertexSize;
}
}
}
ModernGraphStyle.prototype.edgeVisualization = function()
{
var graph = this.graph;
var maxEdgeWeight = 0;
// Search max edge weight.
for (var i = 0; i < graph.edges.length; i++)
{
var edge = graph.edges[i];
if (edge.useWeight)
{
maxEdgeWeight = Math.max(maxEdgeWeight, edge.weight);
}
}
// Search max edge weight.
if (maxEdgeWeight != 0)
{
for (var i = 0; i < graph.edges.length; i++)
{
var edge = graph.edges[i];
if (edge.useWeight)
{
edge.model.width = (edge.weight / maxEdgeWeight) * (this.maxEdgeSize - this.minEdgeSize) + this.minEdgeSize;
}
else
{
edge.model.width = this.minEdgeSize;
}
}
}
}
ModernGraphStyle.prototype.getObjectSelectedGroup = function(object)
{
return 0;
}
// Factory for connected components.
function CreateAlgorithmModernGraphStyle(graph, app)
{
return new ModernGraphStyle(graph, app)
}
// Gerister connected component.
RegisterAlgorithm (CreateAlgorithmModernGraphStyle);