xxxxxxxxxx
/* @pjs preload="IMGP9929.jpg"; */
int[] pix;
PVector[] pos;
final int FACTOR = 3;
final float FRICTION = .95, ACC = .12, DCOEFF = .5;
float DMIN = 50, DMAX = 90;
int w, h, imgW, imgH;
Boolean magnify = true;
void setup() {
size(266, 400, P2D);
PImage img = loadImage("IMGP9929.jpg");
imgW = img.width;
imgH = img.height;
img.loadPixels();
pix = new int[img.pixels.length];
pos = new PVector[img.pixels.length];
arrayCopy(img.pixels, pix);
img.updatePixels();
w = int(img.width / FACTOR);
h = int(img.height / FACTOR);
for (int i = 0; i < w; i ++) {
for (int j = 0; j < h; j ++) {
pos[j * width + i] = new PVector(FACTOR*i, FACTOR*j);
}
}
}
void draw() {
loadPixels();
int k, nx, ny;
float d, coeff, acc;
for (int i = 0; i < w; i ++) {
for (int j = 0; j < h; j ++) {
k = j * width + i;
d = constrain(dist(mouseX, mouseY, i, j), DMIN, DMAX);
PVector tmp = new PVector(mouseX*FACTOR, mouseY*FACTOR);
coeff = map(d, DMIN, DMAX, 1, FACTOR);
tmp.x += coeff * (i - mouseX);
tmp.y += coeff * (j - mouseY);
tmp.sub(pos[k]);
acc = map(d, DMIN, DMAX, .3, .05);
tmp.mult(acc);
pos[k].add(tmp);
nx = int(pos[k].x);
ny = int(pos[k].y);
if (nx >= 0 && nx < imgW && ny >= 0 && ny < imgH) {
pixels[k] = pix[ny * imgW + nx];
}
}
}
updatePixels();
}
void mousePressed() {
magnify = !magnify;
if (magnify) {
DMIN = 50;
DMAX = 90;
} else {
DMIN = .01;
DMAX = .1;
}
}