mandag 11. oktober 2010

Interaktiv kunst - oppgave

Her ligger kodene til det interaktive kunstverket. Ved å kopiere og lime disse inn i en ny sketch i processing vil dere selv være med på å påvirke det som skjer på skjermen. Dere kan hele tiden begynne på nytt ved å trykke på play knappen. Ønsker dere å sammenligne resultatene dere får, limer dere inn koden i flere sketcher. Ta deretter stillbilder av det dere ønsker å lagre. Alle skal ha minimum 2 stillbilder som legges ut i wikien dere laget forrige uke. Hver elev skal reflektere over hvorfor akkurat hans/hennes kunstverk ble som det ble, og hva som ble gjort for å påvirke kunstverket. 

import processing.video.*;
Capture video;

int numPixels;
int[] previousFrame;
int[][] diffPoints;
int diffAmount = 0;

int particleMin = 2;
int particleAlpha = 100;

void setup()
{
  size(640, 480);
  background (255);
  noStroke();
  frameRate(30);
  fill(100);
  smooth();
  video = new Capture(this, width, height, 30);
  numPixels = width * height;
  previousFrame = new int[numPixels];
  diffPoints = new int[height][width];
}

void captureEvent(Capture video) {
  video.read();
}

void draw()
{
  diffAmount = 0;
  for (int i = 0; i < numPixels; i++)
  {
    diffPoints[abs(i / width)][i % width] = 0;
    color currColor = video.pixels[i];
    color prevColor = previousFrame[i];
    // Extract the red, green, and blue components from current pixel
    int currR = (currColor >> 16) & 0xFF; // Like red(), but faster
    int currG = (currColor >> 8) & 0xFF;
    int currB = currColor & 0xFF;
    // Extract red, green, and blue components from previous pixel
    int prevR = (prevColor >> 16) & 0xFF;
    int prevG = (prevColor >> 8) & 0xFF;
    int prevB = prevColor & 0xFF;
    // Compute the difference of the red, green, and blue values
    int diffR = abs(currR - prevR);
    int diffG = abs(currG - prevG);
    int diffB = abs(currB - prevB);
    // Render the difference image to the screen
    color diff = color(diffR, diffG, diffB);
    int isPointDiff = 0;
    if (diff > -15000000)      //-16777216
    {
      isPointDiff = 1;
      ++diffAmount;
    }
    diffPoints[abs(i / width)][i % width] = isPointDiff;
  }
  checkForNewPoint(diffAmount);
 
  arraycopy(video.pixels, previousFrame); 
}

void checkForNewPoint(int diffAmount)

  if(diffAmount > 100000)
  {
    return;
  }
  float milliseconds = millis();
  if (milliseconds < 1000) return;
  if (diffAmount < 40) return;
  int blocks = 0;
  for (int i = 0; i < height; i++)
  {
    for (int j = 0; j < width; j++)
    {     
      if(i > 1 && j > 1 && diffPoints[i][j] == 1)
      {
        if(diffPoints[i - 1][j] == 1 && diffPoints[i - 2][j] == 1
            || diffPoints[i][j - 1] == 1 && diffPoints[i][j - 2] == 1)
        {
          ++blocks;
          int randNum = 10;
          int randX = int((randNum / 2) - random(randNum));
          int randY = int((randNum / 2) - random(randNum));
          color c = previousFrame[(i * width) + j];
          fill(c, particleAlpha);
          int particleSize = diffAmount / 700;
         
          if(random(particleSize) > (particleSize - (.9999999 / particleSize)))
          {
            ellipse(j, i, particleMin + particleSize, particleMin + particleSize);
          }
        }
      }
    }
  } 
}

void mousePressed() {
  fill(255);
  rect(0, 0, width, height);
}