Assertions:
- Patterns are applied through two cells, horizontally and diagonally.
- Most patterns are parallel, but not all of them. Non-parallel patterns are followed by two blocks of curve stitches. This is the only “three-block” pattern.
- Rows and columns have similar patterns.
- Approximately 60 x 60 squares.
- Distance between lines seems to be unique for each set of two cells (horizontally/vertically).
- The slope between all lines is the same or vertically reflected, except in the few blocks with curve stitching.
- In some patterns with two filled blocks, the centerline of the pattern is darker.
- Not all blocks have a pattern.
- The probability of a block having both a vertical and a horizontal pattern on it is low.
- There is no block that is completely black.
My code:
import processing.svg.*; void setup() { size(1200, 1200); noLoop(); } void draw() { background(255); beginRecord(SVG, "molnar.svg"); stroke(0); //noStroke(); noFill(); int nCells = 60; rectMode(CENTER); float x1, x2, y1, y2, rwidth, rheight; rwidth = (width)/ (float)(nCells+2); rheight = rwidth; // Since it is square. for (int row =0; row<nCells; row++) { for (int col =0; col<nCells; col = col + 2) { if (random(1.0) > 0.25){ x1 = rwidth + row*rwidth; y1 = rheight + col*rheight; x2 = rwidth + x1; y2 = 2*rheight + y1; fillRect(x1,y1, x2,y2,false); } } } for (int row =0; row<nCells; row = row + 2) { for (int col =0; col<nCells; col++) { if (random(1.0) > 0.25){ //fill(0,0,0,50); x1 = rwidth + row*rwidth; y1 = rheight + col*rheight; x2 = 2*rwidth + x1; y2 = rheight + y1; fillRect(x1,y1, x2,y2, true); } } } endRecord(); } void fillRect(float x1, float y1, float x2,float y2, Boolean isHorizontal){ int lineNum = int(random(2, 6)); if (isHorizontal && random(1.0) < 0.05){ x2 = x1 + (x2-x1)/2; float horDist = x2 - x1; for(int i = 1; i < lineNum - 1; i++){ line(x2 - i*(x2-x1)/(lineNum-1), y1, x2 , y2 - i*(y2-y1)/(lineNum-1)); } x1 = x1 + horDist; x2 = x2 + horDist; for(int i = 1; i < lineNum; i++){ line(x1, y1 + (y2-y1)*i/(lineNum-1), x1 + (x2-x1)*i/(lineNum-1), y1); } for(int i = 1; i < lineNum; i++){ line(x1 + (x2-x1)*i/(lineNum-1), y2, x2, y1 + (y2-y1)*i/(lineNum-1)); } x1 = x1 + horDist; x2 = x2 + horDist; for(int i = 1; i < lineNum - 1; i++){ line(x1, y1 + i*(y2-y1)/(lineNum-1), x1 + i*(x2-x1)/(lineNum-1), y2); } return; } if (random(1.0) > 0.5){ if (random(1.0) > 0.5){ for(int i = 1; i < lineNum; i++){ // line(x1, y1 + i*(y2-y1)/(lineNum-1), x1 + i*(x2-x1)/(lineNum-1), y2); // curvy hatch line(x1, y1 + (y2-y1)*i/(lineNum-1), x1 + (x2-x1)*i/(lineNum-1), y1); } } if (random(1.0) > 0.5){ for(int i = 1; i < lineNum; i++){ // line(x1, y1 + i*(y2-y1)/(lineNum-1), x1 + i*(x2-x1)/(lineNum-1), y2); // curvy hatch line(x1 + (x2-x1)*i/(lineNum-1), y2, x2, y1 + (y2-y1)*i/(lineNum-1)); } } }else{ if (random(1.0) > 0.5){ for(int i = 0; i < lineNum -1; i++){ line(x1, y1 + (y2-y1)*i/(lineNum-1), x2 - (x2-x1)*i/(lineNum-1), y2); } } if (random(1.0) > 0.5){ for(int i = 0 ; i < lineNum - 1; i++){ line(x1 + (x2-x1)*i/(lineNum-1), y1, x2, y2 - (y2-y1)*i/(lineNum-1)); } } } }