2018-02-28 15:02:01 +01:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2018-02-28 16:02:08 +01:00
|
|
|
/**
|
|
|
|
* mergeAll: merge indices
|
|
|
|
* parameters: indices = Array of Array of indices (index = [start, end])
|
|
|
|
* Example: indices = [[[1,2], [4,5]], [[0,5], [7,11]]];
|
|
|
|
*/
|
2018-02-28 15:02:01 +01:00
|
|
|
|
|
|
|
mergeAll = function(indices) {
|
|
|
|
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);
|
|
|
|
if(counter == 100)
|
|
|
|
end = true;
|
|
|
|
}
|
|
|
|
return m.sort(compareSegments);
|
|
|
|
}
|