-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathindex.js
52 lines (43 loc) · 1.35 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
var pnltri = require('pnltri')
var defaults = require('lodash.defaults')
module.exports = function (points, opts) {
opts = opts || {}
defaults(opts, {top: 1, bottom: 0, closed: true})
var n = points.length
var positions
var cells
(opts.top === opts.bottom) ? flat() : full()
function triangulate (points) {
points = points.map(function (p) { return {x: p[0], y: p[1]} })
return new pnltri.Triangulator().triangulate_polygon([points])
}
function flat () {
positions = points.map(function (p) { return [p[0], p[1], opts.top] })
cells = triangulate(points)
}
function full () {
positions = []
points.forEach(function (p) { positions.push([p[0], p[1], opts.top]) })
points.forEach(function (p) { positions.push([p[0], p[1], opts.bottom]) })
cells = []
for (var i = 0; i < n; i++) {
if (i === (n - 1)) {
cells.push([i + n, n, i])
cells.push([0, i, n])
} else {
cells.push([i + n, i + n + 1, i])
cells.push([i + 1, i, i + n + 1])
}
}
if (opts.closed) {
var top = triangulate(points)
var bottom = top.map(function (p) { return p.map(function (v) { return v + n }) })
bottom = bottom.map(function (p) { return [p[0], p[2], p[1]] })
cells = cells.concat(top).concat(bottom)
}
}
return {
positions: positions,
cells: cells
}
}