Umfassender Mathematik-Adventskalender 2017 der Meiji-Universität hat ebenfalls eine Woche überschritten. Es ist lang. ..
In diesem Artikel wird das Boxball-System, das in Letztes Mal "Über das Boxball-System" angezeigt wurde, von Processing implementiert. Finden Sie die Bewegungsgleichung (weil es keinen Spaß macht, sie zu implementieren) und versuchen Sie, sie mithilfe zu implementieren.
Um das Boxballsystem zu implementieren, muss zunächst die zeitliche Entwicklung des Boxballsystems erfolgen Muss gefragt werden.
Überdenken Sie das Boxball-System als binäre CA, in der $ u_n ^ t $ den Wert $ 0,1 $ annimmt.
Wenn die Anzahl der Bälle auf der linken Seite nicht abnimmt, Gemäß der Boxball-Regel (von links nach rechts zur nächsten leeren Box rechts gehen) Das nächste Mal wird es definitiv $ 0 $ sein. Dies ist die kinetische Gleichung des Boxballsystems. (Es kann endlich implementiert werden.)
In der Verarbeitung implementiert.
Besteht aus der Hauptkörper- und Box-Klasse. (Es ist eine verschwenderische Berechnung, aber ist es okay?)
Main
final int boxSize = 40;
final int num = 25;
int Width = num * boxSize;
boolean isRunning = false;
Box[] boxes = new Box[num];
int[] tempBoxes = new int[num];
int t = 0;
int delay = 50;
int framerate;
void settings() {
size(Width, boxSize + 50);
}
void setup() {
background(255);
for (int i = 0; i < num; i++) {
boxes[i] = new Box(i, 0);
}
}
void draw() {
background(255);
if (t % delay == 0) {
framerate = (int)frameRate;
if (isRunning) {
for (int i = 0; i < num; i++) {
tempBoxes[i] = boxes[i].ball;
}
for (int i = 0; i < num; i++) {
boxes[i].calcState();
}
}
t = 0;
}
t++;
for (int i = 0; i < num; i++) {
boxes[i].display();
}
fill(250, 0, 0);
textAlign(LEFT);
textSize(30);
if (isRunning) {
text("Run", 0, height - 10);
} else {
text("Stop", 0, height - 10);
}
textAlign(RIGHT);
textSize(18);
text("frameRate: " + framerate +" / " + delay, width - 10, height - 10);
}
void mouseClicked() {
int cellColumn = (int)(mouseX / boxSize);
if (cellColumn < boxes.length) {
boxes[cellColumn].changeState();
}
}
void mouseDragged() {
int cellColumn = (int)(mouseX / boxSize);
if (0 < mouseX && mouseX < Width && 0 < mouseY && mouseY < boxSize) {
boxes[cellColumn].changeState();
}
}
void keyReleased() {
if (key == ' ') {
isRunning = !isRunning;
} else if (key == 'r' || key == 'R') {
randomSetup();
} else if (key == 'c' || key == 'C') {
setup();
} else if (keyCode == UP) {
if (delay != 100) {
delay += 10;
}
} else if (keyCode == DOWN) {
if (delay != 10) {
delay -= 10;
}
} else if (keyCode == ENTER) {
printInfo();
}
}
void randomSetup() {
for (int i = 0; i < num; i++) {
float coinSpeed = random(1);
int coin;
if (coinSpeed > 0.8) {
coin = 1;
} else {
coin = 0;
}
boxes[i].ball = coin;
}
}
void printInfo() {
for (int i = 0; i < num; i++) {
if (i == num - 1) {
println(boxes[i].ball);
} else {
print(boxes[i].ball + ", ");
}
}
}
BoxClass
class Box {
int pos;
int num;
int ball;
Box (int num, int ball) {
this.pos = num * boxSize;
this.num = num;
this.ball = ball;
}
void changeState() {
if (ball == 1) {
this.ball = 0;
}else {
this.ball = 1;
}
}
void calcState() {
int countPast = 0;
int countNext = 0;
for (int i = 0; i < this.num; i++) {
if (boxes[i].ball == 1) {
countNext++;
}
if (tempBoxes[i] == 1) {
countPast++;
}
}
this.ball = min(countPast - countNext, 1 - this.ball);
}
void display() {
fill(255);
rect(pos, 0, boxSize, boxSize);
fill(0);
if (ball == 1) {
ellipse(pos + boxSize / 2, boxSize / 2, boxSize * 2/3, boxSize * 2/3);
}
}
}
Command
Key or mouse | Processing |
---|---|
click |
add or remove ball |
drag |
〃 |
r , R |
setup balls randomly |
c , C |
clear all balls |
↑ |
up delay rate |
↓ |
down delay rate |
space |
run or stop |
ENTER |
print data in console |
Sample
Recommended Posts