Oleg Sh 43a4b44a22 Change script location.
Split js code.
Added cache and changed loading mechanism for js sources.
2023-11-06 19:16:50 +02:00

199 lines
5.2 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 g_modernGraphStyleName;// local == "ru" ? "Визуализация на основе весов" : "Visualisation based on weight";
}
ModernGraphStyle.prototype.getId = function()
{
return "OlegSh.ModernGraphStyle";
}
// @return message for user.
ModernGraphStyle.prototype.getMessage = function(local)
{
return g_done;
}
ModernGraphStyle.prototype.result = function(resultCallback)
{
var result = {};
result["version"] = 1;
this.vertexVisualization2();
this.edgeVisualization();
return result;
}
ModernGraphStyle.prototype.vertexVisualization = function()
{
var degree = getVertexToVertexArray(this.graph, false);
var graph = this.graph;
var maxDegree = 0;
var sumDegree = 0;
var sumOfDiameters = graph.vertices.length * (new VertexModel()).diameter;
// 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);
sumDegree = sumDegree + 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;
vertex.model.diameter = Math.max(Math.min((currentDegree / sumDegree) * sumOfDiameters, this.maxVertexSize), this.minVertexSize);
//sumOfDiameters
}
else
{
vertex.model.diameter = this.minVertexSize;
}
}
}
ModernGraphStyle.prototype.vertexVisualization2 = function()
{
var degree = {};
var graph = this.graph;
var sumDegree = 0;
var sumOfDiameters = graph.vertices.length * (new VertexModel()).diameter;
// Search max vertex degree.
for (var i = 0; i < graph.edges.length; i++)
{
var edge = graph.edges[i];
if (!degree.hasOwnProperty(edge.vertex1.id))
{
degree[edge.vertex1.id] = 0;
}
if (!degree.hasOwnProperty(edge.vertex2.id))
{
degree[edge.vertex2.id] = 0;
}
var currentWeight = 0;
if (edge.isDirect)
{
currentWeight = edge.GetWeight() / 2;
}
else
{
currentWeight = edge.GetWeight();
}
sumDegree = sumDegree + 2 * currentWeight;
degree[edge.vertex1.id] += currentWeight;
degree[edge.vertex2.id] += currentWeight;
}
console.log("sumDegree = " + sumDegree);
for (var i = 0; i < graph.vertices.length; i++)
{
var vertex = graph.vertices[i];
if (degree.hasOwnProperty(vertex.id))
{
var currentDegree = degree[vertex.id];
console.log(currentDegree / sumDegree);
vertex.model.diameter = Math.max(Math.min((currentDegree / sumDegree) * sumOfDiameters, this.maxVertexSize), this.minVertexSize);
//sumOfDiameters
}
else
{
vertex.model.diameter = this.minVertexSize;
}
}
}
ModernGraphStyle.prototype.edgeVisualization = function()
{
var graph = this.graph;
var maxEdgeWeight = 0;
var sumWeight = 0;
var sumOfDiameters = graph.edges.length * (new EdgeModel()).width;
// 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);
sumWeight = sumWeight + 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;
edge.model.width = Math.max(Math.min((edge.weight / sumWeight) * sumOfDiameters, this.maxEdgeSize), this.minEdgeSize);
}
else
{
edge.model.width = this.minEdgeSize;
}
}
}
}
ModernGraphStyle.prototype.getObjectSelectedGroup = function(object)
{
return 0;
}
// Algorithm support multi graph
ModernGraphStyle.prototype.IsSupportMultiGraph = function()
{
return true;
}
// Factory for connected components.
function CreateAlgorithmModernGraphStyle(graph, app)
{
return new ModernGraphStyle(graph, app)
}
// Gerister connected component.
RegisterAlgorithm (CreateAlgorithmModernGraphStyle);