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

236 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Find short path.
*
*/
function FloidAlgorithm(graph, app)
{
BaseAlgorithmEx.apply(this, arguments);
this.selectedObjects = {};
this.matrix = [];
this.updateMessage(false);
this.edgesCopy = [];
}
// inheritance.
FloidAlgorithm.prototype = Object.create(BaseAlgorithmEx.prototype);
// First selected.
FloidAlgorithm.prototype.firstObject = null;
// Second selected.
FloidAlgorithm.prototype.secondObject = null;
// Path
FloidAlgorithm.prototype.pathObjects = null;
// infinity
FloidAlgorithm.prototype.infinity = 1E8;
FloidAlgorithm.prototype.getName = function(local)
{
return g_FloidName; //local == "ru" ? "Алгоритм Флойда — Уоршелла" : "FloydWarshall algorithm";
}
FloidAlgorithm.prototype.getId = function()
{
return "OlegSh.FloidAlgorithm";
}
// @return message for user.
FloidAlgorithm.prototype.getMessage = function(local)
{
return this.message;
}
FloidAlgorithm.prototype.getCategory = function()
{
return 1;
}
FloidAlgorithm.prototype.result = function(resultCallback)
{
var result = {};
result["version"] = 1;
this.matrix = [];
this.resultMatrix();
//console.log(this.matrix);
// Remove all edges.
this.egdesCopy = this.graph.edges.slice();
this.removeAllEdges();
this.isGraphMulti = this.graph.isMulti();
this.graph.hasDirect = false;
// Added new edges
for (var i = 0; i < this.graph.vertices.length; i ++)
{
for (var j = 0; j < this.graph.vertices.length; j ++)
{
if (i != j)
{
var directed = (this.matrix[i][j] != this.matrix[j][i]);
if (this.matrix[i][j] < this.infinity && (directed || i < j))
{
this.graph.AddNewEdgeSafe(this.graph.vertices[i], this.graph.vertices[j], directed, this.matrix[i][j]);
}
}
}
}
this.app.redrawGraph();
return result;
}
FloidAlgorithm.prototype.resultMatrix = function()
{
this.matrix = [];
for (var i = 0; i < this.graph.vertices.length; i ++)
{
this.matrix.push([]);
var v1 = this.graph.vertices[i];
var str = "";
for (var j = 0; j < this.graph.vertices.length; j ++)
{
var v2 = this.graph.vertices[j];
var edge = this.graph.FindEdgeMin(v1.id, v2.id);
if (edge != null)
{
this.matrix[i][j] = edge.GetWeight();
}
else
{
this.matrix[i][j] = this.infinity;
}
}
}
for (var k = 0; k < this.graph.vertices.length; k ++)
for (var i = 0; i < this.graph.vertices.length; i ++)
for (var j = 0; j < this.graph.vertices.length; j ++)
{
if (this.matrix[i][j] > this.matrix[i][k] + this.matrix[k][j])
{
this.matrix[i][j] = this.matrix[i][k] + this.matrix[k][j];
}
}
return this.matrix;
}
FloidAlgorithm.prototype.getObjectSelectedGroup = function(object)
{
return 0;
}
FloidAlgorithm.prototype.messageWasChanged = function()
{
var self = this;
var matrixButton = document.getElementById("showFloidMatrix");
if (matrixButton)
{
matrixButton.onclick = function () {
var dialogButtons = {};
dialogButtons[g_close] = function() {
$( this ).dialog( "close" );
};
$( "#FloidMatrixField" ).val(self.GetFloidMatrix());
$( "#floidMatrix" ).dialog({
resizable: false,
height: "auto",
width: "auto",
modal: true,
title: g_minDistMatrixText,
buttons: dialogButtons,
dialogClass: 'EdgeDialog'
});
};
}
$('#saveFloidGraph').change(function() {
self.updateMessage(this.checked);
});
}
FloidAlgorithm.prototype.GetFloidMatrix = function()
{
return this.graph.GetAdjacencyMatrixStr();
}
FloidAlgorithm.prototype.changedType = function()
{
var enumReport = document.getElementById("enumReport");
this.app.SetCurrentValue("findShortPathReportType", enumReport.options[enumReport.selectedIndex].value);
this.updateUpText();
}
FloidAlgorithm.prototype.getPriority = function()
{
return 0;
}
FloidAlgorithm.prototype.removeAllEdges = function()
{
while (this.graph.edges.length > 0)
{
this.graph.DeleteEdge(this.graph.edges[0]);
}
}
FloidAlgorithm.prototype.wantRestore = function()
{
console.log($("#saveFloidGraph").is(':checked'));
return !$("#saveFloidGraph").is(':checked');
}
FloidAlgorithm.prototype.restore = function()
{
this.removeAllEdges();
this.graph.hasDirect = false;
console.log(this.egdesCopy);
for (var i = 0; i < this.egdesCopy.length; i ++)
{
var edgeIndex = this.graph.AddNewEdgeSafe(this.egdesCopy[i].vertex1,
this.egdesCopy[i].vertex2,
this.egdesCopy[i].isDirect,
this.egdesCopy[i].weight,
this.isGraphMulti);
var edge = this.graph.edges[edgeIndex];
edge.model.type = this.egdesCopy[i].model.type;
edge.model.curveValue = this.egdesCopy[i].model.curveValue;
//edge.model = this.egdesCopy[i].model;
}
}
FloidAlgorithm.prototype.updateMessage = function(save)
{
this.message = g_graphOfMinDist + " <label style=\"margin-bottom: 0px\">" + g_checkToSave + " <input id=\"saveFloidGraph\" type=\"checkbox\"" + (save ? "checked" : "") + "></label>" +
"<button type=\"button\" class=\"btn btn-default btn-xs\" id=\"showFloidMatrix\" style=\"float:right\">" + g_showDistMatrix + "</button>"
}
// Algorithm support multi graph
FloidAlgorithm.prototype.IsSupportMultiGraph = function ()
{
return true;
}
// Factory for connected components.
function CreateFloidAlgorithm(graph, app)
{
return new FloidAlgorithm(graph, app)
}
// Gerister connected component.
RegisterAlgorithm (CreateFloidAlgorithm);