Stepping Feet

Paso a paso #


Problem statement #

Tambien llamada Stepping feet, es una ilusión visual de percepción de movimiento. Esta muestra dos pies, uno azul y otro amarillo, que se mueven horizontalmente a través de un paisaje que consta de rayas blancas y negras. Aunque ambos pies se mueven a una velocidad constante, su velocidad percibida es distinta.

¿Como interactuar con la ilusión?
Para cambiar la velocidad de las figuras se usa el primer slider, para cambiar la relación baras/pie se usa el segundo slider y para mover o detener los pies se debe clickear la casilla de move.

Code #

CODIGO: Paso a paso

Codigo generado usando el editor web de P5.js.

var canvasWidth = 600;
var canvasHeight = 400;

var quantity = 2;
var speed = 1;

var positionXBar1 = 0;
var positionYBar1 = canvasHeight / 3;
var positionYBar2 = (2*canvasHeight) / 3;
var widthBar = 80;
var heightBar = 40;
var colorBar1 = 'yellow';
var colorBar2 = 'blue';
var moveBarRight = true;
var isMove = true;

var sliderSpeed;

function setup() {
  createCanvas(canvasWidth, canvasHeight);
  background('white');
  drawLayout();
}

function draw() {
  drawBoard();
  updateSpeed();
  drawBar1();
  drawBar2();
}

function drawBoard(){
  let position;
  
  quantity = sliderQuantity.value();

  let realLines = (canvasWidth / widthBar) * quantity;
  let widthLine = widthBar / quantity;
  let numberLines = realLines % 2 == 0 ? realLines + 1 : realLines;

  for (let i = 0; i < numberLines; i++) {
    position = i * widthLine;
    if (i % 2 == 0) {
      fill('black');
      rect(position, 0, widthLine, canvasHeight);
    } else {
      strokeWeight(0)
      fill('white');
      rect(position, 0, widthLine, canvasHeight);
    }
  }
}

function drawBar1(){
  fill(colorBar1);
  rect(positionXBar1, positionYBar1, widthBar, heightBar);
  if (moveBarRight) {
    positionXBar1 += speed;
    if (positionXBar1 + widthBar > canvasWidth) {
      moveBarRight = false;
    }
  } else {
    positionXBar1 -= speed;
    if (positionXBar1 <= 0) {
      moveBarRight = true;
    }
  }
}

function drawBar2() {
    fill(colorBar2);
    rect(positionXBar1, positionYBar2, widthBar, heightBar);
    if (moveBarRight) {
      positionXBar1 += speed;
      if (positionXBar1 + widthBar > canvasWidth) {
        moveBarRight = false;
      }
    } else {
      positionXBar1 -= speed;
      if (positionXBar1 <= 0) {
        moveBarRight = true;
      }
    }
  }

  function updateSpeed() {
    if (isMove) {
        speed = sliderSpeed.value();
    }
  }

function drawLayout() {
    //Reset button
    button = createButton('Reset');   
    button.position(40, 440);
    button.mousePressed(() => {
        canvasWidth = 600;
        canvasHeight = 400;
        quantity = 2;
        speed = 1;
        positionXBar1 = 0;
        positionYBar1 = canvasHeight / 3;
        positionXBar2 = 0;
        positionYBar2 = (2*canvasHeight) / 3;
        widthBar = 80;
        heightBar = 40;
        moveBarRight = true;
    });

    //Move checkbox
    checkbox = createCheckbox('Move', isMove); 
    checkbox.position(40, 470);
    checkbox.mousePressed(() => {
        if (speed === 0) {
            isMove = true;
            speed = sliderSpeed.value();
        } else {
            isMove = false;
            speed = 0;
        }
    });

    //Slider speed
    sliderSpeed = createSlider(1, 10, 1);
    sliderSpeed.position(40, 500);
    sliderSpeed.style('width', '80px');
    
    //Slider quantity
    sliderQuantity = createSlider(1, 10, 1);
    sliderQuantity.position(40, 540);
    sliderQuantity.style('width', '80px');
    
    //Change color
    sel = createSelect();
    sel.position(40, 580);
    sel.option('blue-yellow');
    sel.option('red-green');
    sel.option('grey');
    sel.selected('kiwi');
    sel.changed((value) => {
        switch(value.target.value) {
            case 'blue-yellow':
                colorBar1 = 'yellow'
                colorBar2 = 'blue'
                break;
            case 'red-green':
                colorBar1 = 'green'
                colorBar2 = 'red'
                break;
            case 'grey':
                colorBar1 = 'white'
                colorBar2 = 'black'
                break;
        }
    });

}

Conclusions #

La clave de esta ilusión es el contraste, ya que cuando hay un mayor contraste entre el pie y el fondo, el pie se hace visible más facilmente y da una sensación de movimiento rapido mientras que cuando el contraste es bajo, el pie es más dificil de diferenciar del fondo y parecer ir más lento. Esta ilusió demuestra que el fondo de un objeto puede tener un efecto significativo en su velocidad percibida.