StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.5 KiB
81 lines
1.5 KiB
'use strict'
|
|
|
|
module.exports = monotoneConvexHull2D
|
|
|
|
var orient = require('robust-orientation')[3]
|
|
|
|
function monotoneConvexHull2D(points) {
|
|
var n = points.length
|
|
|
|
if(n < 3) {
|
|
var result = new Array(n)
|
|
for(var i=0; i<n; ++i) {
|
|
result[i] = i
|
|
}
|
|
|
|
if(n === 2 &&
|
|
points[0][0] === points[1][0] &&
|
|
points[0][1] === points[1][1]) {
|
|
return [0]
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
//Sort point indices along x-axis
|
|
var sorted = new Array(n)
|
|
for(var i=0; i<n; ++i) {
|
|
sorted[i] = i
|
|
}
|
|
sorted.sort(function(a,b) {
|
|
var d = points[a][0]-points[b][0]
|
|
if(d) {
|
|
return d
|
|
}
|
|
return points[a][1] - points[b][1]
|
|
})
|
|
|
|
//Construct upper and lower hulls
|
|
var lower = [sorted[0], sorted[1]]
|
|
var upper = [sorted[0], sorted[1]]
|
|
|
|
for(var i=2; i<n; ++i) {
|
|
var idx = sorted[i]
|
|
var p = points[idx]
|
|
|
|
//Insert into lower list
|
|
var m = lower.length
|
|
while(m > 1 && orient(
|
|
points[lower[m-2]],
|
|
points[lower[m-1]],
|
|
p) <= 0) {
|
|
m -= 1
|
|
lower.pop()
|
|
}
|
|
lower.push(idx)
|
|
|
|
//Insert into upper list
|
|
m = upper.length
|
|
while(m > 1 && orient(
|
|
points[upper[m-2]],
|
|
points[upper[m-1]],
|
|
p) >= 0) {
|
|
m -= 1
|
|
upper.pop()
|
|
}
|
|
upper.push(idx)
|
|
}
|
|
|
|
//Merge lists together
|
|
var result = new Array(upper.length + lower.length - 2)
|
|
var ptr = 0
|
|
for(var i=0, nl=lower.length; i<nl; ++i) {
|
|
result[ptr++] = lower[i]
|
|
}
|
|
for(var j=upper.length-2; j>0; --j) {
|
|
result[ptr++] = upper[j]
|
|
}
|
|
|
|
//Return result
|
|
return result
|
|
} |