Что такое треугольник Серпинского?

Треугольник Серпинского — это фрактальный и привлекательный фиксированный набор, имеющий общую форму равностороннего треугольника. Он рекурсивно делится на меньшие треугольники.

Каков его рекурсивный подход?

Возьмем все три координаты равностороннего треугольника P1(x1, y1), P2(x2, y2) и P3(x3, y3). Возьмем любую точку X1(x4, y4) внутри треугольника. Теперь случайным образом выберите любую из точек формы P1, P2, P3 и нарисуйте другую точку X2, которая является средней точкой от X1.

function setup() {
// Sets the screen to be 720 pixels wide and 400 pixels high
 createCanvas(710, 400, WEBGL);
 
}

//seirpinski triangle
function draw(){
   

 
  normalMaterial();
  orbitControl();
  background(250);
  
  translate(140, 0);



  // Making equilateral triangle

  //first triangle
  f_x = [0, 250, 125]
  f_y= [0, 0, 216.5]
  f_z = [0,0, 0]
  
  //Second triangle
  s_x = [ 250, 125, 125]
  s_y= [0, 216.5, 0]
  s_z = [0, 0, 216.5]

  //Third triangle
  t_x = [0,  125, 125]
  t_y= [0,  216.5, 0]
  t_z = [0, 0, 216.5]

  //Fourth triangle
  fr_x = [0, 250,  125]
  fr_y= [0, 0,  0]
  fr_z = [0,0, 216.5]


  //Rangdom Point for first Traingle
  let f__x = [10]
  let f__y = [10]
  let f__z = [0]

  //Rangdom Point for Second  Traingle
  let s__x = [187.5]
  let s__y = [108.25]
  let s__z = [0]

  //Rangdom Point for third Traingle
  let t__x = [125]
  let t__y = [0]
   let  t__z = [0]

  //Rangdom Point for fourth Traingle
  let fr__x = [62.5]
  let fr__y = [108.25]
  let fr__z = [0]

  //console.log(f_x)
  //console.log(f_y)
  //console.log(f_z)
  counter =0
  a = 0
  b = 2
  
  translate(-200, -150, 0);
  for(i =0; i< 3000; i++){

    //rendomly selecting any of three point
    first = Math.floor(Math.random()*(b-a+1))+a;
    console.log(first)
    
    //finding Mid Point
    mid_x = ((f_x[first] + f__x[counter])/2)
    mid_y = (f_y[first] + f__y[counter])/2
    mid_z = (f_z[first] + f__z[counter])/2
    translate( mid_x, mid_y, mid_z);
    sphere(2);
    translate( -mid_x, -mid_y, -mid_z);
    f__x[counter] = mid_x
    f__y[counter] = mid_y
    f__z[counter] = mid_z
    
    
    mid_x = ((s_x[first] + s__x[counter])/2)
    mid_y = (s_y[first] + s__y[counter])/2
    mid_z = (s_z[first] + s__z[counter])/2
    translate( mid_x, mid_y, mid_z);
    sphere(2);
    translate( -mid_x, -mid_y, -mid_z);
    s__x[counter] = mid_x
    s__y[counter] = mid_y
    s__z[counter] = mid_z
    
    
    mid_x = ((t_x[first] + t__x[counter])/2)
    mid_y = (t_y[first] + t__y[counter])/2
    mid_z = (t_z[first] + t__z[counter])/2
    translate( mid_x, mid_y, mid_z);
    sphere(2);
    translate( -mid_x, -mid_y, -mid_z);
    t__x[counter] = mid_x
    t__y[counter] = mid_y
    t__z[counter] = mid_z
    
    mid_x = ((fr_x[first] + fr__x[counter])/2)
    mid_y = (fr_y[first] + fr__y[counter])/2
    mid_z = (fr_z[first] + fr__z[counter])/2
    translate( mid_x, mid_y, mid_z);
    sphere(2);
    translate( -mid_x, -mid_y, -mid_z);
    fr__x[counter] = mid_x
    fr__y[counter] = mid_y
    fr__z[counter] = mid_z


  }


}

координата Xn = средняя точка (Xn-1) и любая (P1, P2, P3). Повторите этот процесс не менее 3000 раз.