initial commit

This commit is contained in:
Baipyrus 2022-05-15 17:12:53 +02:00
commit 9771a56bdd
2 changed files with 118 additions and 0 deletions

BIN
IMAGE.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

118
movableImageGrid.pde Normal file
View File

@ -0,0 +1,118 @@
final String imgPath = "IMAGE.png";
final int gridLength = 3;
PImage source;
int sectionLength;
int originalLength;
ArrayList<Position> positions;
PVector previous;
void settings() {
source = loadImage(imgPath);
size(source.width, source.height);
originalLength = floor(source.width / gridLength);
sectionLength = floor(width / gridLength);
positions = new ArrayList<Position>();
for (int i = 0; i < pow(gridLength,2); i++) {
positions.add(new Position(i % gridLength, floor(i / gridLength)));
}
int counter = 0;
while (counter < 10000) {
final boolean m = move(
new PVector(random(width), random(height)),
new PVector(random(width), random(height))
);
if (m) {
counter++;
}
}
}
void draw() {
background(0);
for (int i = 0; i < positions.size(); i++) {
final Position original = positions.get(i);
if (!(original.x == 0 && original.y == 0)) {
final Position current = new Position(i % gridLength, floor(i / gridLength));
copy(
source,
original.x*originalLength,
original.y*originalLength,
originalLength,
originalLength,
current.x*sectionLength,
current.y*sectionLength,
sectionLength,
sectionLength
);
}
}
}
void mousePressed() {
previous = new PVector(mouseX, mouseY);
}
void mouseReleased() {
move(new PVector(mouseX, mouseY), previous);
}
boolean move(PVector a, PVector b) {
final PVector distance = PVector.sub(a, b);
int dx = 0, dy = 0;
if (abs(distance.x) > abs(distance.y))
dx = floor(distance.x / abs(distance.x));
else
dy = floor(distance.y / abs(distance.y));
final Position selected = new Position(
floor(((float)b.x*gridLength) / width),
floor(((float)b.y*gridLength) / height)
);
final int nx = selected.x + dx, ny = selected.y + dy;
final boolean xBounds = nx < gridLength && nx >= 0;
final boolean yBounds = ny < gridLength && ny >= 0;
final boolean wasMoved = xBounds && yBounds;
if (wasMoved) {
final Position next = new Position(nx, ny);
final int sIndex = selected.x + selected.y * gridLength;
final int nIndex = next.x + next.y * gridLength;
// println(sIndex, selected.x, selected.y, nx, ny);
final Position regular = positions.get(sIndex).copy();
final Position duplicate = positions.get(nIndex).copy();
final boolean isReg = (regular.x == 0 && regular.y == 0);
final boolean isDup = (duplicate.x == 0 && duplicate.y == 0);
if (isReg || isDup) {
positions.set(nIndex, regular);
positions.set(sIndex, duplicate);
}
}
return wasMoved;
}
class Position {
int x, y;
Position(int x_, int y_) {
x = x_;
y = y_;
}
Position copy() {
return new Position(x, y);
}
boolean isEqual(Position other) {
return (x == other.x) && (y == other.y);
}
}