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.
134 lines
3.5 KiB
134 lines
3.5 KiB
var http = require('http')
|
|
var Canvas = require('..')
|
|
|
|
var canvas = new Canvas(1920, 1200)
|
|
var ctx = canvas.getContext('2d')
|
|
|
|
var voronoiFactory = require('./rhill-voronoi-core-min')
|
|
|
|
http.createServer(function (req, res) {
|
|
var x, y, v, iHalfedge
|
|
|
|
var voronoi = voronoiFactory()
|
|
var start = new Date()
|
|
var bbox = { xl: 0, xr: canvas.width, yt: 0, yb: canvas.height }
|
|
|
|
for (var i = 0; i < 340; i++) {
|
|
x = Math.random() * canvas.width
|
|
y = Math.random() * canvas.height
|
|
voronoi.addSites([{ x: x, y: y }])
|
|
}
|
|
|
|
var diagram = voronoi.compute(bbox)
|
|
|
|
ctx.beginPath()
|
|
ctx.rect(0, 0, canvas.width, canvas.height)
|
|
ctx.fillStyle = '#fff'
|
|
ctx.fill()
|
|
ctx.strokeStyle = 'black'
|
|
ctx.stroke()
|
|
// voronoi
|
|
ctx.strokeStyle = 'rgba(255,255,255,0.5)'
|
|
ctx.lineWidth = 4
|
|
// edges
|
|
var edges = diagram.edges
|
|
var nEdges = edges.length
|
|
|
|
var sites = diagram.sites
|
|
var nSites = sites.length
|
|
for (var iSite = nSites - 1; iSite >= 0; iSite -= 1) {
|
|
var site = sites[iSite]
|
|
ctx.rect(site.x - 0.5, site.y - 0.5, 1, 1)
|
|
|
|
var cell = diagram.cells[diagram.sites[iSite].id]
|
|
if (cell !== undefined) {
|
|
var halfedges = cell.halfedges
|
|
var nHalfedges = halfedges.length
|
|
if (nHalfedges < 3) return
|
|
var minx = canvas.width
|
|
var miny = canvas.height
|
|
var maxx = 0
|
|
var maxy = 0
|
|
|
|
v = halfedges[0].getStartpoint()
|
|
ctx.beginPath()
|
|
ctx.moveTo(v.x, v.y)
|
|
|
|
for (iHalfedge = 0; iHalfedge < nHalfedges; iHalfedge++) {
|
|
v = halfedges[iHalfedge].getEndpoint()
|
|
ctx.lineTo(v.x, v.y)
|
|
if (v.x < minx) minx = v.x
|
|
if (v.y < miny) miny = v.y
|
|
if (v.x > maxx) maxx = v.x
|
|
if (v.y > maxy) maxy = v.y
|
|
}
|
|
|
|
var midx = (maxx + minx) / 2
|
|
var midy = (maxy + miny) / 2
|
|
var R = 0
|
|
|
|
for (iHalfedge = 0; iHalfedge < nHalfedges; iHalfedge++) {
|
|
v = halfedges[iHalfedge].getEndpoint()
|
|
var dx = v.x - site.x
|
|
var dy = v.y - site.y
|
|
var newR = Math.sqrt(dx * dx + dy * dy)
|
|
if (newR > R) R = newR
|
|
}
|
|
|
|
midx = site.x
|
|
midy = site.y
|
|
|
|
var radgrad = ctx.createRadialGradient(midx + R * 0.3, midy - R * 0.3, 0, midx, midy, R)
|
|
radgrad.addColorStop(0, '#09760b')
|
|
radgrad.addColorStop(1.0, 'black')
|
|
ctx.fillStyle = radgrad
|
|
ctx.fill()
|
|
|
|
var radgrad2 = ctx.createRadialGradient(midx - R * 0.5, midy + R * 0.5, R * 0.1, midx, midy, R)
|
|
radgrad2.addColorStop(0, 'rgba(255,255,255,0.5)')
|
|
radgrad2.addColorStop(0.04, 'rgba(255,255,255,0.3)')
|
|
radgrad2.addColorStop(0.05, 'rgba(255,255,255,0)')
|
|
ctx.fillStyle = radgrad2
|
|
ctx.fill()
|
|
|
|
var lingrad = ctx.createLinearGradient(minx, site.y, minx + 100, site.y - 20)
|
|
lingrad.addColorStop(0.0, 'rgba(255,255,255,0.5)')
|
|
lingrad.addColorStop(0.2, 'rgba(255,255,255,0.2)')
|
|
lingrad.addColorStop(1.0, 'rgba(255,255,255,0)')
|
|
ctx.fillStyle = lingrad
|
|
ctx.fill()
|
|
}
|
|
}
|
|
|
|
if (nEdges) {
|
|
var edge
|
|
|
|
ctx.beginPath()
|
|
|
|
for (var iEdge = nEdges - 1; iEdge >= 0; iEdge -= 1) {
|
|
edge = edges[iEdge]
|
|
v = edge.va
|
|
ctx.moveTo(v.x, v.y)
|
|
v = edge.vb
|
|
ctx.lineTo(v.x, v.y)
|
|
}
|
|
|
|
ctx.stroke()
|
|
}
|
|
|
|
canvas.toBuffer(function (err, buf) {
|
|
if (err) throw err
|
|
|
|
var duration = new Date() - start
|
|
console.log('Rendered in %dms', duration)
|
|
|
|
res.writeHead(200, {
|
|
'Content-Type': 'image/png',
|
|
'Content-Length': buf.length
|
|
})
|
|
|
|
res.end(buf)
|
|
})
|
|
}).listen(3000, function () {
|
|
console.log('Server running on port 3000')
|
|
})
|
|
|