Skip to main content
Henge
520_Henge-#269-View_0_Landscape
520_Henge-#358-View_0_Landscape
520_Henge-#377-View_0_Landscape
520_Henge-#19-View_0_Landscape
520_Henge-#20-View_0_Landscape
520_Henge-#110-View_0_Landscape
520_Henge-#111-View_0_Landscape
520_Henge-#188-View_0_Landscape

Henge

 
Henge

Henge is an exploration of circular megalithic structures of the prehistoric age. It is a work of historical fiction where these stone assemblies, achieved through herculean efforts of stacking, aligning, and balancing immense chiseled rocks, are reimagined within an alternate universe of algorithmic possibility.

ATMOSPHERE

HENGE AS ARCHITECTURAL SPECULATION

HENGE LAYOUTS

HENGE STACKS

ANOTHER CIRCLE

Plot generation code

                        //////////////////  Aranda\lasch
//////////////////  Jesse Bassett
//////////////////  5/20/2022 v3.3

function roll() {
    plot = makePlot(0);
}
    
class Plotattributes{
  constructor(_category,_size,_density,_stackAmount) {
    this.category = _category,//type of generation
    this.size = _size,//size/scale
    this.density = _density,//density of stacks
    this.amount = _stackAmount,//number of stacks
    this.x = [],//List of X for stacks
    this.y = []//List of Y for stacks
  }
}

function makePlot(_arg,_argCat,_argSize,_argAmount){

  let _plotCat = shuffle(plotCategories)[0];
  let _plotSize = floor(random(1000,2000));//circle radius
  let _plotDen = random(.02,.05); //density with respect to radius not area.
  let _plotAmount = floor(_plotSize*_plotDen);
  let _plot;

  if (_arg === 0){
    _plot = new Plotattributes(_plotCat,_plotSize,_plotDen,_plotAmount);
  }
  else if (_arg === 1){
    _plot = new Plotattributes(_argCat,_argSize,_plotDen,_argAmount);
  }

  //create points
  //PlotCategories = ['ring','disk','circle,'grid,'axis','row','axialSym','radialSym'];
  if (_plot.category == 'ring'){
    let radius = _plot.size - 250;
    let diameter = floor(Math.PI *2 * radius);
    _plot.amount = floor(diameter / 500);
    for (let i = 0; i < _plot.amount; i++){
      let tempT = (Math.PI*2/_plot.amount) * i
      let tempR = radius;
      _plot.x.push(tempR*Math.cos(tempT));
      _plot.y.push(tempR*Math.sin(tempT));
    }
  }else if (_plot.category == 'disk'){
    let diskMin = _plot.size * random(0,.7);
    _plot.amount = _plotDen * (_plot.size - diskMin);
    for (let i = 0; i < _plot.amount; i++){
      let tempT = rList(1,0,Math.PI*2);
      let tempR = rListWeight(1,diskMin,_plot.size,.5);
      _plot.x.push(tempR*Math.cos(tempT));
      _plot.y.push(tempR*Math.sin(tempT));
    }
  else if (_plot.category == 'circle'){
    for (let i = 0; i < _plot.amount; i++){
      let tempT = rList(1,0,Math.PI*2);
      let tempR = rListWeight(1,0,_plot.size,.5);
      _plot.x.push(tempR*Math.cos(tempT));
      _plot.y.push(tempR*Math.sin(tempT));
    }
  }else if (_plot.category == 'grid'){
    let gridScale = floor(random(300,800));
    let gridAmount = _plot.size/gridScale;
    for (let i = 0; i < gridAmount; i++){
      for (let j = 0; j < gridAmount; j++){ 
        let d = dist(i*gridScale, j*gridScale, 0, 0);
        if(d <= _plot.size){
          _plot.x.push(i*gridScale);
          _plot.y.push(j*gridScale);
          _plot.x.push(-i*gridScale);
          _plot.y.push(j*gridScale);
          _plot.x.push(i*gridScale);
          _plot.y.push(-j*gridScale);
          _plot.x.push(-i*gridScale);
          _plot.y.push(-j*gridScale);
        }
      }
    }
  }else if (_plot.category == 'axis'){
    let axisNum = ceil(random(2,8));
    let gridScale = floor(random(200,300));
    let gridAmount = floor(_plot.size/gridScale) ;
    for (let i = 0; i < axisNum; i++){
      for (let j = 2; j < gridAmount; j++){
        let tempT = Math.PI*2*i/(axisNum);
        let tempR = gridScale*j;
        _plot.x.push(tempR*Math.cos(tempT));
        _plot.y.push(tempR*Math.sin(tempT));
      }
    }
  }else if (_plot.category == 'row'){
    let gridScale = floor(random(300,400));
    let gridAmount = _plot.size/gridScale;
    for (let i = 0; i < gridAmount/2; i++){
      for (let j = 0; j < gridAmount; j++){
        let d = dist(i*gridScale*2, j*gridScale, 0, 0);
        if(d <= _plot.size){
          _plot.x.push(i*gridScale*2);
          _plot.y.push(j*gridScale);
          _plot.x.push(-i*gridScale*2);
          _plot.y.push(j*gridScale);
          _plot.x.push(i*gridScale*2);
          _plot.y.push(-j*gridScale);
          _plot.x.push(-i*gridScale*2);
          _plot.y.push(-j*gridScale);
        }
      }
    }
  }else if (_plot.category == 'axialSym'){
    for (let i = 0; i < _plot.amount/2; i++){
      let tempT = rList(1,0,Math.PI);
      let tempR = rListWeight(1,0,_plot.size,.5);
      _plot.x.push(tempR*Math.cos(tempT));
      _plot.y.push(tempR*Math.sin(tempT));
      _plot.x.push(tempR*Math.cos(tempT));
      _plot.y.push(-tempR*Math.sin(tempT));
    }
  }else if (_plot.category == 'radialSym'){
    for (let i = 0; i < _plot.amount/8; i++){
      let tempT = rList(1,0,Math.PI/4);
      let tempT2 = rList(1,Math.PI/4,Math.PI/2);
      let tempR = rListWeight(1,0,_plot.size,.5);
      _plot.x.push(tempR*Math.cos(tempT));
      _plot.y.push(tempR*Math.sin(tempT));
      _plot.x.push(tempR*Math.cos(tempT));
      _plot.y.push(-tempR*Math.sin(tempT));
      _plot.x.push(-tempR*Math.cos(tempT));
      _plot.y.push(tempR*Math.sin(tempT));
      _plot.x.push(-tempR*Math.cos(tempT));
      _plot.y.push(-tempR*Math.sin(tempT));
      _plot.x.push(tempR*Math.cos(tempT2));
      _plot.y.push(tempR*Math.sin(tempT2));
      _plot.x.push(tempR*Math.cos(tempT2));
      _plot.y.push(-tempR*Math.sin(tempT2));
      _plot.x.push(-tempR*Math.cos(tempT2));
      _plot.y.push(tempR*Math.sin(tempT2));
      _plot.x.push(-tempR*Math.cos(tempT2));
      _plot.y.push(-tempR*Math.sin(tempT2));
    }
  }else{
    _plot.x.push(0);
    _plot.y.push(0);
  }
  _plot.amount = _plot.x.length;
  return(_plot);
}

function rList(length, low, high) {
  let myList = []
  for(let i=0; i<length; i++){
    myList.push(random(low,high));
  }
  return myList
}





                    

Stack generation code

                        //////////////////  Aranda\lasch
//////////////////  Jesse Bassett
//////////////////  5/20/2022 v3.3

function roll() {
   makeStack();
}

class Stackattributes{
  constructor() {
    this.name,
    this.x,//x position
    this.y,//y position
    this.category,//type of stacks to generate
    this.stoneAmount = [],//how many stones in the stack
    this.stoneLength = [],//list of stone lenghts
    this.stoneWidth = [],//list of stone Widths
    this.stoneHeight = [],//list of stone Heights
    this.colors = [],//list of stone colors
    this.rotation = [],//list of stone rotations
  }
}
   
function makeStack(){
  let stackCat = shuffle(stackCategories)[0];
  let vList = new Array();
 // print('Plot: ' + plot.category + ', Stack: ' + stackCat);
  for(let i = 0; i < 30 ; i++){//voronoi list to use, sort by area later
    vList.push(i);
  }
  for (let i = 0; i < plot.amount ; i++) {
    stackList.push(new Stackattributes());
    stackList[i].name = i;
    stackList[i].category = stackCat;
    //stackList[i].category = 'regular'
  }
  //let stackCategories = ['regular','tall','short','big','long','thin','sorted','centered','bowl','cone'];
  for (let i = 0; i < stackList.length ; i++) {
    if (stackList[i].category == 'regular'){
      stackList[i].stoneAmount = floor(random(2,7));
      stackList[i].stoneLength = rList(stackList[i].stoneAmount,100,250);
      stackList[i].stoneWidth = rList(stackList[i].stoneAmount,100,250);
      stackList[i].stoneHeight = rList(stackList[i].stoneAmount,50,150);
      stackList[i].rotation = rList(stackList[i].stoneAmount,0,Math.PI/2);
      stackList[i].VoronoiIndex = shuffle(vList);
    }else if (stackList[i].category == 'short'){
      stackList[i].stoneAmount = floor(random(2,4));
      stackList[i].stoneLength = rList(stackList[i].stoneAmount,200,500);
      stackList[i].stoneWidth = rList(stackList[i].stoneAmount,200,500);
      stackList[i].stoneHeight = rList(stackList[i].stoneAmount,75,100);
      stackList[i].rotation = rList(stackList[i].stoneAmount,0,Math.PI/2);
      stackList[i].VoronoiIndex = shuffle(vList);
      }else if (stackList[i].category == 'large'){
      stackList[i].stoneAmount = floor(random(1,2));
      stackList[i].stoneLength = rList(stackList[i].stoneAmount,150,300);
      stackList[i].stoneWidth = rList(stackList[i].stoneAmount,150,300);
      stackList[i].stoneHeight = rList(stackList[i].stoneAmount,200,600);
      stackList[i].rotation = rList(stackList[i].stoneAmount,0,Math.PI/2);
      stackList[i].VoronoiIndex = shuffle(vList);
    }else if (stackList[i].category == 'long'){
      stackList[i].stoneAmount = floor(random(4,6));
      stackList[i].stoneLength = rList(stackList[i].stoneAmount,50,150);
      stackList[i].stoneWidth = rList(stackList[i].stoneAmount,100,500);
      stackList[i].stoneHeight = rList(stackList[i].stoneAmount,50,150);
      stackList[i].rotation = rList(stackList[i].stoneAmount,0,Math.PI/2);
      stackList[i].VoronoiIndex = shuffle(vList);
    }else if (stackList[i].category == 'thin'){
      stackList[i].stoneAmount = floor(random(9,15));
      stackList[i].stoneLength = rList(stackList[i].stoneAmount,150,200);
      stackList[i].stoneWidth = rList(stackList[i].stoneAmount,150,200);
      stackList[i].stoneHeight = rList(stackList[i].stoneAmount,35,70);
      stackList[i].rotation = rList(stackList[i].stoneAmount,0,Math.PI/2);
      stackList[i].VoronoiIndex = shuffle(vList);
    }else if (stackList[i].category == 'tall'){
      stackList[i].stoneAmount = floor(random(1,6));
      stackList[i].stoneLength = rList(stackList[i].stoneAmount,100,200);
      stackList[i].stoneWidth = rList(stackList[i].stoneAmount,100,200);
      stackList[i].stoneHeight = rList(stackList[i].stoneAmount,100,500);
      stackList[i].rotation = rList(stackList[i].stoneAmount,0,Math.PI/2);
      stackList[i].VoronoiIndex = shuffle(vList);
    }
  }
  for (let i = 0; i < stackList.length ; i++) {
    stackList[i].x = plot.x[i];
    stackList[i].y = plot.y[i];
  }
}
                    
HENGE 39 02
[ To change Site Options/Shopify Options ] This is the actual print of an Edition ...