82 lines
1.6 KiB
Plaintext
82 lines
1.6 KiB
Plaintext
/**
|
|
* Radial Pocky
|
|
* by Ben Fry.
|
|
*
|
|
* Unwrap each frame of live video into a single line of pixels along a circle
|
|
*/
|
|
|
|
import processing.video.*;
|
|
|
|
Capture video;
|
|
int videoCount;
|
|
int currentAngle;
|
|
int pixelCount;
|
|
int angleCount = 200; // how many divisions
|
|
|
|
int radii[];
|
|
int angles[];
|
|
|
|
|
|
void setup() {
|
|
// size must be set to video.width*video.height*2 in both directions
|
|
size(600, 600);
|
|
|
|
// This the default video input, see the GettingStartedCapture
|
|
// example if it creates an error
|
|
video = new Capture(this, 160, 120);
|
|
|
|
// Start capturing the images from the camera
|
|
video.start();
|
|
|
|
videoCount = video.width * video.height;
|
|
|
|
pixelCount = width*height;
|
|
int centerX = width / 2;
|
|
int centerY = height / 2;
|
|
radii = new int[pixelCount];
|
|
angles = new int[pixelCount];
|
|
|
|
int offset = 0;
|
|
for (int y = 0; y < height; y++) {
|
|
for (int x = 0; x < width; x++) {
|
|
int dx = centerX - x;
|
|
int dy = centerY - y;
|
|
|
|
float angle = atan2(dy, dx);
|
|
if (angle < 0) angle += TWO_PI;
|
|
angles[offset] = (int) (angleCount * (angle / TWO_PI));
|
|
|
|
int radius = (int) mag(dx, dy);
|
|
if (radius >= videoCount) {
|
|
radius = -1;
|
|
angles[offset] = -1;
|
|
}
|
|
radii[offset] = radius;
|
|
|
|
offset++;
|
|
}
|
|
}
|
|
background(0);
|
|
}
|
|
|
|
|
|
void draw() {
|
|
if (video.available()) {
|
|
video.read();
|
|
video.loadPixels();
|
|
|
|
loadPixels();
|
|
for (int i = 0; i < pixelCount; i++) {
|
|
if (angles[i] == currentAngle) {
|
|
pixels[i] = video.pixels[radii[i]];
|
|
}
|
|
}
|
|
updatePixels();
|
|
|
|
currentAngle++;
|
|
if (currentAngle == angleCount) {
|
|
currentAngle = 0;
|
|
}
|
|
}
|
|
}
|