Skip to content

Instantly share code, notes, and snippets.

@ravicious
Created March 9, 2013 11:44
Show Gist options
  • Select an option

  • Save ravicious/5123933 to your computer and use it in GitHub Desktop.

Select an option

Save ravicious/5123933 to your computer and use it in GitHub Desktop.
import controlP5.*;
import processing.video.*;
// UI
ControlP5 cp5;
PImage sourcePicture, newPicture;
Capture cam;
float blockScale; // im większa skala, tym mniejsze bloki
int loopCount; // ilość powtórzeń pętli; im większa wartość, tym więcej bloków
int rand; // decyduje, czy blok zostanie przeniesiony, czy nie
int randLowerLimit; // dolny
// zakres losowania
int randUpperLimit; // górny
int randThreshold; // najniższa wartość losowania, po której blok zostaje przeniesiony
// im większa, tym mniej bloków
int dimension;
// zmienne związane liczbą przerysowań na sekundę
int initialTime;
int runCount;
int interval;
void setup() {
size(940, 480);
PFont font = createFont("Arial", 11);
textFont(font);
background(0);
// domyślne wartości
blockScale = 1.0;
loopCount = 10;
randLowerLimit = 0;
randUpperLimit = 100;
randThreshold = 25;
initialTime = millis();
interval = 80;
// webcam
// http://processing.org/reference/libraries/video/Capture.html
String[] cameras = Capture.list();
if (cameras.length == 0) {
println("There are no cameras available for capture.");
exit();
}
else {
println("Available cameras:");
for (int i = 0; i < cameras.length; i++) {
println(cameras[i]);
}
// The camera can be initialized directly using an
// element from the array returned by list():
// cam = new Capture(this, cameras[0]);
cam = new Capture(this, 640, 480);
cam.start();
}
// UI
// http://www.sojamo.de/libraries/controlP5/
cp5 = new ControlP5(this);
cp5.addSlider("blockScale")
.setPosition(665, 25)
.setRange(0.5, 5.0)
;
text("im większa wartość, tym mniejsze bloki", 665, 50, 250, 40);
cp5.addSlider("loopCount")
.setPosition(665, 75)
.setRange(1, 50)
;
text("ilość powtórzeń pętli; im większa wartość, tym więcej bloków", 665, 100, 250, 40);
cp5.addSlider("randThreshold")
.setPosition(665, 150)
.setRange(0, 100)
;
text("najniższa wartość losowania, po której blok zostaje przeniesiony; im większa, tym mniej bloków", 665, 175, 250, 60);
cp5.addSlider("interval")
.setPosition(665, 225)
.setRange(40, 1000)
;
text("czas w milisekundach, po którym następuje ponowne przerysowanie", 665, 250, 250, 60);
}
void draw() {
if (millis() - initialTime > interval) { // odpalaj tylko co ustalony interwał
initialTime = millis();
if (cam.available() == true) {
cam.read();
sourcePicture = cam;
}
newPicture = createImage(sourcePicture.width, sourcePicture.height, RGB);
dimension = sourcePicture.width * sourcePicture.height; // TODO: czy to jest konieczne?
// zezwól na korzystanie z metody pixels
sourcePicture.loadPixels();
newPicture.loadPixels();
newPicture.copy(sourcePicture, 0, 0, sourcePicture.width, sourcePicture.width, 0, 0, sourcePicture.width, sourcePicture.width);
for (int i = 0; i < loopCount; i++) { // główna pętla
// ustal szerokość i wysokość przenoszonego bloku
int blockWidth = int(random(sourcePicture.width)/blockScale);
int blockHeight = int(random(sourcePicture.height)/blockScale);
int lengthLimit = int(dimension - blockWidth); // ilość pikseli minus szerokość przenoszonego bloku
// losowe piksele
int randomPixel1 = int(random(0, dimension - blockWidth)); // randomPixel2 będzie skopiowany na miejsce randomPixel1
int randomPixel2 = int(random(0, dimension - blockWidth));
// losowanie
rand = int(random(randLowerLimit, randUpperLimit));
// sprawdź, czy jest miejsce na przeniesienie bloku
if ((rand >= randThreshold)&& (randomPixel1 + sourcePicture.width * blockHeight < lengthLimit) && (randomPixel2 + sourcePicture.width * blockHeight < lengthLimit)) {
for (int y = 0; y <= blockHeight; y++) { // zapętl po wierszach
for (int x = 0; x <= blockWidth; x++) { // przełącz na kolejne piksele w przenoszonych blokach
newPicture.pixels[randomPixel1 + x] = sourcePicture.pixels[randomPixel2 + x];
};
randomPixel1 = randomPixel1 + sourcePicture.width; // przełącz na kolejny wiersz
randomPixel2 = randomPixel2 + sourcePicture.width;
};
};
};
newPicture.updatePixels();
//image(newPicture, 0, 0, 640, 480); // rysuje obraz
set(0, 0, newPicture); // set nie ma możliwości skalowania obrazu
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment