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.
83 lines
2.0 KiB
83 lines
2.0 KiB
4 years ago
|
'use strict'
|
||
|
|
||
|
var monotoneTriangulate = require('./lib/monotone')
|
||
|
var makeIndex = require('./lib/triangulation')
|
||
|
var delaunayFlip = require('./lib/delaunay')
|
||
|
var filterTriangulation = require('./lib/filter')
|
||
|
|
||
|
module.exports = cdt2d
|
||
|
|
||
|
function canonicalizeEdge(e) {
|
||
|
return [Math.min(e[0], e[1]), Math.max(e[0], e[1])]
|
||
|
}
|
||
|
|
||
|
function compareEdge(a, b) {
|
||
|
return a[0]-b[0] || a[1]-b[1]
|
||
|
}
|
||
|
|
||
|
function canonicalizeEdges(edges) {
|
||
|
return edges.map(canonicalizeEdge).sort(compareEdge)
|
||
|
}
|
||
|
|
||
|
function getDefault(options, property, dflt) {
|
||
|
if(property in options) {
|
||
|
return options[property]
|
||
|
}
|
||
|
return dflt
|
||
|
}
|
||
|
|
||
|
function cdt2d(points, edges, options) {
|
||
|
|
||
|
if(!Array.isArray(edges)) {
|
||
|
options = edges || {}
|
||
|
edges = []
|
||
|
} else {
|
||
|
options = options || {}
|
||
|
edges = edges || []
|
||
|
}
|
||
|
|
||
|
//Parse out options
|
||
|
var delaunay = !!getDefault(options, 'delaunay', true)
|
||
|
var interior = !!getDefault(options, 'interior', true)
|
||
|
var exterior = !!getDefault(options, 'exterior', true)
|
||
|
var infinity = !!getDefault(options, 'infinity', false)
|
||
|
|
||
|
//Handle trivial case
|
||
|
if((!interior && !exterior) || points.length === 0) {
|
||
|
return []
|
||
|
}
|
||
|
|
||
|
//Construct initial triangulation
|
||
|
var cells = monotoneTriangulate(points, edges)
|
||
|
|
||
|
//If delaunay refinement needed, then improve quality by edge flipping
|
||
|
if(delaunay || interior !== exterior || infinity) {
|
||
|
|
||
|
//Index all of the cells to support fast neighborhood queries
|
||
|
var triangulation = makeIndex(points.length, canonicalizeEdges(edges))
|
||
|
for(var i=0; i<cells.length; ++i) {
|
||
|
var f = cells[i]
|
||
|
triangulation.addTriangle(f[0], f[1], f[2])
|
||
|
}
|
||
|
|
||
|
//Run edge flipping
|
||
|
if(delaunay) {
|
||
|
delaunayFlip(points, triangulation)
|
||
|
}
|
||
|
|
||
|
//Filter points
|
||
|
if(!exterior) {
|
||
|
return filterTriangulation(triangulation, -1)
|
||
|
} else if(!interior) {
|
||
|
return filterTriangulation(triangulation, 1, infinity)
|
||
|
} else if(infinity) {
|
||
|
return filterTriangulation(triangulation, 0, infinity)
|
||
|
} else {
|
||
|
return triangulation.cells()
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
return cells
|
||
|
}
|
||
|
}
|