Created
March 9, 2013 11:44
-
-
Save ravicious/5123933 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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