|
|
a5e8d6 |
|
|
|
a5e8d6 |
#include <math.h></math.h>
|
|
|
a5e8d6 |
#include <helianthus.h></helianthus.h>
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
#define WIDTH 285.0
|
|
|
a5e8d6 |
#define HEIGHT 200.0
|
|
|
a5e8d6 |
#define RES 10.0
|
|
|
a5e8d6 |
#define THIKNESS 0.25
|
|
|
a5e8d6 |
#define ALPHA 0.50
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
#define DIAMETER 10.0
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
int cols;
|
|
|
a5e8d6 |
int rows;
|
|
|
a5e8d6 |
double border;
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
Framebuffer framebuffer;
|
|
|
a5e8d6 |
Animation fbAnim;
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
void generate() {
|
|
|
a5e8d6 |
double d = DIAMETER;
|
|
|
a5e8d6 |
double r = d/2.0;
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
saveState();
|
|
|
a5e8d6 |
target(framebuffer);
|
|
|
a5e8d6 |
clear();
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
zoom(RES);
|
|
|
a5e8d6 |
translate(WIDTH/2.0, HEIGHT/2.0);
|
|
|
a5e8d6 |
noFill();
|
|
|
a5e8d6 |
double c = 1 - ALPHA;
|
|
|
a5e8d6 |
stroke(colorByRGBA(c, c, c, 1));
|
|
|
a5e8d6 |
strokeWidth(THIKNESS);
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
translate(-(cols-1)*d, -(rows-1)*d);
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
double xx = (cols-1)*d*2;
|
|
|
a5e8d6 |
double yy = (rows-1)*d*2;
|
|
|
a5e8d6 |
circle( 0, 0, r);
|
|
|
a5e8d6 |
circle( 0, yy, r);
|
|
|
a5e8d6 |
circle(xx, 0, r);
|
|
|
a5e8d6 |
circle(xx, yy, r);
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
for(int y = 0; y < rows; ++y) {
|
|
|
a5e8d6 |
double py = y*d*2 - r;
|
|
|
a5e8d6 |
for(int x = 1; x < (cols-1)*4; ++x) {
|
|
|
a5e8d6 |
arc(x*r-d, py, d, d, -120, 0);
|
|
|
a5e8d6 |
arc(x*r , py, d, d, 60, 180);
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
arc(-r , py, d, d, 90, 150);
|
|
|
a5e8d6 |
arc(0 , py, d, d, 60, 120);
|
|
|
a5e8d6 |
arc(xx-d, py, d, d,-120, -60);
|
|
|
a5e8d6 |
arc(xx-r, py, d, d, -90, -30);
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
for(int x = 0; x < cols; ++x) {
|
|
|
a5e8d6 |
double px = x*d*2 - r;
|
|
|
a5e8d6 |
for(int y = 1; y < (rows-1)*4; ++y) {
|
|
|
a5e8d6 |
arc(px, y*r-d, d, d, -30, 90);
|
|
|
a5e8d6 |
arc(px, y*r , d, d, 150, 270);
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
arc(px, -r , d, d, 180, 240);
|
|
|
a5e8d6 |
arc(px, 0 , d, d, 150, 210);
|
|
|
a5e8d6 |
arc(px, yy-d, d, d, -30, 30);
|
|
|
a5e8d6 |
arc(px, yy-r, d, d, 0, 60);
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
viewportSave("data/output/generated-round-grid.png");
|
|
|
a5e8d6 |
restoreState();
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
void init() {
|
|
|
a5e8d6 |
double border = 2*THIKNESS;
|
|
|
a5e8d6 |
cols = ((int)floor((WIDTH - 2*border)/DIAMETER + 0.001) + 1)/2;
|
|
|
a5e8d6 |
rows = ((int)floor((HEIGHT - 2*border)/DIAMETER + 0.001) + 1)/2;
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
int w = ceil(WIDTH*RES - 0.001);
|
|
|
a5e8d6 |
int h = ceil(HEIGHT*RES - 0.001);
|
|
|
a5e8d6 |
framebuffer = createFramebuffer(w, h);
|
|
|
a5e8d6 |
fbAnim = createAnimationFromFramebuffer(framebuffer);
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
generate();
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
void draw() {
|
|
|
a5e8d6 |
double w = windowGetWidth();
|
|
|
a5e8d6 |
double h = windowGetHeight();
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
if (keyWentDown("space")) generate();
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
saveState();
|
|
|
a5e8d6 |
translate(w/2, h/2);
|
|
|
a5e8d6 |
zoom(w/WIDTH);
|
|
|
a5e8d6 |
fill(COLOR_WHITE);
|
|
|
a5e8d6 |
noStroke();
|
|
|
a5e8d6 |
rectTextured(fbAnim, -WIDTH/2.0, -HEIGHT/2.0, WIDTH, HEIGHT);
|
|
|
a5e8d6 |
restoreState();
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
|
|
|
a5e8d6 |
int main() {
|
|
|
a5e8d6 |
windowSetVariableFrameRate();
|
|
|
a5e8d6 |
windowSetResizable(TRUE);
|
|
|
a5e8d6 |
windowSetInit(&init);
|
|
|
a5e8d6 |
windowSetDraw(&draw);
|
|
|
a5e8d6 |
windowRun();
|
|
|
a5e8d6 |
}
|
|
|
a5e8d6 |
|