In this idealized farm, you control the hen, drawn as a white circle. You're chased by a fox, shown as a brown circle. The fox doesn't want to eat you, it just wants to be nearby. But it doesn't want to scare you, so as it gets closer to you it slows down. For fun, I change the size of the fox based on how fast it's moving.
Try turning the hen on and off, and try moving your mouse in different ways. For example, while holding down the mouse button, keep the mouse still for a moment, make one quick move, then stop again. Try repeating this to get some cool patterns!
You can control this interaction using the keyboard:
float FoxX, FoxY, FoxR; // the fox's center and radius
float HenX, HenY, HenR; // the hen's center and radius
color FoxColor, HenColor; // animal colors
boolean FoxVisible, HenVisible; // are we drawing these?
float FoxSpeed; // the fox's speed, from 0 to 1
color BGcolor; // the background color
boolean ClearBG; // clear the background on each frame?
boolean ScaleRadius; // scale the fox's radius with distance?
void setup() {
size(600, 500); // make a window 600 wide by 500 high
smooth(); // and draw everything pretty
// set starting values for the global variables
BGcolor = color(20, 95, 50); // background color
FoxX = width/2.0; // the fox's starting position
FoxY = height/2.0;
FoxR = 10; // radius of the fox's circle
FoxColor = color(180, 120, 50); // a brown-ish fox
HenX = width/2.0; // the hen's starting position
HenY = height/2.0;
HenR = 20; // the hen's radius
HenColor = color(210, 210, 195); // a white-ish hen
ClearBG = false; // don't clear background on each frame
ScaleRadius = true; // fox changes size with speed
FoxVisible = true; // draw the fox
HenVisible = true; // draw the hen
FoxSpeed = .08; // fox's speed: bigger = faster
background(BGcolor);
}
void draw() {
if (ClearBG) background(BGcolor);
/* Move the fox. We move the fox some percentage of the way
from its current location to the hen's location, based on
the value of FoxSpeed. */
FoxX = lerp(FoxX, HenX, FoxSpeed);
FoxY = lerp(FoxY, HenY, FoxSpeed);
float foxR = FoxR;
if (ScaleRadius) { // should we scale the fox's size?
float d = dist(HenX, HenY, FoxX, FoxY);
foxR = map(d, 0, 100, 1, 3*FoxR);
}
// draw everything
fill(HenColor);
if (HenVisible) ellipse(HenX, HenY, 2*HenR, 2*HenR);
fill(FoxColor);
if (FoxVisible) ellipse(FoxX, FoxY, 2*foxR, 2*foxR);
}
void mousePressed() { setHenToMouse(); }
void mouseDragged() { setHenToMouse(); }
void setHenToMouse() { // the hen moves with the mouse
HenX = mouseX;
HenY = mouseY;
}
void keyTyped() {
if (key == 'a') FoxSpeed -= .01; // slow down the fox
if (key == 'd') FoxSpeed += .01; // speed up the fox
if (FoxSpeed < 0) FoxSpeed = 0; // don't allow speed to be negative
if (key == 'b') ClearBG = !ClearBG; // toggle clearing the background
if (key == 'f') FoxVisible = !FoxVisible; // toggle drawing the fox
if (key == 'h') HenVisible = !HenVisible; // toggle drawing the hen
if (key == 'r') ScaleRadius = !ScaleRadius; // toggle scaling the fox's size
}