nlphub/src/main/webapp/js/merge.js

115 lines
2.6 KiB
JavaScript

mergeSegment = function(segment1, segment2) {
var merged = [];
if(segment1[0] <= segment2[0]) {
if(segment1[1] < segment2[0]) {
merged = [segment1, segment2];
}
else {
if(segment1[1] >= segment2[1])
merged = [segment1];
else
merged = [[segment1[0], segment2[1]]];
}
}
else {
if(segment2[1] < segment1[0]) {
merged = [segment2, segment1];
}
else {
if(segment2[1] >= segment1[1])
merged = [segment2];
else
merged = [[segment2[0], segment1[1]]];
}
}
return merged;
}
compareSegment = function(segment1, segment2) {
// inclusi o coincidenti
if((segment1[0] >= segment2[0]) && (segment1[1] <= segment2[1]))
return 0;
if((segment1[0] <= segment2[0]) && (segment1[1] >= segment2[1]))
return 0;
// esterni
if((segment1[1] < segment2[0]) || ((segment1[0] > segment2[1])))
return 1;
// intersecanti
return -1;
}
compareSegments = function(s1, s2) {
return (s1[0] - s2[0]);
}
cleanSegmentList = function(list) {
var cleaned = [];
for(var i=0; i<list.length; i++) {
if(cleaned.length == 0)
cleaned[cleaned.length] = list[i];
else {
var found = false;
for(var j=0; j<cleaned.length; j++) {
if(compareSegment(cleaned[j], list[i]) == 0) {
if(cleaned[j][0] > list[i][0])
cleaned[j] = list[i];
found = true;
break;
}
if(compareSegment(cleaned[j], list[i]) < 0) {
if(cleaned[j][0] <= list[i][0])
cleaned[j] = [cleaned[j][0], list[i][1]];
else
cleaned[j] = [list[i][0], cleaned[j][1]];
found = true;
}
}
if(!found) cleaned[cleaned.length] = list[i];
}
}
return cleaned;
}
compareSegmentList = function(list1, list2) {
if(list1.length != list2.length)
return false;
for(var i=0; i<list1.length; i++)
if((list1[i][0] != list2[i][0]) || (list1[i][1] != list2[i][1]))
return false;
return true;
}
/**
* mergeAll: merge indices
* parameters: indices = Array of Array of indices (index = [start, end])
* Example: indices = [[[1,2], [4,5]], [[0,5], [7,11]]];
*/
mergeAll = function(indices) {
console.log("---mergeAll indices.length=" + indices.length);
var m = [];
for(var i=0; i<indices[0].length; i++) {
for(var j=1; j<indices.length; j++) {
for(var k=0; k<indices[j].length; k++) {
var res = mergeSegment(indices[0][i], indices[j][k]);
for(var u=0; u<res.length; u++)
m[m.length] = res[u];
}
}
}
var end = false;
var counter = 1;
while(!end) {
var old = m.slice();
m = cleanSegmentList(m);
//console.log(m);
end = compareSegmentList(old, m);
counter++;
if(counter == 100)
end = true;
}
return m.sort(compareSegments);
}