Face 1
Face 1
Log in to post a comment.
// TurtleToy-compatible "Grid over Image" with barrel & swirl transforms
// Paste into https://turtletoy.net/ (or your local equivalent).
// The grid density/offset responds to the embedded luminance map below.
// Controls are at the top (use TurtleToy sliders).
Canvas.setpenopacity(1);
// -------- Controls --------
const seed = 1; //min=0 max=999999 step=1
const rows = 40; //min=10 max=120 step=1
const cols = 30; //min=10 max=120 step=1
const padding = 8; //min=0 max=40 step=1
const subLines = 8; //min=1 max=30 step=1 (max hatch per cell)
const subMin = 1; //min=0 max=20 step=1 (min hatch per cell)
const jitter = .20; //min=0 max=1 step=.01 (random line jitter inside cell)
const bias = .15; //min=0 max=1 step=.01 (bias to dark areas)
const displace = .35; //min=0 max=2 step=.01 (bezier-ish bend amount)
const type = 2; //min=0 max=2 step=1 (Linear, Fixed Bezier, Dynamic Bezier)
// Field transforms
const barrel = 0.35; //min=-2 max=2 step=.01 (>0 bulge, <0 pinch)
const barrelOffsetX = 0; //min=-100 max=100 step=1
const barrelOffsetY = 0; //min=-100 max=100 step=1
const swirl = 0.25; //min=-2 max=2 step=.01 (rotation strength)
const swirlRadius = 120; //min=1 max=300 step=1
// Image mapping
const imgContrast = 1.20; //min=.2 max=3 step=.01
const imgGamma = 0.9; //min=.2 max=3 step=.01
const imgInvert = 0; //min=0 max=1 step=1 (No, Yes)
const imgExpand = 1.00; //min=.5 max=2 step=.01 (scale image mapping)
// -------- Setup --------
const turtle = new Turtle();
const CANVAS = 200;
const left = -CANVAS/2, top = -CANVAS/2;
const CELL_W = (CANVAS - padding*2) / cols;
const CELL_H = (CANVAS - padding*2) / rows;
// Embedded luminance (0..1; 0=black, 1=white), portrait oriented.
const IMG_W = 55;
const IMG_H = 96;
const IMG = [
0.32, 0.44, 0.42, 0.45, 0.36, 0.17, 0.19, 0.19, 0.21, 0.22, 0.24, 0.25, 0.26, 0.27, 0.28, 0.25, 0.38, 0.52, 0.51, 0.53, 0.55, 0.56, 0.56, 0.55,
0.58, 0.56, 0.59, 0.60, 0.60, 0.67, 0.67, 0.66, 0.71, 0.73, 0.71, 0.70, 0.70, 0.70, 0.69, 0.68, 0.67, 0.65, 0.64, 0.63, 0.62, 0.62, 0.60, 0.59,
0.58, 0.58, 0.58, 0.59, 0.59, 0.58, 0.60, 0.16, 0.33, 0.44, 0.44, 0.36, 0.18, 0.19, 0.20, 0.21, 0.22, 0.24, 0.25, 0.27, 0.27, 0.28, 0.26, 0.38,
0.51, 0.51, 0.53, 0.55, 0.56, 0.55, 0.55, 0.58, 0.56, 0.59, 0.60, 0.61, 0.68, 0.67, 0.66, 0.72, 0.74, 0.72, 0.70, 0.70, 0.70, 0.69, 0.68, 0.67,
0.65, 0.64, 0.63, 0.62, 0.62, 0.60, 0.58, 0.57, 0.57, 0.57, 0.58, 0.59, 0.58, 0.59, 0.18, 0.22, 0.33, 0.45, 0.35, 0.18, 0.19, 0.20, 0.22, 0.22,
0.24, 0.26, 0.27, 0.27, 0.28, 0.26, 0.37, 0.51, 0.51, 0.54, 0.55, 0.56, 0.56, 0.55, 0.58, 0.56, 0.59, 0.60, 0.62, 0.69, 0.69, 0.66, 0.72, 0.74,
0.72, 0.71, 0.71, 0.71, 0.70, 0.69, 0.67, 0.65, 0.64, 0.63, 0.62, 0.62, 0.60, 0.58, 0.57, 0.57, 0.57, 0.57, 0.58, 0.58, 0.60, 0.18, 0.26, 0.22,
0.35, 0.37, 0.18, 0.20, 0.20, 0.22, 0.23, 0.24, 0.26, 0.27, 0.27, 0.28, 0.26, 0.37, 0.50, 0.51, 0.53, 0.55, 0.56, 0.56, 0.55, 0.58, 0.56, 0.59,
0.60, 0.62, 0.71, 0.70, 0.67, 0.73, 0.75, 0.72, 0.71, 0.72, 0.71, 0.70, 0.69, 0.67, 0.66, 0.64, 0.64, 0.63, 0.62, 0.60, 0.58, 0.57, 0.57, 0.57,
0.57, 0.58, 0.58, 0.59, 0.18, 0.25, 0.26, 0.23, 0.29, 0.19, 0.19, 0.20, 0.22, 0.23, 0.24, 0.27, 0.28, 0.27, 0.27, 0.27, 0.37, 0.50, 0.50, 0.53,
0.55, 0.57, 0.56, 0.55, 0.58, 0.56, 0.60, 0.61, 0.62, 0.72, 0.71, 0.68, 0.73, 0.75, 0.73, 0.72, 0.72, 0.72, 0.71, 0.69, 0.68, 0.66, 0.65, 0.64,
0.63, 0.62, 0.60, 0.58, 0.57, 0.57, 0.57, 0.57, 0.58, 0.58, 0.58, 0.18, 0.25, 0.26, 0.25, 0.20, 0.20, 0.20, 0.21, 0.22, 0.23, 0.25, 0.27, 0.27,
0.27, 0.28, 0.26, 0.38, 0.50, 0.51, 0.53, 0.55, 0.57, 0.56, 0.55, 0.58, 0.56, 0.60, 0.61, 0.64, 0.73, 0.72, 0.69, 0.74, 0.76, 0.74, 0.73, 0.73,
0.73, 0.71, 0.70, 0.68, 0.65, 0.65, 0.64, 0.63, 0.62, 0.60, 0.58, 0.58, 0.58, 0.56, 0.56, 0.58, 0.58, 0.59, 0.18, 0.24, 0.25, 0.25, 0.22, 0.18,
0.22, 0.21, 0.22, 0.24, 0.25, 0.27, 0.28, 0.28, 0.28, 0.26, 0.38, 0.50, 0.51, 0.53, 0.56, 0.57, 0.56, 0.55, 0.59, 0.57, 0.61, 0.62, 0.64, 0.75,
0.73, 0.70, 0.75, 0.77, 0.75, 0.73, 0.74, 0.73, 0.71, 0.70, 0.69, 0.66, 0.65, 0.64, 0.63, 0.62, 0.60, 0.58, 0.59, 0.57, 0.55, 0.56, 0.58, 0.58,
0.59, 0.17, 0.24, 0.24, 0.25, 0.22, 0.15, 0.18, 0.23, 0.23, 0.24, 0.25, 0.27, 0.28, 0.28, 0.28, 0.26, 0.38, 0.51, 0.51, 0.53, 0.56, 0.57, 0.56,
0.56, 0.59, 0.57, 0.61, 0.62, 0.65, 0.76, 0.75, 0.72, 0.76, 0.78, 0.75, 0.74, 0.75, 0.74, 0.72, 0.71, 0.69, 0.67, 0.65, 0.64, 0.63, 0.62, 0.60,
0.60, 0.58, 0.55, 0.55, 0.56, 0.58, 0.58, 0.58, 0.17, 0.24, 0.24, 0.24, 0.21, 0.15, 0.14, 0.19, 0.25, 0.24, 0.25, 0.27, 0.29, 0.28, 0.28, 0.26,
0.38, 0.51, 0.51, 0.54, 0.56, 0.58, 0.57, 0.56, 0.59, 0.57, 0.61, 0.62, 0.66, 0.78, 0.76, 0.73, 0.77, 0.79, 0.76, 0.75, 0.76, 0.75, 0.73, 0.71,
0.69, 0.67, 0.65, 0.64, 0.63, 0.62, 0.62, 0.59, 0.55, 0.55, 0.54, 0.56, 0.57, 0.57, 0.58, 0.17, 0.24, 0.24, 0.24, 0.21, 0.15, 0.14, 0.14, 0.20,
0.27, 0.25, 0.28, 0.29, 0.30, 0.28, 0.26, 0.38, 0.51, 0.52, 0.54, 0.56, 0.58, 0.57, 0.56, 0.60, 0.58, 0.62, 0.63, 0.67, 0.79, 0.77, 0.74, 0.78,
0.80, 0.77, 0.76, 0.77, 0.75, 0.74, 0.72, 0.71, 0.67, 0.64, 0.64, 0.63, 0.64, 0.62, 0.55, 0.55, 0.55, 0.54, 0.56, 0.57, 0.57, 0.58, 0.17, 0.24,
0.24, 0.24, 0.21, 0.15, 0.15, 0.14, 0.14, 0.20, 0.28, 0.28, 0.29, 0.31, 0.33, 0.25, 0.38, 0.51, 0.53, 0.55, 0.57, 0.58, 0.58, 0.57, 0.60, 0.58,
0.62, 0.63, 0.67, 0.81, 0.79, 0.75, 0.79, 0.80, 0.78, 0.77, 0.77, 0.76, 0.75, 0.73, 0.71, 0.65, 0.64, 0.64, 0.66, 0.61, 0.44, 0.55, 0.55, 0.55,
0.54, 0.56, 0.57, 0.57, 0.58, 0.17, 0.23, 0.24, 0.24, 0.20, 0.15, 0.15, 0.15, 0.15, 0.13, 0.21, 0.32, 0.30, 0.30, 0.33, 0.32, 0.38, 0.50, 0.52,
0.56, 0.58, 0.59, 0.59, 0.58, 0.60, 0.58, 0.63, 0.64, 0.69, 0.82, 0.81, 0.77, 0.80, 0.81, 0.78, 0.78, 0.78, 0.77, 0.76, 0.74, 0.67, 0.65, 0.65,
0.66, 0.67, 0.39, 0.39, 0.57, 0.55, 0.55, 0.54, 0.56, 0.58, 0.57, 0.57, 0.17, 0.22, 0.24, 0.23, 0.20, 0.15, 0.14, 0.14, 0.15, 0.15, 0.12, 0.23,
0.34, 0.31, 0.31, 0.33, 0.42, 0.50, 0.50, 0.56, 0.58, 0.60, 0.59, 0.58, 0.61, 0.58, 0.63, 0.64, 0.70, 0.84, 0.82, 0.78, 0.81, 0.82, 0.79, 0.78,
0.80, 0.78, 0.76, 0.69, 0.67, 0.67, 0.66, 0.69, 0.45, 0.31, 0.42, 0.56, 0.55, 0.55, 0.54, 0.55, 0.57, 0.57, 0.57, 0.17, 0.23, 0.24, 0.23, 0.20,
0.15, 0.15, 0.15, 0.14, 0.15, 0.15, 0.13, 0.25, 0.35, 0.33, 0.31, 0.42, 0.51, 0.49, 0.54, 0.59, 0.60, 0.60, 0.59, 0.62, 0.59, 0.64, 0.65, 0.71,
0.85, 0.84, 0.80, 0.81, 0.82, 0.80, 0.80, 0.81, 0.80, 0.70, 0.67, 0.68, 0.67, 0.71, 0.48, 0.34, 0.35, 0.41, 0.56, 0.55, 0.56, 0.54, 0.55, 0.56,
0.56, 0.57, 0.17, 0.22, 0.24, 0.23, 0.20, 0.14, 0.14, 0.16, 0.15, 0.14, 0.15, 0.16, 0.13, 0.28, 0.37, 0.32, 0.41, 0.49, 0.49, 0.50, 0.59, 0.61,
0.60, 0.60, 0.62, 0.59, 0.64, 0.65, 0.71, 0.87, 0.85, 0.81, 0.82, 0.84, 0.80, 0.81, 0.83, 0.72, 0.67, 0.69, 0.68, 0.72, 0.53, 0.35, 0.38, 0.34,
0.41, 0.57, 0.55, 0.55, 0.53, 0.55, 0.56, 0.56, 0.56, 0.17, 0.22, 0.23, 0.22, 0.19, 0.14, 0.13, 0.14, 0.16, 0.16, 0.15, 0.16, 0.18, 0.15, 0.31,
0.37, 0.42, 0.49, 0.49, 0.48, 0.56, 0.62, 0.61, 0.61, 0.62, 0.59, 0.64, 0.65, 0.71, 0.88, 0.86, 0.82, 0.84, 0.84, 0.81, 0.84, 0.74, 0.66, 0.69,
0.69, 0.73, 0.59, 0.37, 0.39, 0.37, 0.34, 0.41, 0.57, 0.54, 0.55, 0.53, 0.55, 0.57, 0.56, 0.56, 0.17, 0.22, 0.23, 0.22, 0.19, 0.14, 0.14, 0.14,
0.13, 0.17, 0.19, 0.18, 0.20, 0.21, 0.18, 0.31, 0.46, 0.49, 0.49, 0.50, 0.49, 0.62, 0.62, 0.62, 0.62, 0.59, 0.65, 0.65, 0.73, 0.89, 0.87, 0.83,
0.84, 0.85, 0.84, 0.75, 0.65, 0.69, 0.69, 0.73, 0.64, 0.41, 0.42, 0.40, 0.38, 0.34, 0.40, 0.56, 0.55, 0.55, 0.53, 0.55, 0.57, 0.56, 0.56, 0.18,
0.22, 0.22, 0.21, 0.18, 0.15, 0.14, 0.13, 0.14, 0.13, 0.16, 0.22, 0.22, 0.24, 0.26, 0.22, 0.38, 0.52, 0.49, 0.51, 0.49, 0.56, 0.64, 0.62, 0.63,
0.59, 0.65, 0.66, 0.73, 0.90, 0.88, 0.84, 0.85, 0.88, 0.78, 0.64, 0.69, 0.69, 0.73, 0.68, 0.45, 0.45, 0.45, 0.42, 0.39, 0.31, 0.40, 0.57, 0.54,
0.56, 0.55, 0.54, 0.56, 0.56, 0.56, 0.18, 0.22, 0.22, 0.21, 0.17, 0.11, 0.15, 0.15, 0.13, 0.14, 0.13, 0.16, 0.24, 0.29, 0.30, 0.33, 0.29, 0.42,
0.54, 0.51, 0.52, 0.50, 0.64, 0.63, 0.63, 0.59, 0.65, 0.66, 0.73, 0.91, 0.89, 0.85, 0.86, 0.89, 0.69, 0.66, 0.71, 0.74, 0.72, 0.49, 0.48, 0.49,
0.46, 0.39, 0.33, 0.45, 0.58, 0.54, 0.58, 0.55, 0.39, 0.51, 0.57, 0.56, 0.56, 0.18, 0.22, 0.22, 0.21, 0.17, 0.11, 0.10, 0.15, 0.16, 0.13, 0.13,
0.17, 0.19, 0.26, 0.36, 0.37, 0.40, 0.36, 0.44, 0.55, 0.53, 0.51, 0.58, 0.65, 0.62, 0.60, 0.65, 0.66, 0.74, 0.92, 0.89, 0.85, 0.88, 0.84, 0.65,
0.70, 0.73, 0.74, 0.52, 0.50, 0.52, 0.47, 0.38, 0.42, 0.60, 0.72, 0.64, 0.57, 0.47, 0.32, 0.28, 0.51, 0.57, 0.56, 0.56, 0.18, 0.22, 0.22, 0.21,
0.17, 0.11, 0.10, 0.10, 0.14, 0.17, 0.19, 0.24, 0.25, 0.23, 0.27, 0.42, 0.47, 0.48, 0.44, 0.47, 0.56, 0.55, 0.53, 0.65, 0.64, 0.60, 0.66, 0.66,
0.74, 0.92, 0.90, 0.86, 0.89, 0.76, 0.66, 0.74, 0.76, 0.55, 0.53, 0.54, 0.46, 0.44, 0.59, 0.73, 0.74, 0.72, 0.60, 0.35, 0.27, 0.31, 0.31, 0.51,
0.57, 0.56, 0.55, 0.18, 0.22, 0.22, 0.20, 0.16, 0.13, 0.11, 0.10, 0.11, 0.13, 0.24, 0.28, 0.30, 0.33, 0.31, 0.29, 0.46, 0.59, 0.58, 0.51, 0.51,
0.58, 0.53, 0.60, 0.65, 0.59, 0.66, 0.67, 0.75, 0.93, 0.91, 0.87, 0.87, 0.69, 0.72, 0.78, 0.58, 0.54, 0.53, 0.48, 0.59, 0.75, 0.79, 0.76, 0.70,
0.64, 0.42, 0.25, 0.31, 0.31, 0.33, 0.51, 0.57, 0.56, 0.55, 0.18, 0.22, 0.22, 0.20, 0.16, 0.09, 0.13, 0.12, 0.11, 0.12, 0.20, 0.27, 0.33, 0.36,
0.40, 0.40, 0.34, 0.46, 0.67, 0.69, 0.60, 0.53, 0.56, 0.55, 0.65, 0.60, 0.66, 0.67, 0.75, 0.93, 0.91, 0.89, 0.79, 0.70, 0.79, 0.61, 0.52, 0.52,
0.60, 0.76, 0.83, 0.79, 0.74, 0.66, 0.57, 0.53, 0.42, 0.27, 0.30, 0.35, 0.31, 0.50, 0.57, 0.56, 0.55, 0.18, 0.22, 0.21, 0.19, 0.16, 0.08, 0.07,
0.13, 0.13, 0.12, 0.21, 0.24, 0.29, 0.37, 0.42, 0.46, 0.49, 0.43, 0.45, 0.69, 0.77, 0.66, 0.56, 0.54, 0.62, 0.61, 0.66, 0.67, 0.75, 0.93, 0.91,
0.88, 0.73, 0.78, 0.62, 0.51, 0.62, 0.77, 0.86, 0.83, 0.78, 0.73, 0.65, 0.60, 0.56, 0.55, 0.44, 0.27, 0.33, 0.32, 0.28, 0.50, 0.57, 0.55, 0.55,
0.18, 0.22, 0.21, 0.20, 0.15, 0.08, 0.08, 0.08, 0.12, 0.16, 0.24, 0.27, 0.34, 0.39, 0.45, 0.50, 0.53, 0.58, 0.55, 0.47, 0.66, 0.80, 0.73, 0.58,
0.56, 0.62, 0.66, 0.67, 0.75, 0.93, 0.91, 0.86, 0.75, 0.64, 0.59, 0.79, 0.89, 0.87, 0.82, 0.81, 0.79, 0.75, 0.71, 0.67, 0.62, 0.58, 0.46, 0.31,
0.31, 0.29, 0.28, 0.50, 0.57, 0.56, 0.55, 0.19, 0.22, 0.21, 0.19, 0.15, 0.08, 0.08, 0.09, 0.08, 0.17, 0.19, 0.13, 0.16, 0.22, 0.28, 0.36, 0.44,
0.55, 0.66, 0.69, 0.60, 0.64, 0.78, 0.75, 0.59, 0.60, 0.67, 0.66, 0.73, 0.93, 0.91, 0.89, 0.72, 0.78, 0.91, 0.92, 0.91, 0.90, 0.87, 0.78, 0.66,
0.53, 0.40, 0.30, 0.24, 0.21, 0.25, 0.27, 0.29, 0.30, 0.27, 0.51, 0.57, 0.55, 0.55, 0.19, 0.23, 0.20, 0.19, 0.15, 0.09, 0.09, 0.09, 0.13, 0.15,
0.22, 0.30, 0.24, 0.15, 0.06, 0.04, 0.07, 0.14, 0.25, 0.42, 0.60, 0.69, 0.71, 0.79, 0.73, 0.61, 0.64, 0.61, 0.72, 0.93, 0.94, 0.71, 0.82, 0.99,
0.97, 0.91, 0.77, 0.56, 0.35, 0.18, 0.07, 0.02, 0.05, 0.16, 0.27, 0.32, 0.20, 0.18, 0.25, 0.28, 0.27, 0.50, 0.57, 0.55, 0.55, 0.19, 0.23, 0.20,
0.18, 0.15, 0.09, 0.09, 0.11, 0.18, 0.27, 0.41, 0.49, 0.50, 0.49, 0.42, 0.30, 0.17, 0.09, 0.05, 0.04, 0.08, 0.21, 0.38, 0.55, 0.67, 0.58, 0.61,
0.63, 0.73, 0.95, 0.85, 0.53, 0.73, 0.78, 0.50, 0.26, 0.09, 0.02, 0.02, 0.06, 0.16, 0.32, 0.45, 0.56, 0.65, 0.61, 0.47, 0.25, 0.17, 0.25, 0.26,
0.49, 0.57, 0.55, 0.55, 0.19, 0.23, 0.20, 0.18, 0.14, 0.09, 0.11, 0.19, 0.30, 0.46, 0.46, 0.51, 0.49, 0.56, 0.43, 0.32, 0.28, 0.23, 0.18, 0.13,
0.08, 0.04, 0.02, 0.04, 0.22, 0.60, 0.66, 0.64, 0.73, 0.95, 0.62, 0.60, 0.39, 0.03, 0.01, 0.01, 0.05, 0.11, 0.18, 0.28, 0.36, 0.42, 0.58, 0.63,
0.69, 0.69, 0.70, 0.58, 0.16, 0.15, 0.22, 0.48, 0.57, 0.55, 0.55, 0.20, 0.23, 0.19, 0.17, 0.14, 0.13, 0.15, 0.24, 0.14, 0.29, 0.47, 0.49, 0.58,
0.62, 0.39, 0.13, 0.09, 0.09, 0.11, 0.11, 0.12, 0.11, 0.10, 0.05, 0.06, 0.50, 0.60, 0.65, 0.76, 0.78, 0.54, 0.61, 0.15, 0.03, 0.09, 0.13, 0.18,
0.22, 0.23, 0.20, 0.18, 0.31, 0.65, 0.70, 0.62, 0.72, 0.59, 0.35, 0.24, 0.12, 0.12, 0.44, 0.58, 0.55, 0.55, 0.20, 0.23, 0.19, 0.16, 0.14, 0.13,
0.17, 0.23, 0.14, 0.17, 0.30, 0.45, 0.52, 0.53, 0.40, 0.17, 0.08, 0.05, 0.04, 0.06, 0.08, 0.08, 0.11, 0.12, 0.08, 0.42, 0.57, 0.60, 0.71, 0.60,
0.59, 0.48, 0.10, 0.13, 0.15, 0.20, 0.20, 0.18, 0.11, 0.11, 0.18, 0.40, 0.59, 0.61, 0.55, 0.47, 0.34, 0.29, 0.28, 0.15, 0.09, 0.38, 0.59, 0.55,
0.55, 0.20, 0.23, 0.18, 0.16, 0.15, 0.13, 0.22, 0.19, 0.14, 0.21, 0.16, 0.13, 0.06, 0.09, 0.27, 0.35, 0.33, 0.26, 0.11, 0.02, 0.04, 0.08, 0.08,
0.09, 0.05, 0.35, 0.59, 0.55, 0.53, 0.49, 0.55, 0.34, 0.08, 0.11, 0.18, 0.20, 0.15, 0.07, 0.14, 0.27, 0.34, 0.34, 0.18, 0.08, 0.16, 0.20, 0.26,
0.33, 0.29, 0.18, 0.08, 0.34, 0.59, 0.55, 0.55, 0.20, 0.23, 0.18, 0.16, 0.15, 0.14, 0.24, 0.15, 0.19, 0.11, 0.02, 0.06, 0.24, 0.45, 0.65, 0.74,
0.75, 0.75, 0.60, 0.36, 0.09, 0.03, 0.09, 0.13, 0.05, 0.25, 0.58, 0.54, 0.49, 0.48, 0.54, 0.24, 0.06, 0.17, 0.21, 0.13, 0.11, 0.34, 0.60, 0.73,
0.81, 0.74, 0.52, 0.30, 0.12, 0.05, 0.07, 0.23, 0.31, 0.22, 0.08, 0.30, 0.59, 0.56, 0.56, 0.21, 0.24, 0.18, 0.16, 0.15, 0.17, 0.21, 0.15, 0.11,
0.02, 0.14, 0.31, 0.35, 0.26, 0.16, 0.19, 0.28, 0.26, 0.40, 0.52, 0.47, 0.15, 0.04, 0.11, 0.12, 0.16, 0.56, 0.56, 0.51, 0.50, 0.52, 0.14, 0.13,
0.22, 0.12, 0.16, 0.44, 0.50, 0.40, 0.33, 0.27, 0.19, 0.24, 0.30, 0.29, 0.19, 0.08, 0.07, 0.22, 0.27, 0.09, 0.25, 0.58, 0.56, 0.56, 0.21, 0.24,
0.18, 0.16, 0.15, 0.19, 0.19, 0.09, 0.05, 0.14, 0.17, 0.09, 0.03, 0.04, 0.00, 0.10, 0.34, 0.00, 0.01, 0.06, 0.29, 0.47, 0.16, 0.05, 0.14, 0.16,
0.51, 0.56, 0.48, 0.48, 0.42, 0.12, 0.23, 0.14, 0.18, 0.44, 0.25, 0.04, 0.00, 0.22, 0.28, 0.00, 0.03, 0.03, 0.05, 0.12, 0.16, 0.11, 0.08, 0.22,
0.13, 0.19, 0.57, 0.56, 0.56, 0.22, 0.25, 0.18, 0.16, 0.16, 0.16, 0.09, 0.07, 0.09, 0.06, 0.03, 0.04, 0.18, 0.24, 0.08, 0.05, 0.01, 0.14, 0.25,
0.44, 0.11, 0.17, 0.39, 0.13, 0.08, 0.13, 0.35, 0.58, 0.57, 0.70, 0.48, 0.22, 0.17, 0.18, 0.37, 0.15, 0.17, 0.16, 0.11, 0.02, 0.06, 0.08, 0.22,
0.22, 0.05, 0.03, 0.04, 0.08, 0.07, 0.05, 0.09, 0.20, 0.56, 0.57, 0.56, 0.22, 0.25, 0.18, 0.17, 0.18, 0.27, 0.23, 0.11, 0.08, 0.07, 0.09, 0.13,
0.25, 0.46, 0.20, 0.11, 0.20, 0.22, 0.60, 0.69, 0.31, 0.15, 0.12, 0.22, 0.13, 0.12, 0.34, 0.71, 0.78, 1.00, 0.73, 0.31, 0.18, 0.22, 0.09, 0.15,
0.47, 0.47, 0.16, 0.19, 0.16, 0.18, 0.50, 0.31, 0.14, 0.11, 0.07, 0.07, 0.11, 0.20, 0.31, 0.27, 0.55, 0.57, 0.56, 0.22, 0.26, 0.19, 0.16, 0.33,
0.40, 0.40, 0.42, 0.16, 0.13, 0.12, 0.14, 0.24, 0.43, 0.53, 0.32, 0.27, 0.49, 0.75, 0.72, 0.70, 0.69, 0.54, 0.31, 0.19, 0.14, 0.36, 0.71, 0.76,
0.99, 0.71, 0.30, 0.20, 0.34, 0.55, 0.61, 0.65, 0.69, 0.44, 0.23, 0.28, 0.55, 0.55, 0.32, 0.16, 0.10, 0.17, 0.27, 0.33, 0.50, 0.61, 0.40, 0.52,
0.58, 0.56, 0.23, 0.27, 0.20, 0.17, 0.28, 0.35, 0.31, 0.45, 0.48, 0.15, 0.14, 0.13, 0.16, 0.20, 0.31, 0.50, 0.57, 0.67, 0.62, 0.54, 0.39, 0.27,
0.36, 0.42, 0.13, 0.14, 0.38, 0.72, 0.77, 1.00, 0.74, 0.24, 0.17, 0.52, 0.31, 0.34, 0.58, 0.66, 0.72, 0.62, 0.54, 0.41, 0.27, 0.21, 0.13, 0.15,
0.34, 0.44, 0.47, 0.51, 0.60, 0.42, 0.50, 0.59, 0.57, 0.24, 0.29, 0.21, 0.20, 0.18, 0.33, 0.37, 0.32, 0.53, 0.51, 0.16, 0.16, 0.12, 0.16, 0.20,
0.27, 0.30, 0.32, 0.21, 0.18, 0.31, 0.47, 0.69, 0.61, 0.31, 0.16, 0.38, 0.73, 0.76, 1.00, 0.72, 0.27, 0.55, 0.58, 0.47, 0.29, 0.16, 0.27, 0.42,
0.40, 0.29, 0.22, 0.22, 0.16, 0.14, 0.34, 0.55, 0.58, 0.48, 0.52, 0.49, 0.25, 0.53, 0.58, 0.57, 0.25, 0.29, 0.22, 0.20, 0.22, 0.26, 0.51, 0.38,
0.32, 0.65, 0.53, 0.16, 0.22, 0.13, 0.13, 0.14, 0.14, 0.18, 0.36, 0.56, 0.63, 0.74, 0.81, 0.74, 0.47, 0.24, 0.39, 0.73, 0.76, 1.00, 0.72, 0.33,
0.74, 0.77, 0.53, 0.61, 0.48, 0.24, 0.18, 0.19, 0.20, 0.25, 0.17, 0.22, 0.40, 0.63, 0.71, 0.46, 0.49, 0.52, 0.42, 0.22, 0.55, 0.59, 0.57, 0.25,
0.31, 0.23, 0.21, 0.24, 0.22, 0.41, 0.60, 0.38, 0.35, 0.78, 0.54, 0.17, 0.26, 0.19, 0.27, 0.46, 0.62, 0.65, 0.63, 0.71, 0.82, 0.76, 0.67, 0.45,
0.25, 0.40, 0.74, 0.77, 1.00, 0.75, 0.31, 0.55, 0.83, 0.60, 0.49, 0.58, 0.59, 0.43, 0.29, 0.31, 0.29, 0.39, 0.50, 0.67, 0.82, 0.47, 0.45, 0.48,
0.61, 0.37, 0.23, 0.55, 0.60, 0.58, 0.26, 0.32, 0.24, 0.22, 0.24, 0.27, 0.26, 0.55, 0.63, 0.41, 0.44, 0.86, 0.53, 0.19, 0.45, 0.66, 0.68, 0.64,
0.64, 0.70, 0.82, 0.73, 0.76, 0.57, 0.42, 0.27, 0.42, 0.75, 0.78, 1.00, 0.75, 0.38, 0.42, 0.77, 0.87, 0.73, 0.56, 0.55, 0.59, 0.53, 0.41, 0.49,
0.53, 0.70, 0.85, 0.55, 0.40, 0.50, 0.64, 0.58, 0.24, 0.27, 0.55, 0.60, 0.58, 0.27, 0.33, 0.26, 0.23, 0.24, 0.26, 0.30, 0.35, 0.64, 0.64, 0.44,
0.56, 0.87, 0.58, 0.70, 0.68, 0.65, 0.68, 0.68, 0.79, 0.73, 0.82, 0.69, 0.49, 0.42, 0.28, 0.43, 0.75, 0.78, 1.00, 0.75, 0.44, 0.33, 0.70, 0.76,
0.95, 0.87, 0.69, 0.58, 0.58, 0.53, 0.52, 0.74, 0.84, 0.67, 0.38, 0.53, 0.64, 0.71, 0.35, 0.25, 0.26, 0.55, 0.61, 0.59, 0.28, 0.34, 0.27, 0.24,
0.25, 0.23, 0.31, 0.30, 0.47, 0.66, 0.67, 0.51, 0.61, 0.70, 0.62, 0.67, 0.68, 0.67, 0.75, 0.73, 0.84, 0.82, 0.51, 0.52, 0.41, 0.29, 0.44, 0.76,
0.78, 1.00, 0.75, 0.49, 0.29, 0.60, 0.76, 0.75, 0.95, 0.91, 0.81, 0.67, 0.59, 0.77, 0.81, 0.77, 0.43, 0.55, 0.65, 0.71, 0.49, 0.26, 0.27, 0.26,
0.56, 0.61, 0.59, 0.29, 0.35, 0.28, 0.25, 0.25, 0.23, 0.25, 0.35, 0.32, 0.58, 0.55, 0.33, 0.35, 0.71, 0.70, 0.63, 0.67, 0.70, 0.74, 0.84, 0.90,
0.57, 0.55, 0.50, 0.41, 0.30, 0.45, 0.76, 0.79, 1.00, 0.74, 0.53, 0.33, 0.47, 0.76, 0.73, 0.77, 0.93, 0.91, 0.78, 0.76, 0.75, 0.80, 0.56, 0.55,
0.67, 0.69, 0.59, 0.29, 0.29, 0.25, 0.27, 0.56, 0.62, 0.60, 0.30, 0.37, 0.30, 0.25, 0.25, 0.25, 0.22, 0.30, 0.37, 0.31, 0.26, 0.29, 0.29, 0.50,
0.75, 0.71, 0.62, 0.74, 0.87, 0.91, 0.69, 0.50, 0.58, 0.48, 0.42, 0.31, 0.46, 0.77, 0.79, 1.00, 0.75, 0.55, 0.37, 0.40, 0.69, 0.76, 0.71, 0.78,
0.81, 0.82, 0.86, 0.83, 0.67, 0.59, 0.67, 0.67, 0.66, 0.34, 0.31, 0.25, 0.25, 0.25, 0.56, 0.62, 0.61, 0.31, 0.38, 0.32, 0.28, 0.27, 0.26, 0.24,
0.23, 0.35, 0.36, 0.28, 0.31, 0.33, 0.33, 0.64, 0.72, 0.73, 0.73, 0.84, 0.83, 0.51, 0.56, 0.54, 0.48, 0.42, 0.31, 0.47, 0.77, 0.79, 0.99, 0.74,
0.56, 0.43, 0.38, 0.60, 0.75, 0.74, 0.71, 0.84, 0.87, 0.86, 0.85, 0.56, 0.56, 0.63, 0.69, 0.39, 0.33, 0.27, 0.24, 0.24, 0.25, 0.58, 0.62, 0.61,
0.31, 0.39, 0.33, 0.34, 0.29, 0.22, 0.27, 0.23, 0.26, 0.40, 0.33, 0.29, 0.33, 0.33, 0.40, 0.75, 0.80, 0.76, 0.73, 0.58, 0.52, 0.58, 0.50, 0.48,
0.40, 0.33, 0.49, 0.79, 0.81, 1.00, 0.75, 0.57, 0.46, 0.40, 0.51, 0.71, 0.72, 0.86, 0.89, 0.86, 0.91, 0.69, 0.53, 0.57, 0.59, 0.40, 0.33, 0.31,
0.22, 0.24, 0.21, 0.27, 0.61, 0.62, 0.62, 0.32, 0.40, 0.35, 0.33, 0.36, 0.12, 0.22, 0.27, 0.22, 0.31, 0.39, 0.29, 0.32, 0.36, 0.34, 0.54, 0.80,
0.79, 0.77, 0.68, 0.55, 0.57, 0.54, 0.73, 0.44, 0.36, 0.50, 0.71, 0.75, 0.92, 0.73, 0.60, 0.63, 0.70, 0.52, 0.65, 0.87, 0.89, 0.88, 0.89, 0.85,
0.55, 0.57, 0.61, 0.45, 0.31, 0.36, 0.22, 0.22, 0.22, 0.11, 0.34, 0.65, 0.62, 0.62, 0.33, 0.41, 0.38, 0.32, 0.42, 0.21, 0.09, 0.19, 0.26, 0.24,
0.35, 0.33, 0.27, 0.35, 0.37, 0.38, 0.66, 0.80, 0.78, 0.76, 0.67, 0.56, 0.49, 0.79, 0.51, 0.29, 0.27, 0.42, 0.45, 0.59, 0.43, 0.47, 0.75, 0.76,
0.44, 0.80, 0.88, 0.88, 0.89, 0.93, 0.69, 0.54, 0.62, 0.53, 0.29, 0.37, 0.25, 0.19, 0.20, 0.12, 0.09, 0.48, 0.65, 0.63, 0.63, 0.34, 0.43, 0.40,
0.33, 0.39, 0.32, 0.13, 0.09, 0.17, 0.24, 0.26, 0.35, 0.27, 0.29, 0.38, 0.37, 0.48, 0.73, 0.80, 0.76, 0.73, 0.62, 0.25, 0.25, 0.15, 0.07, 0.18,
0.44, 0.51, 0.63, 0.27, 0.08, 0.24, 0.28, 0.32, 0.84, 0.88, 0.90, 0.93, 0.86, 0.56, 0.60, 0.59, 0.33, 0.35, 0.31, 0.17, 0.18, 0.10, 0.09, 0.19,
0.57, 0.64, 0.63, 0.64, 0.34, 0.44, 0.42, 0.36, 0.35, 0.40, 0.18, 0.14, 0.09, 0.14, 0.22, 0.29, 0.31, 0.25, 0.34, 0.40, 0.40, 0.60, 0.74, 0.79,
0.73, 0.65, 0.21, 0.11, 0.06, 0.10, 0.14, 0.16, 0.35, 0.40, 0.11, 0.10, 0.06, 0.16, 0.41, 0.86, 0.89, 0.91, 0.95, 0.69, 0.57, 0.63, 0.42, 0.31,
0.35, 0.18, 0.16, 0.09, 0.09, 0.14, 0.29, 0.62, 0.63, 0.64, 0.64, 0.35, 0.45, 0.44, 0.39, 0.33, 0.44, 0.25, 0.18, 0.12, 0.10, 0.11, 0.19, 0.28,
0.27, 0.30, 0.37, 0.42, 0.47, 0.68, 0.73, 0.76, 0.69, 0.33, 0.10, 0.10, 0.03, 0.11, 0.16, 0.19, 0.20, 0.05, 0.09, 0.12, 0.18, 0.64, 0.89, 0.90,
0.95, 0.86, 0.57, 0.64, 0.51, 0.32, 0.34, 0.23, 0.14, 0.08, 0.07, 0.17, 0.16, 0.40, 0.65, 0.64, 0.65, 0.65, 0.36, 0.47, 0.47, 0.43, 0.34, 0.42,
0.32, 0.22, 0.16, 0.13, 0.10, 0.12, 0.19, 0.25, 0.28, 0.34, 0.40, 0.42, 0.59, 0.68, 0.72, 0.73, 0.52, 0.13, 0.10, 0.09, 0.05, 0.10, 0.20, 0.12,
0.11, 0.23, 0.24, 0.45, 0.84, 0.90, 0.92, 0.96, 0.68, 0.62, 0.57, 0.40, 0.32, 0.29, 0.13, 0.07, 0.06, 0.15, 0.22, 0.18, 0.50, 0.64, 0.64, 0.65,
0.65, 0.36, 0.48, 0.48, 0.45, 0.37, 0.38, 0.38, 0.25, 0.21, 0.14, 0.13, 0.11, 0.15, 0.18, 0.25, 0.32, 0.36, 0.41, 0.45, 0.67, 0.64, 0.71, 0.64,
0.34, 0.11, 0.11, 0.08, 0.05, 0.09, 0.11, 0.22, 0.27, 0.41, 0.76, 0.89, 0.91, 0.95, 0.85, 0.60, 0.62, 0.48, 0.35, 0.29, 0.16, 0.05, 0.07, 0.10,
0.26, 0.21, 0.25, 0.57, 0.64, 0.65, 0.65, 0.65, 0.37, 0.49, 0.49, 0.47, 0.41, 0.35, 0.39, 0.30, 0.26, 0.18, 0.14, 0.12, 0.12, 0.17, 0.18, 0.24,
0.36, 0.37, 0.41, 0.54, 0.68, 0.61, 0.69, 0.58, 0.29, 0.19, 0.39, 0.24, 0.11, 0.30, 0.60, 0.48, 0.65, 0.86, 0.92, 0.95, 0.96, 0.68, 0.64, 0.52,
0.45, 0.30, 0.36, 0.06, 0.08, 0.07, 0.22, 0.29, 0.19, 0.34, 0.61, 0.65, 0.66, 0.66, 0.66, 0.39, 0.50, 0.51, 0.49, 0.44, 0.36, 0.38, 0.34, 0.31,
0.26, 0.15, 0.14, 0.09, 0.13, 0.19, 0.20, 0.26, 0.37, 0.38, 0.42, 0.65, 0.65, 0.55, 0.40, 0.31, 0.57, 0.66, 0.47, 0.18, 0.51, 0.87, 0.89, 0.77,
0.72, 0.75, 0.86, 0.80, 0.65, 0.56, 0.53, 0.33, 0.53, 0.33, 0.04, 0.09, 0.12, 0.35, 0.25, 0.21, 0.42, 0.63, 0.65, 0.66, 0.66, 0.66, 0.40, 0.51,
0.52, 0.51, 0.46, 0.38, 0.36, 0.37, 0.36, 0.34, 0.21, 0.13, 0.13, 0.06, 0.15, 0.24, 0.21, 0.31, 0.36, 0.35, 0.40, 0.38, 0.25, 0.31, 0.60, 0.50,
0.61, 0.75, 0.56, 0.75, 0.65, 0.61, 0.78, 0.84, 0.78, 0.73, 0.69, 0.60, 0.55, 0.45, 0.49, 0.55, 0.07, 0.10, 0.08, 0.27, 0.36, 0.22, 0.25, 0.49,
0.64, 0.66, 0.67, 0.67, 0.66, 0.41, 0.52, 0.53, 0.53, 0.48, 0.40, 0.38, 0.31, 0.37, 0.41, 0.33, 0.15, 0.15, 0.09, 0.06, 0.18, 0.27, 0.24, 0.39,
0.37, 0.24, 0.27, 0.34, 0.45, 0.35, 0.32, 0.23, 0.22, 0.53, 0.47, 0.44, 0.46, 0.44, 0.50, 0.71, 0.86, 0.84, 0.45, 0.45, 0.53, 0.63, 0.12, 0.07,
0.10, 0.13, 0.41, 0.29, 0.24, 0.31, 0.55, 0.65, 0.67, 0.67, 0.67, 0.67, 0.43, 0.53, 0.55, 0.55, 0.49, 0.43, 0.40, 0.34, 0.28, 0.42, 0.45, 0.25,
0.13, 0.13, 0.06, 0.08, 0.25, 0.29, 0.38, 0.50, 0.27, 0.24, 0.26, 0.25, 0.36, 0.39, 0.18, 0.13, 0.29, 0.49, 0.47, 0.56, 0.52, 0.38, 0.29, 0.42,
0.64, 0.42, 0.40, 0.71, 0.22, 0.06, 0.11, 0.08, 0.29, 0.41, 0.25, 0.28, 0.26, 0.51, 0.67, 0.67, 0.68, 0.67, 0.67, 0.44, 0.55, 0.56, 0.56, 0.51,
0.45, 0.44, 0.40, 0.31, 0.25, 0.48, 0.43, 0.15, 0.14, 0.11, 0.07, 0.14, 0.32, 0.37, 0.34, 0.16, 0.18, 0.18, 0.13, 0.13, 0.18, 0.21, 0.24, 0.27,
0.31, 0.30, 0.25, 0.15, 0.18, 0.30, 0.24, 0.16, 0.33, 0.71, 0.36, 0.09, 0.14, 0.08, 0.13, 0.43, 0.32, 0.28, 0.25, 0.26, 0.56, 0.68, 0.67, 0.68,
0.68, 0.67, 0.45, 0.55, 0.57, 0.57, 0.53, 0.47, 0.46, 0.42, 0.38, 0.24, 0.28, 0.54, 0.31, 0.11, 0.14, 0.09, 0.09, 0.19, 0.29, 0.09, 0.11, 0.08,
0.05, 0.07, 0.12, 0.09, 0.13, 0.15, 0.15, 0.16, 0.13, 0.08, 0.11, 0.06, 0.05, 0.11, 0.15, 0.14, 0.38, 0.13, 0.20, 0.12, 0.07, 0.29, 0.43, 0.30,
0.26, 0.22, 0.43, 0.69, 0.66, 0.68, 0.69, 0.68, 0.68, 0.47, 0.56, 0.58, 0.58, 0.55, 0.49, 0.49, 0.43, 0.40, 0.35, 0.20, 0.33, 0.53, 0.17, 0.12,
0.11, 0.14, 0.24, 0.15, 0.11, 0.09, 0.18, 0.33, 0.41, 0.47, 0.62, 0.67, 0.54, 0.51, 0.55, 0.67, 0.75, 0.50, 0.42, 0.32, 0.17, 0.08, 0.16, 0.24,
0.31, 0.20, 0.08, 0.13, 0.44, 0.36, 0.27, 0.22, 0.30, 0.64, 0.69, 0.67, 0.68, 0.69, 0.69, 0.69, 0.49, 0.58, 0.59, 0.60, 0.56, 0.50, 0.51, 0.45,
0.38, 0.39, 0.32, 0.19, 0.41, 0.40, 0.09, 0.12, 0.19, 0.25, 0.11, 0.21, 0.24, 0.16, 0.26, 0.44, 0.60, 0.83, 0.89, 0.93, 0.93, 0.97, 0.94, 0.96,
0.68, 0.55, 0.36, 0.28, 0.39, 0.30, 0.22, 0.33, 0.16, 0.06, 0.30, 0.45, 0.28, 0.23, 0.24, 0.48, 0.70, 0.68, 0.67, 0.68, 0.69, 0.69, 0.69, 0.51,
0.58, 0.60, 0.61, 0.57, 0.51, 0.53, 0.48, 0.40, 0.36, 0.36, 0.31, 0.20, 0.41, 0.21, 0.09, 0.17, 0.12, 0.07, 0.10, 0.19, 0.20, 0.09, 0.08, 0.23,
0.40, 0.60, 0.65, 0.64, 0.67, 0.67, 0.62, 0.45, 0.23, 0.20, 0.35, 0.27, 0.15, 0.09, 0.20, 0.11, 0.13, 0.45, 0.33, 0.22, 0.23, 0.34, 0.61, 0.67,
0.69, 0.67, 0.68, 0.69, 0.70, 0.69, 0.52, 0.60, 0.62, 0.62, 0.59, 0.53, 0.55, 0.50, 0.42, 0.36, 0.35, 0.39, 0.33, 0.21, 0.30, 0.11, 0.11, 0.25,
0.17, 0.08, 0.12, 0.18, 0.18, 0.13, 0.13, 0.04, 0.16, 0.32, 0.33, 0.40, 0.31, 0.25, 0.24, 0.21, 0.22, 0.21, 0.17, 0.13, 0.25, 0.25, 0.05, 0.31,
0.41, 0.22, 0.24, 0.27, 0.52, 0.61, 0.67, 0.69, 0.67, 0.69, 0.69, 0.70, 0.69, 0.54, 0.61, 0.62, 0.63, 0.60, 0.53, 0.55, 0.51, 0.44, 0.36, 0.36,
0.34, 0.48, 0.34, 0.20, 0.16, 0.10, 0.14, 0.30, 0.24, 0.14, 0.15, 0.11, 0.09, 0.15, 0.15, 0.17, 0.29, 0.33, 0.38, 0.31, 0.28, 0.18, 0.13, 0.11,
0.16, 0.18, 0.28, 0.36, 0.10, 0.15, 0.40, 0.24, 0.21, 0.31, 0.50, 0.61, 0.59, 0.68, 0.69, 0.67, 0.69, 0.70, 0.70, 0.69, 0.55, 0.62, 0.64, 0.64,
0.60, 0.55, 0.56, 0.52, 0.44, 0.38, 0.38, 0.27, 0.24, 0.50, 0.37, 0.13, 0.12, 0.10, 0.15, 0.30, 0.27, 0.23, 0.11, 0.06, 0.04, 0.07, 0.10, 0.11,
0.13, 0.14, 0.14, 0.09, 0.07, 0.08, 0.12, 0.21, 0.35, 0.41, 0.18, 0.08, 0.27, 0.25, 0.18, 0.37, 0.54, 0.63, 0.60, 0.59, 0.68, 0.69, 0.67, 0.69,
0.70, 0.70, 0.69, 0.57, 0.63, 0.64, 0.64, 0.61, 0.55, 0.57, 0.53, 0.45, 0.39, 0.40, 0.30, 0.17, 0.22, 0.46, 0.42, 0.12, 0.11, 0.11, 0.18, 0.28,
0.29, 0.22, 0.13, 0.09, 0.04, 0.03, 0.03, 0.04, 0.04, 0.05, 0.07, 0.09, 0.17, 0.26, 0.35, 0.42, 0.27, 0.09, 0.16, 0.21, 0.20, 0.40, 0.46, 0.63,
0.65, 0.60, 0.60, 0.69, 0.70, 0.67, 0.69, 0.70, 0.70, 0.69, 0.58, 0.63, 0.65, 0.65, 0.62, 0.56, 0.58, 0.54, 0.46, 0.39, 0.42, 0.32, 0.19, 0.22,
0.07, 0.36, 0.47, 0.15, 0.07, 0.11, 0.21, 0.27, 0.27, 0.13, 0.25, 0.47, 0.47, 0.51, 0.53, 0.57, 0.60, 0.61, 0.61, 0.35, 0.30, 0.40, 0.35, 0.12,
0.13, 0.13, 0.23, 0.44, 0.21, 0.24, 0.69, 0.65, 0.60, 0.60, 0.69, 0.69, 0.67, 0.69, 0.70, 0.70, 0.70, 0.59, 0.64, 0.65, 0.65, 0.62, 0.56, 0.59,
0.55, 0.47, 0.40, 0.44, 0.34, 0.20, 0.24, 0.09, 0.02, 0.25, 0.51, 0.23, 0.05, 0.11, 0.22, 0.29, 0.18, 0.40, 0.62, 0.69, 0.76, 0.84, 0.87, 0.84,
0.82, 0.84, 0.58, 0.34, 0.40, 0.17, 0.12, 0.12, 0.28, 0.39, 0.15, 0.02, 0.27, 0.69, 0.65, 0.60, 0.60, 0.69, 0.70, 0.67, 0.69, 0.70, 0.70, 0.70,
0.60, 0.64, 0.65, 0.66, 0.63, 0.56, 0.59, 0.55, 0.47, 0.41, 0.45, 0.35, 0.21, 0.25, 0.10, 0.07, 0.02, 0.13, 0.47, 0.34, 0.07, 0.09, 0.25, 0.28,
0.44, 0.67, 0.77, 0.83, 0.88, 0.90, 0.90, 0.87, 0.83, 0.67, 0.42, 0.24, 0.11, 0.15, 0.34, 0.31, 0.06, 0.05, 0.05, 0.29, 0.71, 0.66, 0.61, 0.60,
0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.61, 0.65, 0.66, 0.66, 0.63, 0.58, 0.59, 0.56, 0.48, 0.41, 0.45, 0.36, 0.22, 0.26, 0.10, 0.06, 0.07,
0.03, 0.05, 0.36, 0.44, 0.13, 0.07, 0.27, 0.49, 0.71, 0.75, 0.81, 0.86, 0.88, 0.88, 0.86, 0.82, 0.66, 0.29, 0.11, 0.20, 0.36, 0.21, 0.03, 0.05,
0.09, 0.05, 0.29, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.62, 0.64, 0.67, 0.67, 0.63, 0.58, 0.60, 0.56, 0.49, 0.42,
0.46, 0.36, 0.22, 0.26, 0.10, 0.06, 0.07, 0.06, 0.05, 0.01, 0.22, 0.47, 0.22, 0.08, 0.43, 0.47, 0.46, 0.50, 0.53, 0.54, 0.54, 0.53, 0.55, 0.44,
0.12, 0.27, 0.33, 0.11, 0.03, 0.07, 0.07, 0.09, 0.06, 0.30, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.62, 0.65, 0.67,
0.67, 0.64, 0.58, 0.60, 0.56, 0.49, 0.42, 0.46, 0.37, 0.23, 0.27, 0.11, 0.07, 0.07, 0.07, 0.06, 0.06, 0.01, 0.09, 0.38, 0.31, 0.18, 0.20, 0.21,
0.22, 0.24, 0.25, 0.26, 0.25, 0.26, 0.25, 0.31, 0.25, 0.04, 0.04, 0.08, 0.07, 0.08, 0.11, 0.07, 0.31, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.67,
0.69, 0.71, 0.71, 0.70, 0.63, 0.65, 0.67, 0.67, 0.64, 0.59, 0.61, 0.57, 0.50, 0.43, 0.47, 0.38, 0.23, 0.28, 0.14, 0.07, 0.08, 0.07, 0.07, 0.05,
0.06, 0.03, 0.02, 0.23, 0.16, 0.13, 0.16, 0.16, 0.18, 0.19, 0.20, 0.21, 0.20, 0.24, 0.15, 0.02, 0.06, 0.08, 0.09, 0.09, 0.09, 0.11, 0.08, 0.31,
0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.71, 0.71, 0.71, 0.64, 0.66, 0.67, 0.67, 0.64, 0.59, 0.61, 0.57, 0.50, 0.43, 0.47, 0.38, 0.24,
0.29, 0.16, 0.07, 0.08, 0.07, 0.07, 0.06, 0.05, 0.05, 0.05, 0.02, 0.05, 0.07, 0.07, 0.09, 0.09, 0.09, 0.09, 0.07, 0.06, 0.03, 0.02, 0.05, 0.07,
0.09, 0.11, 0.10, 0.09, 0.12, 0.08, 0.31, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.71, 0.65, 0.66, 0.67, 0.67, 0.64, 0.59,
0.62, 0.58, 0.50, 0.43, 0.48, 0.38, 0.24, 0.29, 0.18, 0.07, 0.08, 0.07, 0.07, 0.07, 0.06, 0.05, 0.05, 0.05, 0.04, 0.04, 0.03, 0.02, 0.02, 0.02,
0.03, 0.03, 0.04, 0.04, 0.04, 0.05, 0.09, 0.10, 0.12, 0.11, 0.10, 0.13, 0.09, 0.32, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.70,
0.70, 0.65, 0.67, 0.67, 0.67, 0.64, 0.59, 0.62, 0.58, 0.51, 0.44, 0.48, 0.39, 0.24, 0.29, 0.20, 0.09, 0.08, 0.08, 0.07, 0.07, 0.07, 0.06, 0.06,
0.05, 0.05, 0.05, 0.05, 0.04, 0.04, 0.05, 0.04, 0.05, 0.05, 0.04, 0.04, 0.05, 0.10, 0.11, 0.14, 0.13, 0.11, 0.13, 0.10, 0.32, 0.71, 0.67, 0.61,
0.60, 0.69, 0.70, 0.68, 0.69, 0.71, 0.71, 0.70, 0.65, 0.67, 0.68, 0.68, 0.65, 0.60, 0.62, 0.58, 0.51, 0.44, 0.48, 0.39, 0.25, 0.29, 0.22, 0.11,
0.08, 0.08, 0.08, 0.07, 0.07, 0.07, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.06, 0.12, 0.13, 0.16, 0.13,
0.11, 0.15, 0.11, 0.33, 0.72, 0.67, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.65, 0.67, 0.68, 0.68, 0.65, 0.60, 0.62, 0.58, 0.52,
0.44, 0.49, 0.40, 0.25, 0.29, 0.22, 0.13, 0.08, 0.08, 0.08, 0.08, 0.08, 0.07, 0.07, 0.07, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.05, 0.06, 0.05,
0.05, 0.05, 0.07, 0.13, 0.15, 0.18, 0.15, 0.12, 0.15, 0.12, 0.33, 0.72, 0.67, 0.62, 0.61, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.65, 0.67,
0.68, 0.68, 0.65, 0.60, 0.62, 0.59, 0.52, 0.45, 0.49, 0.40, 0.25, 0.29, 0.22, 0.15, 0.08, 0.09, 0.09, 0.08, 0.08, 0.07, 0.07, 0.07, 0.07, 0.07,
0.06, 0.06, 0.06, 0.06, 0.06, 0.07, 0.06, 0.06, 0.06, 0.08, 0.15, 0.17, 0.22, 0.17, 0.13, 0.16, 0.12, 0.34, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70,
0.68, 0.69, 0.70, 0.71, 0.70, 0.66, 0.67, 0.69, 0.68, 0.65, 0.61, 0.62, 0.59, 0.52, 0.45, 0.49, 0.41, 0.26, 0.29, 0.22, 0.18, 0.09, 0.09, 0.09,
0.09, 0.09, 0.08, 0.08, 0.08, 0.08, 0.07, 0.07, 0.06, 0.06, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.09, 0.18, 0.20, 0.24, 0.18, 0.13, 0.17, 0.13,
0.34, 0.71, 0.66, 0.62, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.66, 0.67, 0.68, 0.68, 0.65, 0.61, 0.63, 0.60, 0.53, 0.45, 0.49, 0.41,
0.27, 0.29, 0.23, 0.19, 0.11, 0.09, 0.09, 0.09, 0.09, 0.08, 0.09, 0.09, 0.08, 0.08, 0.07, 0.07, 0.07, 0.07, 0.08, 0.08, 0.07, 0.07, 0.08, 0.10,
0.20, 0.24, 0.26, 0.20, 0.14, 0.18, 0.13, 0.35, 0.71, 0.67, 0.62, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.70, 0.70, 0.66, 0.67, 0.68, 0.69, 0.66,
0.61, 0.63, 0.60, 0.53, 0.46, 0.50, 0.41, 0.27, 0.29, 0.23, 0.20, 0.12, 0.09, 0.10, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.08, 0.08, 0.08,
0.08, 0.09, 0.09, 0.08, 0.09, 0.09, 0.11, 0.23, 0.26, 0.29, 0.21, 0.15, 0.18, 0.14, 0.35, 0.71, 0.67, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70,
0.71, 0.71, 0.66, 0.67, 0.68, 0.69, 0.66, 0.61, 0.63, 0.60, 0.53, 0.47, 0.51, 0.42, 0.28, 0.30, 0.23, 0.20, 0.14, 0.09, 0.10, 0.09, 0.10, 0.09,
0.09, 0.10, 0.10, 0.10, 0.09, 0.08, 0.09, 0.09, 0.09, 0.10, 0.09, 0.09, 0.09, 0.12, 0.25, 0.28, 0.31, 0.23, 0.15, 0.18, 0.15, 0.35, 0.71, 0.66,
0.62, 0.61, 0.69, 0.70, 0.69, 0.69, 0.70, 0.71, 0.70, 0.67, 0.67, 0.69, 0.69, 0.66, 0.61, 0.64, 0.60, 0.53, 0.47, 0.51, 0.42, 0.29, 0.30, 0.23,
0.20, 0.15, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.11, 0.11, 0.11, 0.10, 0.09, 0.09, 0.10, 0.10, 0.11, 0.09, 0.10, 0.10, 0.14, 0.28, 0.31, 0.34,
0.24, 0.16, 0.20, 0.15, 0.35, 0.71, 0.66, 0.61, 0.61, 0.69, 0.70, 0.68, 0.69, 0.70, 0.70, 0.70, 0.67, 0.68, 0.69, 0.69, 0.66, 0.62, 0.64, 0.60,
0.54, 0.47, 0.51, 0.42, 0.29, 0.31, 0.23, 0.20, 0.16, 0.10, 0.11, 0.11, 0.11, 0.10, 0.11, 0.11, 0.11, 0.11, 0.11, 0.10, 0.10, 0.10, 0.11, 0.12,
0.10, 0.11, 0.11, 0.16, 0.31, 0.33, 0.36, 0.25, 0.16, 0.20, 0.16, 0.36, 0.71, 0.67, 0.62, 0.61, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.68,
0.68, 0.69, 0.69, 0.67, 0.62, 0.64, 0.60, 0.54, 0.47, 0.51, 0.43, 0.29, 0.31, 0.24, 0.20, 0.17, 0.12, 0.11, 0.11, 0.11, 0.11, 0.11, 0.12, 0.12,
0.12, 0.11, 0.10, 0.11, 0.11, 0.12, 0.13, 0.11, 0.12, 0.12, 0.18, 0.32, 0.35, 0.38, 0.26, 0.17, 0.21, 0.16, 0.36, 0.71, 0.67, 0.62, 0.61, 0.69,
0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.68, 0.69, 0.69, 0.69, 0.66, 0.63, 0.65, 0.61, 0.54, 0.48, 0.51, 0.43, 0.29, 0.31, 0.24, 0.21, 0.18, 0.13,
0.11, 0.12, 0.12, 0.11, 0.12, 0.13, 0.13, 0.13, 0.12, 0.11, 0.11, 0.12, 0.12, 0.13, 0.11, 0.13, 0.13, 0.19, 0.35, 0.36, 0.40, 0.27, 0.18, 0.21,
0.17, 0.36, 0.71, 0.67, 0.62, 0.62, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.69, 0.69, 0.69, 0.69, 0.67, 0.63, 0.64, 0.61, 0.55, 0.49, 0.52,
0.43, 0.30, 0.32, 0.25, 0.22, 0.18, 0.14, 0.12, 0.12, 0.12, 0.12, 0.12, 0.13, 0.13, 0.13, 0.13, 0.12, 0.12, 0.13, 0.13, 0.14, 0.12, 0.13, 0.14,
0.20, 0.36, 0.38, 0.41, 0.28, 0.18, 0.22, 0.18, 0.37, 0.71, 0.67, 0.62, 0.61, 0.69, 0.70, 0.68, 0.69, 0.71, 0.71, 0.70, 0.69, 0.69, 0.69, 0.69,
0.67, 0.63, 0.65, 0.61, 0.56, 0.49, 0.53, 0.44, 0.31, 0.32, 0.25, 0.22, 0.18, 0.15, 0.13, 0.13, 0.13, 0.12, 0.13, 0.14, 0.14, 0.14, 0.13, 0.12,
0.13, 0.13, 0.14, 0.15, 0.13, 0.14, 0.16, 0.20, 0.38, 0.40, 0.43, 0.29, 0.18, 0.22, 0.18, 0.37, 0.71, 0.67, 0.62, 0.61, 0.69, 0.70, 0.69, 0.69,
0.71, 0.71, 0.70, 0.69, 0.69, 0.69, 0.69, 0.67, 0.63, 0.65, 0.61, 0.56, 0.50, 0.53, 0.44, 0.31, 0.32, 0.25, 0.22, 0.18, 0.16, 0.13, 0.13, 0.13,
0.12, 0.13, 0.15, 0.15, 0.15, 0.14, 0.13, 0.13, 0.14, 0.15, 0.15, 0.13, 0.15, 0.17, 0.22, 0.40, 0.42, 0.44, 0.29, 0.19, 0.23, 0.18, 0.38, 0.71,
0.67, 0.62, 0.61, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.69, 0.69, 0.69, 0.69, 0.67, 0.64, 0.65, 0.62, 0.56, 0.50, 0.54, 0.44, 0.32, 0.33,
0.25, 0.22, 0.19, 0.17, 0.14, 0.13, 0.14, 0.13, 0.14, 0.15, 0.15, 0.15, 0.14, 0.13, 0.14, 0.15, 0.16, 0.16, 0.14, 0.16, 0.18, 0.23, 0.42, 0.43,
0.45, 0.30, 0.20, 0.23, 0.19, 0.38, 0.72, 0.67, 0.62, 0.61, 0.69, 0.70, 0.68, 0.69, 0.70, 0.70, 0.70, 0.69, 0.70, 0.70, 0.70, 0.68, 0.64, 0.66,
0.63, 0.57, 0.51, 0.55, 0.45, 0.33, 0.33, 0.25, 0.23, 0.19, 0.17, 0.15, 0.14, 0.15, 0.14, 0.15, 0.16, 0.16, 0.16, 0.15, 0.14, 0.15, 0.16, 0.16,
0.16, 0.15, 0.17, 0.19, 0.24, 0.43, 0.44, 0.47, 0.31, 0.20, 0.23, 0.19, 0.39, 0.73, 0.67, 0.62, 0.62, 0.70, 0.70, 0.69, 0.70, 0.71, 0.71, 0.71
];
// Simple deterministic RNG
function Rng(seed){ let s = seed|0; return function(){ s|=0; s = (s + 0x7ed55d16 + (s<<12))|0; s = (s ^ 0xc761c23c ^ (s>>>19))|0; s = (s + 0x165667b1 + (s<<5))|0; s = (s + 0xd3a2646c ^ (s<<9))|0; s = (s + 0xfd7046c5 + (s<<3))|0; s = (s ^ 0xb55a4f09 ^ (s>>>16))|0; return (s>>>0)/4294967296; }; }
const rnd = Rng(seed);
// -------- Transforms --------
function Barrel(b, cx, cy) { return p => { let x=p[0]-cx, y=p[1]-cy; let r2=(x*x+y*y)/1e4; let s=1+b*r2; return [cx+x*s, cy+y*s]; }; }
function Swirl(k, rad, cx, cy) { return p => { let x=p[0]-cx, y=p[1]-cy; let r=Math.hypot(x,y); let a=k*Math.max(0,1-r/rad); let c=Math.cos(a), s=Math.sin(a); return [cx+x*c-y*s, cy+x*s+y*c]; }; }
// Compose transforms
const CX = (barrelOffsetX), CY = (barrelOffsetY);
const T1 = Barrel(barrel, CX, CY);
const T2 = Swirl(swirl, swirlRadius, 0, 0);
function applyT(p) { return T2(T1(p)); }
// -------- Image sampler --------
function sampleImg(x, y) {
// x,y in [-100,100] square. Fit portrait IMG into square with vertical letterbox-free fit
let sx = x * imgExpand;
let sy = y * imgExpand;
// Map to IMG coords (keep portrait aspect by using height as reference)
let u = (sx + 100) / 200; // 0..1
let v = (sy + 100) / 200; // 0..1
// Because IMG is portrait, we scale u to match IMG aspect (IMG_W/IMG_H)
let ar = IMG_W / IMG_H;
u = 0.5 + (u - 0.5) * ar; // squeeze/expand horizontally
// Clamp
if (u < 0 || u > 1 || v < 0 || v > 1) return 1.0; // outside: treat as white
let ix = Math.min(IMG_W-1, Math.max(0, (u * (IMG_W-1))|0));
let iy = Math.min(IMG_H-1, Math.max(0, (v * (IMG_H-1))|0));
let L = IMG[iy*IMG_W + ix];
if (imgInvert) L = 1.0 - L;
// Contrast & gamma
L = Math.pow(Math.max(0, Math.min(1, (L-0.5)*imgContrast + 0.5)), imgGamma);
return L;
}
// -------- Drawing helpers --------
function lerp(a,b,t){return a+(b-a)*t;}
function mix(a,b,t){return a+(b-a)*t;}
function drawSegment(p0, p1, bend) {
if (type===0 || bend<=0) {
turtle.jump(p0[0], p0[1]); turtle.goto(p1[0], p1[1]); return;
}
const m = [(p0[0]+p1[0])/2, (p0[1]+p1[1])/2];
const n = [p1[1]-p0[1], -(p1[0]-p0[0])];
const ctrl = [m[0] + n[0]*bend, m[1] + n[1]*bend];
// Render quadratic Bezier with short segments
const steps = 8;
let prev = p0;
for (let i=1;i<=steps;i++) {
const t = i/steps;
const a = [(1-t)*p0[0]+t*ctrl[0], (1-t)*p0[1]+t*ctrl[1]];
const b = [(1-t)*ctrl[0]+t*p1[0], (1-t)*ctrl[1]+t*p1[1]];
const q = [(1-t)*a[0]+t*b[0], (1-t)*a[1]+t*b[1]];
turtle.jump(prev[0], prev[1]); turtle.goto(q[0], q[1]);
prev = q;
}
}
// -------- Main walk --------
function walk(i) {
const r = (i / cols)|0;
const c = i % cols;
if (r >= rows) return false;
// Cell corners before transforms
const x0 = left + padding + c*CELL_W;
const y0 = top + padding + r*CELL_H;
const x1 = x0 + CELL_W;
const y1 = y0 + CELL_H;
const cx = (x0+x1)/2, cy = (y0+y1)/2;
// Sample image using transformed cell center (so the mapping follows transforms)
const [sx, sy] = applyT([cx, cy]);
const L = sampleImg(sx, sy); // 0..1
const darkness = Math.max(0, 1.0 - L);
const n = Math.max(subMin|0, Math.min(subLines|0, (subMin + (subLines-subMin)*Math.pow(darkness+bias, 1.0))|0));
// Draw n hatch lines inside the cell; orientation varies by checkerboard for texture
const horiz = ((r + c) & 1) === 0;
for (let k=0; k<n; k++) {
const t = (k+1)/(n+1);
let pA, pB;
if (horiz) {
const y = mix(y0, y1, t);
pA = [x0, y]; pB = [x1, y];
} else {
const x = mix(x0, x1, t);
pA = [x, y0]; pB = [x, y1];
}
// Jitter
const j = (rnd()*2-1)*jitter*CELL_W;
if (horiz) { pA[1]+=j; pB[1]+=j; } else { pA[0]+=j; pB[0]+=j; }
// Transform
pA = applyT(pA); pB = applyT(pB);
// Bend based on image darkness (more bend in darker regions)
const bend = (type===2 ? (darkness-0.5)*2 : 1) * displace * 0.02; // scale down
drawSegment(pA, pB, bend);
}
return true;
}