Vertis Town generator
Town generator based on a Voronoi Diagram, drawing streets, building biomes.
by Markus Dehning
HTML
<script src="//cdnjs.cloudflare.com/ajax/libs/seedrandom/2.4.0/seedrandom.min.js"></script>
<script src="https://d3js.org/d3.v4.min.js"></script>
JavaScript
Math.seedrandom('Ascalon');
var maxPoints = 500;
var width = 600;
var height = 600;
var t = 20, focus = 6, foci = 1, area = 1;
var wildernessDegration = 0.15, wildernessExpansionRate = 0.8;
var urbanDegration = 0.05;
var allowCivReversion = false;
var farmSpread = 0.3, pastureSpread = 0.3;
// Color definitions
var verti_lightgreen = "#aacc33";
var verti_green = "#55cc55";
var verti_darkgreen = "#33aa33";
var verti_darkestgreen = "#009900";
var verti_yellow = "#cccc00";
var verti_grey = "#99aa99";
var verti_darkgrey = "#595959";
var verti_contour = "#050505";
var verti_street = "#777777";
function random(min, max){
return (max-min)*Math.random() + min;
}
function randomInt(min, max){
return Math.floor(random(min, max));
}
function randomGauss(min, max, lvl){
if(arguments.length <= 2) lvl = 1;
var res = 0;
for(var l = 0; l < lvl; l++){1
res += random(min, max);
}
return res / (Math.max(1, lvl));
}
function randomGaussOffcenter(offset, min, max, lvl){
var rand = randomGauss(min, max, lvl) + offset;
if(rand < min || rand > max) rand = randomGaussOffcenter(offset, min, max, lvl);
return rand;
}
function random2DGaussSum(offsets, minX, maxX, minY, maxY, lvl){
//offsets are array of points choose a point at random
var randX = 0, randY = 0;
var i = Math.floor(random(0, offsets.length));
randX += randomGaussOffcenter(offsets[i][0], minX, maxX, lvl);
randY += randomGaussOffcenter(offsets[i][1], minY, maxY, lvl);
return [randX, randY];
}
function randomSign(){
var r = random(0,1);
if(r < 0.4) return -1;
if(r < 0.8) return 1;
return r*random(0,1);
}
var centers = [];
for(var j = 0; j < foci; j++){
centers.push([randomGaussOffcenter(randomSign()*t, -width/2, +width/2, focus),
randomGaussOffcenter(randomSign()*t, -height/2, +height/2, focus)]);
if(random(0,1)<0.1) centers.push([random(-width/3, width/3), random(-height/3, height/3)]);
}
var data = [];
for(var i = 0; i < maxPoints; i++){
//var p =...