Skip to content

Triangle space partitioning

Double-click to restart.

An animated recursive subdivision of space into triangles

function setup() {
  let cvs = createCanvas(windowWidth, windowHeight);
  colorMode(HSB)
  seed = random(100000000)
  noStroke()
}
function windowResized() {
  createCanvas(windowWidth, windowHeight)
}
function doubleClicked() {
  seed = random(100000000)
  frameCount = 0
}
let seed
let maxSize = 15

function draw() {
  //background(0)
  randomSeed(seed)
  i = frameCount ** 1.5
  //triangleBSP(200, -250, 1000, 500, -500, 500)
  if (random() > 0.5) {
    translate(width/2, height/2)
    scale(-1, -1)
    translate(-width/2, -height/2)
  }
  if (random() > 0.5) {
    triangleBSP(0, 0, width, 0, 0, height)
    triangleBSP(width, height, 0, height, width, 0)
  } else {
    triangleBSP(0, 0, width, 0, width, height)
    triangleBSP(0, 0, width, height, 0, height)
  }

  if (i > 2000 && !mouseIsPressed) {
    frameCount = 0
    seed = random(100000000)
  }
}

let i = 0

function triangleBSP(x1,y1, x2,y2, x3,y3) {
  let area = 1/2 * ((x1 - x3) * (y2 - y1) - (x1 - x2) * (y3 - y1))
  let n = random(100000000)
  let sidesq1 = random(0.2, 1) * ((x1 - x2) ** 2 + (y1 - y2) ** 2)
  let sidesq2 = random(0.2, 1) * ((x1 - x3) ** 2 + (y1 - y3) ** 2)
  let sidesq3 = random(0.2, 1) * ((x3 - x2) ** 2 + (y3 - y2) ** 2)
  let r
  i --
  
  if (abs(area) < maxSize * maxSize || i < 0) {
    //r = 255 / (sidesq1 + sidesq2 + sidesq3)
    //fill(sidesq1 * r, sidesq2 * r, sidesq3 * r)
    fill(random(360), random(0, 100), random(40, 100))
    //let k = random(i)/100 + (i ** 2)/500/500
    //let w = random(-i, i)/1000
    //triangle(x1+w,y1+k, x2+w,y2+k, x3+w,y3+k)
    triangle(x1,y1, x2,y2, x3,y3)
    randomSeed(n)
    return
  }
    
  if (sidesq1 > sidesq2 && sidesq1 > sidesq3) {
    r = sqrt(sidesq2)/(sqrt(sidesq2) + sqrt(sidesq3))
    triangleBSP(x1,y1, x1+(x2-x1)*r,y1+(y2-y1)*r, x3,y3)
    triangleBSP(x1+(x2-x1)*r,y1+(y2-y1)*r, x2,y2, x3,y3)
  } else if (sidesq2 > sidesq3) {
    r = sqrt(sidesq3)/(sqrt(sidesq1) + sqrt(sidesq3))
    triangleBSP(x3+(x1-x3)*r,y3+(y1-y3)*r, x2,y2, x3,y3)
    triangleBSP(x1,y1, x2,y2, x3+(x1-x3)*r,y3+(y1-y3)*r)
  } else {
    r = sqrt(sidesq1)/(sqrt(sidesq2) + sqrt(sidesq1))
    triangleBSP(x1,y1, x2+(x3-x2)*r,y2+(y3-y2)*r, x3,y3)
    triangleBSP(x1,y1, x2,y2, x2+(x3-x2)*r,y2+(y3-y2)*r)
  }
  randomSeed(n)
}

(Originally seen at https://editor.p5js.org/bojidar-bg/sketches/okbnIB7-q)

Experiments tagged p5 (17/85)

Experiments on this site (17/85)