Generative art expressing some fear of the dark.
The dark tunnel with flowers.
It' a generative artwork made with the 'Processing'.
I want to express some fear of the dark. Bright and beautiful flower leads me to the dark. And I feel something in the dark.
I used the code from 'Full Bloom' to draw a flower. And I put it to PImage to draw repeatedly.
The example code of this generative art.
Please feel free to use this example code, if you like it.
To see other works based on my code is my pleasure. And my honor.
// Down in the Hole.
// Processing 3.2.1
// 2018.06.10
// @deconbatch
void setup() {
size(960, 960);
colorMode(HSB, 360, 100, 100, 100);
imageMode(CENTER);
smooth();
noLoop();
noStroke();
}
void draw() {
translate(width / 2, height / 2);
float hueBase = (160 + random(240)) % 360; // avoid yellow and green
background(hueBase, 100, 10, 100);
blendMode(BLEND);
// draw flower and copy
pushMatrix();
drawFlower(hueBase);
popMatrix();
PImage imgFlower = get(width / 2 - 200, height / 2 - 200, 400, 400); // why?
// draw tunnel
background(hueBase, 100, 10, 100);
blendMode(LIGHTEST);
int depthMax = 50; // tunnel depth
for (int depth = depthMax; depth >= 1; --depth) {
// deeper : small, narrow layout, deeper color, darker
float ratio = map(depth, 1, depthMax, 0.0, 0.9);
int flwSize = floor(width * 0.5 * (1.0 - sqrt(ratio)));
float flwLayout = width * 0.7 * (1.0 - sqrt(ratio));
float flwSat = 1.0 + sqrt(ratio);
float flwBri = pow(1.0 - sqrt(ratio), 2);
PImage tmpFlower = imgFlower.copy();
tmpFlower.resize(flwSize, flwSize);
repaintFlower(
tmpFlower,
flwSat,
flwBri
);
layFlower(tmpFlower, flwLayout);
rotate(PI*random(1.0));
}
saveFrame("frames/0001.png");
exit();
}
void repaintFlower(PImage img, float saturationRatio, float brightnessRatio) {
for (int idxW = 0; idxW < img.width; ++idxW) {
for (int idxH = 0; idxH < img.height; ++idxH) {
int idxPoint = idxH * img.width + idxW;
color cPoint = img.pixels[idxPoint];
float valHue = hue(cPoint);
float valSat = saturation(cPoint) * saturationRatio;
float valBri = brightness(cPoint) * brightnessRatio;
float valAlp = alpha(cPoint);
img.pixels[idxPoint] = color(valHue, valSat, valBri, valAlp);
}
}
}
void layFlower(PImage flower, float radius) {
for (float radian = 0; radian < 2.0 * PI; radian += PI / 8.0) {
if (random(1.0) < 0.8) {
float imgRadius = map(random(1.0), 0.0, 1.0, radius * 0.9, radius * 1.1);
image(flower, imgRadius * cos(radian), imgRadius * sin(radian));
}
}
}
void drawFlower(float pBaseColor) {
// tweak these values
int divRotate = 5; // petal width, bigger : thinner
int cntRotateMax = 20 * 360 * divRotate; // draw petals from outside to inside, and how many time and again
int cntRepeatMax = 30; // how soft petal, bigger : soft petal
int cntLinesMax = 24; // how many different flower set count
float baseSize = 3.0; // brush size
float baseDrawEnd = 100.0; // flower size
float baseColor = pBaseColor;
float noiseHueStart = random(100.0);
float noiseOrbStart = random(100.0);
// center of flower
fill(baseColor, 10, 80, 100);
ellipse(0, 0, 200, 200);
// draw petals
for (int cntLines = 0; cntLines < cntLinesMax; ++cntLines) {
canvasRotation(180.0 * cntLines / cntLinesMax);
float noiseSatStart = random(100.0);
float noiseBriStart = random(100.0);
float noiseAlpStart = random(100.0);
float petalColor = baseColor + 30 * cntLines / cntLinesMax;
for (int cntRepeat = 0; cntRepeat < cntRepeatMax; ++cntRepeat) {
canvasRotation(4.0 / cntRepeatMax);
float noiseHue = noiseHueStart;
float noiseSat = noiseSatStart;
float noiseBri = noiseBriStart;
float noiseAlp = noiseAlpStart;
float noiseOrb = noiseOrbStart;
float sumRotation = 0.0;
float sizShape = map(cntRepeat, 0, cntRepeatMax, 0.9, 1.3);
float satShape = map(cntRepeat, 0, cntRepeatMax, 1.4, 0.6);
float alpShape = map(cntRepeat, 0, cntRepeatMax, 0.1, 1.0);
for (int cntRotate = 0; cntRotate < cntRotateMax; ++cntRotate) {
float rotation = 0.2 / divRotate;
canvasRotation(rotation);
sumRotation += rotation * map(noise(noiseOrb), 0.0, 1.0, -1.0, 1.0);
float idxW = baseDrawEnd * abs(sin(radians(sumRotation)) + cos(radians(sumRotation)));
idxW += map(noise(noiseSat), 0.0, 1.0, -5.0, 60.0);
idxW *= map(noise(noiseAlp), 0.0, 1.0, 0.6, 1.0);
float idxH = 0.0;
float brushHue = (petalColor + 360 + map(noise(noiseHue), 0.0, 1.0, -30.0, 30.0)) % 360;
float brushSat = map(noise(noiseSat), 0.0, 1.0, 0.0, 30.0) * satShape;
float brushSiz = map(noise(noiseAlp), 0.0, 1.0, 0.0, 2.0) * baseSize;
float brushBri = map(noise(noiseBri), 0.0, 1.0, 80.0, 120.0);
float brushAlp = map(noise(noiseAlp), 0.0, 1.0, 50.0, 100.0) * alpShape;
noiseHue += 0.001;
noiseSat += 0.003;
noiseBri += 0.004;
noiseAlp += 0.001;
noiseOrb += 0.008;
pushMatrix();
translate(idxW * sizShape, idxH * sizShape);
fill(brushHue, brushSat, brushBri, brushAlp);
ellipse(0.0, 0.0, brushSiz, brushSiz);
popMatrix();
}
canvasRotation(-cntRotateMax);
}
}
}
void canvasRotation(float degrees) {
rotate(radians(degrees));
}
/*
Copyright (C) 2018- deconbatch
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
*/

