Der folgende Sketch ermittelt zufällige Positionen innerhalb einer vorgegebenen Maske (Freiform), und stellt diese durch kleine Kreuze im Sketchfenster dar.

Die rein mathematische Lösung für einen zufälligen Punkt in einer Freiform ist für unser Anliegen zu aufwendig. Im Folgenden bedienen wir uns dem Trick einer Maskierung durch ein Pixelbild. Dieses besteht im Idealfall nur aus schwarzen und weißen Pixeln – wobei die schwarzen die Form bestimmen. Die get() Funktion, zum Auslesen von Farbwerten, wird in einer Funktion platziert, welche die zufällig ermittelte Position zurück gibt. Da sich eine Funktion auch selbst aufrufen kann (Rekursion), ist diese in der Lage so lange zu suchen, bis ein Punkt innerhalb der Form bestimmt wurde.
Weil eine Funktion nur eine Variable als Rückgabewert zur Verfügung hat, verwenden wir einen Vektor.
PVector imgPos; // Position der Maske im Sketch
PImage img; // Kontainer für die Masek
void setup () {
size (240, 160);
// Laden der Maske
img = loadImage ("cloud.png");
// Vektor für die Position der Maske im Sketch
imgPos = new PVector ();
// Maske im Fenster zentrieren
imgPos.x = (width - img.width) / 2;
imgPos.y = (height - img.height) / 2;
}
void draw () {
background (255);
for (int i=0; i < mouseX * 2; i++) {
// Ermittle eine zufällige Position in der Maske
PVector pos = randomPoint (img, imgPos);
// Zeichne ein kleines Kreuz an dieser
drawCross (pos);
}
}
/**
* Funktion ermittelt rekursiv die Position eines Pixels
* in einem gegebenen Bild, welches schwarz ist. Diese
* Koordinaten werden mit der Bildposition (Vektor)
* summiert und zurückgegeben.
*/
PVector randomPoint (PImage theImage, PVector thePos) {
// Zufallsposition im Bild
int x = (int) random (theImage.width);
int y = (int) random (theImage.height);
// Wenn Pixel an Position x,y schwarz ist
if (brightness (theImage.get (x, y)) == 0) {
// Gibt die Position als Vektor zurück
return new PVector (thePos.x + x, thePos.y + y);
}else{
// Sonst versuche es erneut
return randomPoint (theImage, thePos);
}
}
/**
* Funktion zeichnet ein Kreuz an dessen Mittelpunkt.
*/
void drawCross (PVector thePos) {
line (thePos.x-1, thePos.y-1, thePos.x+1, thePos.y+1);
line (thePos.x-1, thePos.y+1, thePos.x+1, thePos.y-1);
}


