A tortoise (see: Transforms) with a 'path transform' is used to draw houses, bicycles, and geese.
#tortoise #path
Log in to post a comment.
// A tortoise, a goose & a bicycle. Created by Reinder Nijhoff 2019 // @reindernijhoff // // https://turtletoy.net/turtle/d93671dfa0 // const pathInput = `M57,61C-72,51 -23,-84 36,-67`; // type=path, Click here to redraw the path const path = Path(pathInput); function Translate(x,y) { return p => [p[0]+x, p[1]+y]; } function Scale(s) { return p => [p[0]*s, p[1]*s]; } function Circle(r) { return p => { let ry = r - p[1]; a = p[0]/r; return [ry*Math.cos(a), ry*Math.sin(a)]; } } function PathTransform(path) { return p => { const l = path.length(); if (p[0] > l) return path.p(1); const x = p[0] / l; const y = p[1]; const t = path.p(x); const n = [-t[3], t[2]]; const nl = Math.hypot(...n); return [t[0] - y * t[3] / nl, t[1] + y * t[2] / nl]; } } const scale = 0.5; const numHouses = 400; const turtle = new Tortoise(); turtle.addTransform(PathTransform(path)); for (let i=0; i<1000; i++) { turtle.forward(numHouses*25 / 1000); turtle.forward(numHouses*25 / 1000); } function walk(i) { if (Math.random() > .67) { const h = new Tortoise(); h.addTransform(Scale(.3)); h.addTransform(Translate(i * 20 + 10, 0)); h.addTransform(PathTransform(path)); drawHouse(h); } else if (Math.random() > .5) { const h = new Tortoise(); h.addTransform(Scale(.18)); h.addTransform(Translate(i * 20 + 10, 0)); h.addTransform(PathTransform(path)); drawBicycle(h, 0, 0) } else { const h = new Tortoise(); h.addTransform(Scale(.15)); h.addTransform(Translate(i * 20 + 10, -3.5)); h.addTransform(PathTransform(path)); goose(h); } return i < numHouses - 1; } // House function drawHouse(t) { square(t, [-10,-20], [30,0]); square(t, [-5,-15], [2,-8]); square(t, [7,0], [14,-15]); square(t, [19,-15], [25,-8]); square(t, [-25,-15], [-15,-8]); for (let i=-20; i<=20; i+=4) { t.jmp(i,-30); t.goto(i+10,-20); } t.jmp(-20,-30); t.goto(20,-30); t.jmp(-20,-30); t.goto(-30,-20); t.jmp(-30,-20); t.goto(-30,0); t.jmp(-30,0); t.goto(-10,0); } function square(t, lt, rb) { t.jmp(lt); t.goto(lt[0], rb[1]); t.goto(rb), t.goto(rb[0], lt[1]); t.goto(lt); } function drawBicycle(t, x, y) { t = t.addTransform(Translate(x, y)); t.jmp(-15,-20); t.circle(10); t.jmp( 15,-20); t.circle(10); t.jmp(-15, -10); t.goto(0, -10); t.goto(10, -25); t.goto(-5, -25); t.goto(-15, -10); t.jmp( 0, -10); t.goto(-6, -28); t.goto(-8, -28); t.goto(-2, -28); t.jmp( 15, -10); t.goto( 9, -28); t.goto( 14, -28); t.circle(2, 180); } //////////////////////////////////////////////////////////////// // Path utility code. Created by Reinder Nijhoff 2023 // Parses a single SVG path (only M, C and L statements are // supported). The p-method will return // [...position, ...derivative] for a normalized point t. // // https://turtletoy.net/turtle/46adb0ad70 //////////////////////////////////////////////////////////////// function Path(svg) { class MoveTo { constructor(p) { this.p0 = p; } p(t, s) { return [...this.p0, 1, 0]; } length() { return 0; } } class LineTo { constructor(p0, p1) { this.p0 = p0, this.p1 = p1; } p(t, s = 1) { const nt = 1 - t, p0 = this.p0, p1 = this.p1; return [ nt*p0[0] + t*p1[0], nt*p0[1] + t*p1[1], (p1[0] - p0[0]) * s, (p1[1] - p0[1]) * s, ]; } length() { const p0 = this.p0, p1 = this.p1; return Math.hypot(p0[0]-p1[0], p0[1]-p1[1]); } } class BezierTo { constructor(p0, c0, c1, p1) { this.p0 = p0, this.c0 = c0, this.c1 = c1, this.p1 = p1; } p(t, s = 1) { const nt = 1 - t, p0 = this.p0, c0 = this.c0, c1 = this.c1, p1 = this.p1; return [ nt*nt*nt*p0[0] + 3*t*nt*nt*c0[0] + 3*t*t*nt*c1[0] + t*t*t*p1[0], nt*nt*nt*p0[1] + 3*t*nt*nt*c0[1] + 3*t*t*nt*c1[1] + t*t*t*p1[1], (3*nt*nt*(c0[0]-p0[0]) + 6*t*nt*(c1[0]-c0[0]) + 3*t*t*(p1[0]-c1[0])) * s, (3*nt*nt*(c0[1]-p0[1]) + 6*t*nt*(c1[1]-c0[1]) + 3*t*t*(p1[1]-c1[1])) * s, ]; } length() { return this._length || ( this._length = Array.from({length:25}, (x, i) => this.p(i/25)).reduce( (a,c,i,v) => i > 0 ? a + Math.hypot(c[0]-v[i-1][0], c[1]-v[i-1][1]) : a, 0)); } } class Path { constructor(svg) { this.segments = []; this.parsePath(svg); } parsePath(svg) { const t = svg.match(/([0-9.-]+|[MLC])/g); for (let s, i=0; i<t.length;) { switch (t[i++]) { case 'M': this.add(new MoveTo(s=[t[i++],t[i++]])); break; case 'L': this.add(new LineTo(s, s=[t[i++],t[i++]])); break; case 'C': this.add(new BezierTo(s, [t[i++],t[i++]], [t[i++],t[i++]], s=[t[i++],t[i++]])); break; default: i++; } } } add(segment) { this.segments.push(segment); this._length = 0; } length() { return this._length || (this._length = this.segments.reduce((a,c) => a + c.length(), 0)); } p(t) { t = Math.max(Math.min(t, 1), 0) * this.length(); for (let l=0, i=0, sl=0; i<this.segments.length; i++, l+=sl) { sl = this.segments[i].length(); if (t > l && t <= l + sl) { return this.segments[i].p((t-l)/sl, sl/this.length()); } } return this.segments[Math.min(1, this.segments.length-1)].p(0); } } return new Path(svg); } //////////////////////////////////////////////////////////////// // Tortoise utility code. Created by Reinder Nijhoff 2019 // https://turtletoy.net/turtle/102cbd7c4d //////////////////////////////////////////////////////////////// function Tortoise(x, y) { class Tortoise extends Turtle { constructor(x, y) { super(x, y); this.ps = Array.isArray(x) ? [...x] : [x || 0, y || 0]; this.transforms = []; } addTransform(t) { this.transforms.push(t); this.jump(this.ps); return this; } applyTransforms(p) { if (!this.transforms) return p; let pt = [...p]; this.transforms.map(t => { pt = t(pt); }); return pt; } goto(x, y, rec = 0) { const p = Array.isArray(x) ? [...x] : [x, y]; if (rec > 5) return p; const pt = this.applyTransforms(p); if (this.isdown() && (this.pt[0]-pt[0])**2 + (this.pt[1]-pt[1])**2 > 8) { this.goto((this.ps[0]+p[0])/2, (this.ps[1]+p[1])/2, rec+1); this.goto(p[0], p[1], rec+1); } else { super.goto(pt); this.ps = p; this.pt = pt; } } position() { return this.ps; } } return new Tortoise(x,y); } // Goose by imakerobots: https://turtletoy.net/turtle/a6b25da0df // const a=[-128.964, -86.085, -129.279, -87.079, -129.776, -88.158, -130.277, -89.07, -130.848, -90.015, -131.467, -90.985, -132.115, -91.968, -132.769, -92.957]; const b = [ -128.964, -86.085, -128.823, -85.093, -128.771, -83.98, -128.776, -82.857, -128.815, -81.799, -128.881, -80.682, -128.973, -79.519, -129.085, -78.324, -129.191, -77.316, -129.308, -76.306, -129.357, -75.903, -129.484, -74.907, -129.642, -73.738, -129.804, -72.614, -129.965, -71.551, -130.148, -70.408, -130.32, -69.393, -130.515, -68.316, -130.717, -67.331, -130.728, -67.288, -130.96, -66.233, -131.184, -65.188, -131.406, -64.196, -131.667, -63.085, -131.923, -62.053, -132.21, -60.964, -132.529, -59.831, -132.819, -58.865, -133.199, -57.685, -133.612, -56.51, -134.056, -55.354, -134.533, -54.231, -135.042, -53.154, -135.585, -52.138, -136.161, -51.197, -136.771, -50.345, -137.638, -49.371, -138.095, -48.962, -139.039, -48.221, -139.979, -47.547, -140.944, -46.911, -141.965, -46.288, -143.073, -45.65, -143.978, -45.147, -144.963, -44.608, -146.039, -44.024, -146.42, -43.817, -147.636, -43.156, -148.97, -42.423, -149.932, -41.889, -150.956, -41.316, -152.045, -40.699, -153.205, -40.036, -154.437, -39.323, -155.747, -38.557, -157.137, -37.734, -158.611, -36.852, -160.174, -35.906, -161.829, -34.893, -162.692, -34.361, -163.579, -33.811, -164.491, -33.243, -165.428, -32.655, -166.363, -32.061, -167.262, -31.473, -168.124, -30.894, -168.952, -30.322, -170.506, -29.201, -171.929, -28.109, -173.229, -27.047, -174.413, -26.014, -175.486, -25.01, -176.456, -24.033, -177.33, -23.084, -178.113, -22.162, -178.812, -21.267, -179.434, -20.398, -179.987, -19.554, -180.698, -18.337, -180.907, -17.943, -181.477, -16.771, -181.944, -15.681, -182.332, -14.667, -182.666, -13.724, -183.07, -12.563, -183.483, -11.502, -183.963, -10.524, -184.57, -9.617, -184.939, -9.185, -185.76, -8.308, -186.565, -7.463, -187.353, -6.649, -188.124, -5.862, -188.879, -5.101, -189.617, -4.364, -190.338, -3.648, -191.389, -2.61, -192.402, -1.608, -193.378, -0.635, -194.316, 0.316, -195.217, 1.253, -195.509, 1.564, -196.295, 2.424, -197.011, 3.253, -197.651, 4.051, -198.291, 4.944, -198.672, 5.557, -199.143, 6.507, -199.449, 7.546, -199.473, 8.548, -199.383, 8.981, -198.942, 9.902, -198.226, 10.725, -197.424, 11.368, -196.504, 11.944, -195.474, 12.471, -194.528, 12.885, -193.542, 13.263, -192.536, 13.608, -191.695, 13.87, -190.575, 14.188, -189.493, 14.466, -188.474, 14.705, -187.33, 14.949, -186.211, 15.165, -185.367, 15.31, -185.367, 15.31, -182.808, 21.282, -182.3, 22.26, -181.619, 23.26, -180.788, 24.274, -179.828, 25.292, -178.762, 26.307, -178.003, 26.979, -177.213, 27.643, -176.4, 28.298, -175.568, 28.941, -174.726, 29.57, -173.88, 30.182, -173.036, 30.774, -172.617, 31.063, -171.78, 31.629, -170.555, 32.433, -169.386, 33.177, -168.294, 33.854, -167.3, 34.454, -166.425, 34.971, -165.481, 35.516, -164.584, 36.018, -164.535, 36.045, -163.307, 36.748, -162.391, 37.26, -161.246, 37.891, -159.884, 38.628, -158.319, 39.459, -156.567, 40.371, -155.624, 40.853, -154.64, 41.352, -153.616, 41.864, -152.553, 42.389, -151.453, 42.925, -150.319, 43.471, -149.152, 44.024, -147.953, 44.584, -146.725, 45.149, -145.469, 45.717, -144.186, 46.287, -142.879, 46.857, -141.55, 47.426, -140.2, 47.992, -138.833, 48.553, -137.448, 49.107, -136.047, 49.655, -134.631, 50.194, -133.203, 50.722, -131.763, 51.239, -130.313, 51.742, -128.856, 52.23, -127.394, 52.701, -125.927, 53.154, -124.457, 53.588, -122.987, 54, -121.519, 54.389, -120.053, 54.753, -118.592, 55.092, -117.138, 55.402, -115.691, 55.684, -114.255, 55.934, -112.831, 56.153, -111.42, 56.337, -110.024, 56.485, -108.646, 56.597, -107.286, 56.67, -105.947, 56.702, -104.63, 56.692, -103.338, 56.639, -102.071, 56.541, -100.832, 56.396, -99.623, 56.204, -98.445, 55.961, -96.219, 55.447, -94.132, 54.964, -92.178, 54.511, -90.351, 54.087, -88.646, 53.691, -87.057, 53.322, -85.578, 52.977, -84.204, 52.657, -82.928, 52.36, -81.745, 52.085, -80.65, 51.83, -79.637, 51.595, -77.832, 51.178, -76.287, 50.824, -74.954, 50.525, -73.79, 50.271, -72.747, 50.052, -71.312, 49.77, -69.896, 49.514, -68.887, 49.343, -68.887, 49.343, -68.423, 48.427, -67.358, 48.186, -66.297, 47.891, -65.252, 47.552, -64.233, 47.181, -63.253, 46.789, -62.321, 46.387, -61.038, 45.788, -59.926, 45.229, -59.023, 44.745, -58.082, 44.209, -57.916, 44.109, -58.237, 44.536, -58.086, 44.896, -57.081, 45.33, -55.879, 45.822, -54.697, 46.285, -53.29, 46.815, -52.232, 47.198, -51.085, 47.602, -49.851, 48.02, -48.534, 48.451, -47.139, 48.889, -45.669, 49.332, -44.584, 49.591, -43.56, 49.762, -42.409, 49.903, -41.143, 50.016, -40.123, 50.084, -39.049, 50.138, -37.925, 50.18, -36.756, 50.21, -36.357, 50.218, -35.128, 50.233, -33.863, 50.238, -32.564, 50.235, -31.236, 50.222, -29.883, 50.202, -28.511, 50.175, -27.123, 50.141, -25.724, 50.102, -24.318, 50.058, -22.91, 50.01, -21.504, 49.959, -20.103, 49.905, -18.713, 49.85, -17.338, 49.793, -15.982, 49.736, -14.649, 49.679, -13.345, 49.624, -12.074, 49.57, -10.84, 49.52, -9.648, 49.472, -8.5, 49.429, -7.402, 49.39, -6.36, 49.358, -5.065, 49.324, -3.886, 49.304, -2.834, 49.298, -1.713, 49.314, -0.985, 49.347, 0.158, 49.412, 1.565, 49.476, 2.633, 49.521, 3.795, 49.571, 5.041, 49.627, 6.362, 49.692, 7.747, 49.766, 9.188, 49.853, 10.675, 49.953, 12.199, 50.069, 13.75, 50.202, 15.319, 50.354, 16.895, 50.528, 18.471, 50.725, 19.647, 50.888, 20.812, 51.067, 21.962, 51.261, 23.093, 51.471, 24.202, 51.698, 25.283, 51.942, 26.334, 52.205, 27.351, 52.487, 28.328, 52.789, 29.264, 53.111, 30.442, 53.576, 31.518, 54.076, 32.485, 54.612, 33.337, 55.185, 34.229, 55.954, 34.918, 56.784, 35.313, 57.493, 35.96, 58.701, 36.785, 59.843, 37.767, 60.918, 38.501, 61.599, 39.291, 62.25, 40.131, 62.871, 41.016, 63.463, 41.94, 64.026, 42.898, 64.56, 43.883, 65.064, 44.89, 65.539, 45.914, 65.984, 46.948, 66.4, 47.468, 66.598, 48.517, 66.973, 49.566, 67.321, 50.611, 67.64, 51.646, 67.93, 52.665, 68.192, 53.663, 68.425, 54.875, 68.676, 55.111, 68.721, 56.259, 68.917, 57.347, 69.069, 58.365, 69.176, 59.479, 69.242, 60.607, 69.235, 60.892, 69.216, 62.109, 69.145, 63.238, 69.114, 64.317, 69.072, 65.388, 68.971, 66.49, 68.763, 67.663, 68.399, 68.683, 67.961, 69.801, 67.369, 70.719, 66.809, 71.716, 66.139, 72.803, 65.348, 73.989, 64.426, 74.841, 63.733, 75.744, 62.976, 76.703, 62.149, 77.719, 61.252, 78.796, 60.279, 79.808, 59.451, 80.854, 58.765, 81.93, 58.208, 83.026, 57.768, 84.135, 57.432, 85.251, 57.189, 86.365, 57.025, 87.471, 56.929, 88.56, 56.888, 89.626, 56.889, 90.793, 56.927, 91.799, 56.977, 92.923, 57.038, 93.93, 57.081, 94.31, 57.088, 94.633, 57.088, 95.711, 57.017, 96.737, 56.738, 97.374, 56.272, 97.374, 56.272, 97.673, 55.179, 97.741, 53.91, 97.59, 52.646, 97.257, 51.4, 96.776, 50.189, 96.185, 49.028, 95.518, 47.933, 94.99, 47.164, 94.295, 46.243, 93.604, 45.406, 92.823, 44.533, 92.038, 43.722, 91.462, 43.167, 91.462, 43.167, 93.47, 40.929, 94.142, 40.083, 94.771, 38.976, 95.126, 37.902, 95.242, 36.869, 95.107, 35.649, 94.726, 34.525, 94.167, 33.512, 93.517, 32.641, 92.833, 31.9, 92.061, 31.201, 91.248, 30.582, 91.102, 30.485, 90.686, 30.471, 90.686, 30.471, 74.457, 39.243, 74.457, 39.243, 58.741, 37.934, 57.6, 37.507, 56.545, 37.115, 55.576, 36.755, 54.473, 36.347, 53.254, 35.897, 51.937, 35.412, 50.539, 34.899, 49.57, 34.545, 49.077, 34.365, 48.007, 33.975, 46.919, 33.581, 45.82, 33.183, 44.716, 32.786, 43.613, 32.392, 42.519, 32.002, 41.438, 31.619, 40.377, 31.246, 39.343, 30.885, 38.342, 30.539, 37.379, 30.211, 36.023, 29.755, 34.79, 29.351, 34.047, 29.115, 33.062, 28.866, 31.947, 28.661, 30.801, 28.494, 29.702, 28.358, 28.703, 28.249, 27.635, 28.145, 26.502, 28.044, 25.307, 27.947, 24.309, 27.871, 23.277, 27.798, 22.748, 27.762, 21.667, 27.692, 20.557, 27.624, 19.418, 27.557, 18.253, 27.492, 17.065, 27.429, 15.855, 27.367, 14.625, 27.306, 13.378, 27.247, 12.115, 27.189, 10.838, 27.132, 9.55, 27.076, 8.252, 27.021, 6.947, 26.967, 5.637, 26.913, 4.323, 26.861, 3.008, 26.808, 1.693, 26.757, 0.381, 26.705, -0.926, 26.654, -2.226, 26.603, -3.517, 26.552, -4.797, 26.502, -6.065, 26.451, -7.317, 26.4, -8.552, 26.348, -9.768, 26.297, -10.963, 26.244, -12.135, 26.192, -13.282, 26.138, -14.401, 26.084, -15.492, 26.029, -16.551, 25.974, -17.577, 25.917, -19.047, 25.829, -20.43, 25.74, -21.717, 25.647, -22.904, 25.551, -23.982, 25.451, -25.238, 25.312, -26.273, 25.167, -26.495, 25.129, -27.931, 24.818, -29.281, 24.416, -30.556, 23.931, -31.765, 23.373, -32.917, 22.753, -34.021, 22.079, -35.086, 21.363, -36.123, 20.613, -37.14, 19.839, -38.146, 19.052, -39.152, 18.26, -40.166, 17.475, -41.197, 16.704, -42.255, 15.96, -43.349, 15.25, -44.374, 14.548, -45.281, 13.785, -46.084, 12.965, -46.795, 12.09, -47.427, 11.162, -47.991, 10.183, -48.5, 9.156, -48.968, 8.084, -49.405, 6.968, -49.824, 5.811, -50.237, 4.62, -50.658, 3.395, -51.098, 2.139, -51.572, 0.858, -52.091, -0.446, -52.669, -1.768, -53.317, -3.105, -53.796, -4.002, -54.315, -4.903, -54.879, -5.806, -55.492, -6.71, -55.818, -7.162, -56.716, -8.338, -57.381, -9.165, -58.095, -10.022, -58.852, -10.907, -59.65, -11.818, -60.483, -12.75, -61.348, -13.702, -62.24, -14.671, -63.154, -15.653, -64.088, -16.645, -65.036, -17.646, -65.995, -18.651, -66.96, -19.659, -67.926, -20.665, -68.409, -21.167, -69.374, -22.171, -70.33, -23.166, -71.273, -24.15, -72.2, -25.121, -73.105, -26.076, -73.986, -27.011, -74.837, -27.924, -75.655, -28.812, -76.435, -29.672, -77.174, -30.501, -77.867, -31.298, -78.812, -32.423, -79.63, -33.457, -80.099, -34.091, -80.975, -35.265, -81.888, -36.394, -82.839, -37.492, -83.828, -38.573, -84.855, -39.65, -85.921, -40.739, -87.027, -41.852, -88.171, -43.004, -89.356, -44.208, -90.582, -45.478, -91.848, -46.829, -93.155, -48.274, -93.824, -49.036, -94.504, -49.826, -95.194, -50.647, -95.895, -51.501, -96.606, -52.388, -97.328, -53.311, -98.064, -54.256, -98.767, -55.146, -99.438, -55.983, -100.08, -56.769, -101.282, -58.199, -102.387, -59.461, -103.411, -60.574, -104.368, -61.562, -105.273, -62.445, -106.141, -63.247, -106.985, -63.987, -107.822, -64.69, -108.666, -65.375, -109.531, -66.066, -110.432, -66.784, -111.385, -67.55, -112.403, -68.388, -113.15, -69.102, -113.866, -69.962, -114.547, -70.949, -115.192, -72.045, -115.797, -73.231, -116.361, -74.489, -116.88, -75.8, -117.352, -77.146, -117.774, -78.508, -118.145, -79.868, -118.41, -80.976, -118.634, -82.052, -118.817, -83.085, -118.981, -84.252, -119.081, -85.323, -119.108, -85.816, -119.104, -86.831, -118.994, -87.718, -118.678, -88.356, -117.657, -88.471, -116.695, -88.105, -116.216, -87.744, -115.504, -86.962, -115.212, -86.523, -114.65, -85.563, -113.977, -84.62, -113.301, -83.817, -113.174, -83.679, -112.437, -82.955, -111.58, -82.255, -110.604, -81.617, -109.51, -81.08, -108.548, -80.75, -107.509, -80.528, -106.961, -80.465, -105.898, -80.48, -104.893, -80.742, -103.999, -81.294, -103.774, -81.507, -103.135, -82.395, -102.727, -83.406, -102.547, -84.169, -102.417, -85.259, -102.396, -86.273, -102.456, -87.303, -102.489, -87.607, -101.497, -87.797, -100.404, -88.013, -99.302, -88.239, -98.301, -88.45, -97.676, -88.586, -96.697, -88.806, -95.71, -89.037, -94.734, -89.276, -93.66, -89.556, -93.53, -89.592, -92.539, -89.876, -91.541, -90.199, -90.552, -90.592, -90.405, -90.662, -89.613, -91.359, -89.332, -92.352, -89.337, -92.582, -89.57, -93.636, -90.003, -94.605, -90.12, -94.82, -90.12, -94.82, -90.819, -95.597, -91.424, -96.473, -91.917, -97.108, -91.301, -97.93, -90.687, -98.771, -90.078, -99.626, -89.809, -100.014, -89.204, -100.91, -88.637, -101.797, -88.273, -102.41, -87.806, -103.308, -87.751, -103.432, -87.528, -104.277, -87.822, -105.242, -88.178, -105.648, -89.039, -106.199, -90.027, -106.563, -90.577, -106.707, -91.611, -106.906, -92.856, -107.064, -93.939, -107.15, -95.159, -107.208, -96.524, -107.232, -98.042, -107.221, -99.144, -107.193, -100.318, -107.148, -101.569, -107.083, -102.899, -106.999, -104.31, -106.895, -105.53, -106.797, -106.717, -106.698, -107.874, -106.598, -108.999, -106.496, -110.093, -106.394, -111.156, -106.29, -112.19, -106.185, -113.194, -106.078, -115.116, -105.863, -116.924, -105.643, -118.623, -105.419, -120.215, -105.192, -121.704, -104.96, -123.094, -104.725, -124.387, -104.487, -125.588, -104.245, -126.699, -104.001, -127.725, -103.753, -128.667, -103.503, -129.737, -103.186, -130.692, -102.863, -131.697, -102.47, -132.688, -102.002, -133.5, -101.525, -134.314, -100.89, -134.993, -100.086, -135.355, -99.33, -135.432, -98.248, -135.179, -97.253, -134.833, -96.429, -134.316, -95.439, -133.769, -94.514, -133.165, -93.561, -132.769, -92.957, -132.398, -93.893, -132.997, -94.833, -133.535, -95.731, -134.04, -96.681, -134.089, -96.781, -134.469, -97.724, -134.634, -98.741, -134.574, -99.069, -134.038, -99.991, -133.224, -100.715, -133.045, -100.838, -132.057, -101.4, -131.072, -101.837, -130.06, -102.212, -129.089, -102.523, -128.447, -102.709, -127.026, -103.077, -125.973, -103.32, -124.832, -103.56, -123.599, -103.797, -122.271, -104.031, -120.844, -104.262, -119.316, -104.49, -117.681, -104.714, -115.938, -104.935, -114.082, -105.152, -112.11, -105.364, -111.08, -105.469, -110.019, -105.573, -108.927, -105.675, -107.805, -105.777, -106.65, -105.877, -105.464, -105.976, -104.245, -106.074, -102.839, -106.177, -101.517, -106.261, -100.274, -106.325, -99.11, -106.37, -98.022, -106.398, -97.007, -106.409, -95.617, -106.396, -94.378, -106.35, -93.281, -106.275, -92.027, -106.135, -90.992, -105.955, -90.765, -105.904, -89.741, -105.601, -88.836, -105.123, -88.73, -105.035, -88.353, -104.277, -88.51, -103.754, -88.968, -102.854, -88.989, -102.819, -89.533, -101.919, -90.106, -101.043, -90.488, -100.482, -91.138, -99.557, -91.735, -98.731, -92.358, -97.892, -92.683, -97.464, -92.356, -96.8, -91.708, -96.021, -91.057, -95.132, -90.48, -94.206, -90.48, -94.206, -90.286, -93.174, -90.16, -92.529, -90.519, -91.562, -90.774, -91.399, -91.72, -91.01, -92.772, -90.667, -93.748, -90.386, -94.801, -90.109, -95.902, -89.838, -96.881, -89.609, -97.854, -89.391, -98.932, -89.158, -99.945, -88.947, -101.075, -88.719, -102.154, -88.509, -103.027, -88.345, -103.027, -88.345, -103.289, -87.339, -103.222, -86.323, -103.249, -85.186, -103.359, -84.316, -103.626, -83.313, -104.115, -82.379, -104.367, -82.08, -105.209, -81.503, -106.213, -81.278, -106.893, -81.286, -108.096, -81.483, -109.197, -81.843, -110.195, -82.332, -111.09, -82.917, -111.883, -83.565, -112.574, -84.243, -113.264, -85.044, -113.873, -85.881, -114.406, -86.758, -114.477, -86.896, -114.487, -86.915, -115.086, -87.76, -115.67, -88.362, -116.548, -88.968, -117.536, -89.288, -118.55, -89.249, -118.96, -89.13, -119.658, -88.361, -119.797, -87.9, -119.927, -86.874, -119.934, -85.868, -119.931, -85.785, -119.86, -84.727, -119.723, -83.567, -119.561, -82.535, -119.356, -81.458, -119.11, -80.345, -118.944, -79.665, -118.57, -78.294, -118.142, -76.909, -117.659, -75.531, -117.124, -74.179, -116.54, -72.874, -115.907, -71.636, -115.228, -70.485, -114.504, -69.441, -113.737, -68.524, -112.93, -67.754, -111.906, -66.912, -110.952, -66.144, -110.051, -65.427, -109.19, -64.74, -108.353, -64.06, -107.525, -63.366, -106.69, -62.635, -105.834, -61.845, -104.942, -60.974, -103.999, -60, -102.989, -58.9, -101.897, -57.653, -100.708, -56.237, -100.073, -55.458, -99.408, -54.629, -98.711, -53.746, -97.98, -52.807, -97.216, -51.829, -96.469, -50.897, -95.74, -50.007, -95.029, -49.159, -94.334, -48.349, -93.655, -47.575, -92.343, -46.126, -91.088, -44.793, -89.887, -43.556, -88.735, -42.396, -87.628, -41.294, -86.562, -40.232, -85.531, -39.19, -84.532, -38.149, -83.561, -37.09, -82.613, -35.993, -81.684, -34.84, -80.77, -33.612, -80.027, -32.623, -79.151, -31.539, -78.499, -30.768, -77.797, -29.962, -77.051, -29.123, -76.264, -28.256, -75.44, -27.361, -74.584, -26.443, -73.7, -25.504, -72.791, -24.547, -71.863, -23.575, -70.92, -22.59, -69.965, -21.596, -69.003, -20.596, -68.035, -19.589, -67.068, -18.581, -66.107, -17.574, -65.154, -16.573, -64.216, -15.579, -63.295, -14.595, -62.396, -13.625, -61.523, -12.671, -60.679, -11.735, -59.87, -10.821, -59.1, -9.932, -58.371, -9.069, -57.689, -8.237, -57.058, -7.438, -56.482, -6.674, -55.861, -5.794, -55.289, -4.915, -54.762, -4.038, -54.277, -3.163, -53.619, -1.856, -53.033, -0.559, -52.507, 0.725, -52.028, 1.995, -51.582, 3.247, -51.157, 4.479, -50.74, 5.688, -50.601, 6.085, -50.177, 7.256, -49.73, 8.397, -49.248, 9.504, -48.718, 10.573, -48.126, 11.599, -47.459, 12.579, -46.705, 13.508, -45.849, 14.383, -44.879, 15.198, -43.782, 15.951, -42.743, 16.627, -41.721, 17.35, -40.711, 18.108, -39.703, 18.89, -38.691, 19.686, -37.667, 20.483, -36.623, 21.272, -35.551, 22.041, -34.445, 22.78, -33.295, 23.476, -32.095, 24.119, -30.837, 24.698, -29.514, 25.202, -28.117, 25.62, -26.638, 25.941, -25.633, 26.093, -24.407, 26.236, -23.352, 26.339, -22.189, 26.437, -20.925, 26.532, -19.566, 26.623, -18.12, 26.711, -17.11, 26.769, -16.066, 26.825, -14.991, 26.88, -14.442, 26.907, -13.321, 26.962, -12.173, 27.015, -11, 27.068, -9.804, 27.12, -8.587, 27.172, -7.351, 27.223, -6.098, 27.274, -4.83, 27.325, -3.549, 27.376, -2.258, 27.427, -0.957, 27.478, 0.35, 27.529, 1.661, 27.58, 2.976, 27.632, 4.29, 27.684, 5.604, 27.737, 6.914, 27.79, 8.218, 27.844, 9.515, 27.899, 10.802, 27.955, 12.078, 28.012, 13.339, 28.07, 14.585, 28.129, 15.813, 28.19, 17.022, 28.251, 18.208, 28.315, 19.37, 28.38, 20.507, 28.446, 21.615, 28.514, 22.693, 28.584, 23.739, 28.656, 24.751, 28.73, 25.964, 28.826, 27.116, 28.925, 28.203, 29.027, 29.221, 29.133, 29.608, 29.177, 30.698, 29.311, 31.818, 29.475, 32.886, 29.671, 33.801, 29.902, 34.933, 30.264, 36.203, 30.683, 37.59, 31.153, 38.57, 31.49, 39.585, 31.842, 40.631, 32.209, 41.7, 32.586, 42.787, 32.972, 43.885, 33.364, 44.987, 33.76, 46.089, 34.157, 47.182, 34.553, 48.262, 34.945, 48.795, 35.139, 49.841, 35.521, 50.858, 35.893, 51.839, 36.254, 53.228, 36.765, 54.501, 37.236, 55.636, 37.656, 56.613, 38.019, 57.631, 38.398, 58.505, 38.725, 58.616, 38.75, 59.793, 38.848, 60.808, 38.933, 62.049, 39.036, 63.459, 39.154, 64.983, 39.281, 66.563, 39.412, 68.143, 39.544, 69.667, 39.671, 71.077, 39.788, 72.318, 39.892, 73.333, 39.976, 74.459, 40.07, 74.511, 40.075, 74.741, 40.026, 75.951, 39.372, 76.994, 38.809, 78.27, 38.119, 79.719, 37.335, 81.285, 36.489, 82.909, 35.611, 84.533, 34.733, 86.099, 33.887, 87.549, 33.103, 88.825, 32.414, 89.868, 31.85, 90.87, 31.308, 91.078, 31.196, 90.662, 31.182, 91.535, 31.835, 92.374, 32.607, 93.127, 33.47, 93.478, 33.963, 93.968, 34.844, 94.303, 35.811, 94.422, 36.857, 94.261, 37.972, 93.891, 38.909, 93.27, 39.881, 92.856, 40.379, 92.856, 40.379, 90.575, 42.921, 90.575, 42.921, 90.985, 43.849, 91.808, 44.661, 92.582, 45.49, 93.264, 46.28, 93.97, 47.169, 94.321, 47.645, 95.005, 48.658, 95.625, 49.722, 96.155, 50.822, 96.565, 51.947, 96.83, 53.081, 96.921, 54.214, 96.81, 55.33, 96.67, 55.878, 96.67, 55.878, 95.705, 56.185, 94.623, 56.264, 94.316, 56.264, 93.199, 56.229, 92.174, 56.173, 91.064, 56.113, 90.015, 56.073, 89.64, 56.065, 88.548, 56.064, 87.422, 56.106, 86.271, 56.206, 85.104, 56.378, 83.929, 56.634, 82.754, 56.989, 81.589, 57.457, 80.443, 58.05, 79.324, 58.783, 78.241, 59.67, 77.165, 60.641, 76.154, 61.534, 75.202, 62.355, 74.308, 63.104, 73.468, 63.787, 72.68, 64.405, 71.586, 65.22, 70.59, 65.91, 69.681, 66.484, 68.587, 67.09, 67.604, 67.538, 67.372, 67.628, 66.282, 67.968, 65.266, 68.158, 64.269, 68.248, 63.233, 68.286, 62.103, 68.318, 61.093, 68.374, 60.823, 68.395, 59.823, 68.426, 58.804, 68.383, 57.654, 68.276, 56.607, 68.137, 55.492, 67.953, 55.261, 67.911, 54.082, 67.673, 52.86, 67.391, 51.859, 67.134, 50.842, 66.849, 49.816, 66.536, 48.785, 66.194, 47.755, 65.825, 46.724, 65.426, 45.709, 65.001, 44.713, 64.549, 43.741, 64.072, 42.799, 63.568, 41.89, 63.039, 41.021, 62.484, 40.196, 61.904, 39.052, 60.988, 38.034, 60.016, 37.16, 58.989, 36.445, 57.908, 36.066, 57.158, 35.466, 56.133, 34.639, 55.203, 33.831, 54.526, 32.905, 53.903, 31.873, 53.332, 30.75, 52.811, 29.545, 52.337, 28.586, 52.006, 27.585, 51.697, 26.547, 51.409, 25.475, 51.141, 24.374, 50.892, 23.249, 50.662, 22.102, 50.449, 20.939, 50.253, 19.763, 50.073, 18.579, 49.908, 16.99, 49.709, 15.401, 49.534, 13.822, 49.381, 12.261, 49.246, 10.729, 49.13, 9.234, 49.029, 7.787, 48.943, 6.397, 48.868, 5.074, 48.803, 3.827, 48.747, 2.666, 48.697, 1.6, 48.652, 0.2, 48.589, -0.931, 48.525, -2.114, 48.48, -3.345, 48.475, -4.476, 48.488, -5.724, 48.516, -6.732, 48.544, -7.795, 48.579, -8.911, 48.619, -9.681, 48.649, -10.876, 48.696, -12.111, 48.747, -13.383, 48.801, -14.686, 48.856, -16.017, 48.913, -17.372, 48.97, -18.745, 49.026, -20.134, 49.082, -21.533, 49.136, -22.939, 49.187, -24.346, 49.235, -25.75, 49.279, -27.146, 49.318, -28.53, 49.351, -29.898, 49.378, -31.246, 49.398, -32.568, 49.411, -33.862, 49.414, -35.121, 49.409, -36.343, 49.394, -37.525, 49.367, -38.658, 49.33, -39.737, 49.28, -40.758, 49.217, -42.022, 49.113, -43.167, 48.984, -44.181, 48.828, -45.251, 48.593, -45.437, 48.541, -46.898, 48.102, -48.284, 47.666, -49.592, 47.238, -50.817, 46.822, -51.957, 46.422, -53.006, 46.042, -53.961, 45.685, -55.209, 45.202, -56.223, 44.794, -57.189, 44.39, -57.746, 44.146, -58.067, 44.573, -57.916, 44.933, -59.024, 45.569, -59.927, 46.053, -61.038, 46.613, -62.321, 47.211, -63.253, 47.613, -64.234, 48.005, -65.252, 48.376, -66.297, 48.715, -67.358, 49.01, -68.424, 49.251, -68.955, 49.348, -68.955, 49.348, -70.042, 48.703, -71.47, 48.961, -72.916, 49.246, -73.964, 49.466, -75.134, 49.721, -76.471, 50.021, -78.02, 50.375, -79.826, 50.792, -80.841, 51.028, -81.936, 51.283, -83.119, 51.558, -84.395, 51.855, -85.77, 52.176, -87.249, 52.52, -88.838, 52.889, -90.542, 53.286, -92.368, 53.709, -94.321, 54.162, -96.406, 54.644, -98.631, 55.158, -99.781, 55.395, -100.963, 55.583, -102.174, 55.724, -103.414, 55.819, -104.68, 55.871, -105.971, 55.879, -107.285, 55.847, -108.62, 55.775, -109.974, 55.665, -111.346, 55.518, -112.735, 55.336, -114.137, 55.121, -115.553, 54.873, -116.979, 54.595, -118.415, 54.288, -119.858, 53.954, -121.306, 53.594, -122.759, 53.209, -124.214, 52.801, -125.67, 52.372, -127.125, 51.922, -128.577, 51.455, -130.024, 50.97, -131.465, 50.47, -132.898, 49.956, -134.322, 49.43, -135.734, 48.893, -137.133, 48.346, -138.517, 47.792, -139.884, 47.231, -141.23, 46.667, -142.554, 46.101, -143.856, 45.532, -145.134, 44.965, -146.386, 44.399, -147.609, 43.836, -148.804, 43.278, -149.967, 42.726, -151.097, 42.183, -152.192, 41.648, -153.251, 41.125, -154.272, 40.615, -155.253, 40.118, -156.192, 39.637, -157.087, 39.174, -158.741, 38.304, -160.201, 37.521, -161.452, 36.838, -162.481, 36.267, -163.577, 35.648, -164.13, 35.328, -165.071, 34.801, -166.008, 34.261, -166.876, 33.748, -167.863, 33.152, -168.947, 32.48, -170.107, 31.742, -171.322, 30.944, -172.152, 30.383, -172.996, 29.798, -173.84, 29.196, -174.677, 28.58, -175.502, 27.953, -176.309, 27.317, -177.091, 26.673, -178.205, 25.701, -179.231, 24.725, -180.149, 23.755, -180.938, 22.799, -181.579, 21.863, -182.051, 20.957, -182.051, 20.957, -184.7, 14.776, -184.7, 14.776, -185.784, 14.404, -187.001, 14.175, -188.041, 13.957, -189.214, 13.686, -190.478, 13.361, -191.46, 13.081, -192.449, 12.77, -193.425, 12.429, -194.371, 12.058, -195.412, 11.588, -196.1, 11.226, -196.964, 10.685, -197.754, 10.037, -198.412, 9.19, -198.592, 8.752, -198.636, 7.683, -198.34, 6.722, -197.959, 5.969, -197.357, 5.039, -196.699, 4.171, -196.042, 3.384, -195.305, 2.556, -194.907, 2.127, -194.098, 1.277, -193.202, 0.363, -192.231, -0.61, -191.198, -1.637, -190.48, -2.348, -189.742, -3.08, -188.989, -3.83, -188.223, -4.597, -187.449, -5.378, -186.67, -6.174, -185.889, -6.981, -185.11, -7.799, -184.335, -8.625, -183.61, -9.55, -183.024, -10.572, -182.531, -11.682, -182.083, -12.873, -181.631, -14.137, -181.262, -15.127, -180.844, -16.152, -180.357, -17.206, -180.176, -17.564, -179.535, -18.715, -178.759, -19.926, -178.156, -20.768, -177.477, -21.638, -176.714, -22.536, -175.862, -23.463, -174.912, -24.419, -173.86, -25.404, -172.697, -26.419, -171.416, -27.465, -170.013, -28.541, -168.478, -29.648, -166.806, -30.787, -165.917, -31.368, -164.991, -31.957, -164.055, -32.543, -163.145, -33.111, -162.259, -33.66, -161.398, -34.191, -159.747, -35.201, -158.188, -36.145, -156.717, -37.026, -155.33, -37.847, -154.024, -38.611, -152.794, -39.322, -151.638, -39.984, -150.551, -40.599, -149.53, -41.17, -148.571, -41.702, -147.67, -42.198, -146.419, -42.88, -146.027, -43.093, -144.92, -43.694, -143.904, -44.247, -142.967, -44.765, -142.096, -45.258, -141.017, -45.896, -140.004, -46.537, -139.029, -47.207, -138.063, -47.932, -137.574, -48.324, -136.836, -49.011, -136.141, -49.816, -135.488, -50.724, -134.878, -51.718, -134.307, -52.784, -133.777, -53.905, -133.285, -55.065, -132.831, -56.248, -132.413, -57.439, -132.032, -58.621, -131.738, -59.6, -131.415, -60.747, -131.125, -61.849, -130.866, -62.892, -130.603, -64.012, -130.382, -65.003, -130.152, -66.068, -129.939, -67.046, -129.929, -67.088, -129.704, -68.168, -129.508, -69.252, -129.336, -70.274, -129.152, -71.424, -128.989, -72.493, -128.827, -73.624, -128.667, -74.799, -128.54, -75.803, -128.419, -76.817, -128.307, -77.835, -128.206, -78.847, -128.119, -79.845, -128.034, -81.009, -127.992, -81.759, -127.953, -82.829, -127.945, -83.832, -127.983, -84.893, -128.096, -85.931, -128.16, -86.263, -128.502, -87.35, -128.914, -88.274, -129.422, -89.233, -130.002, -90.215, -130.628, -91.207, -131.277, -92.196, -131.923, -93.17, -132.082, -93.41]; var c = [ 124.993, 16.553, 126.997, 15.456, 128.936, 14.395, 130.81, 13.371, 132.622, 12.382, 134.372, 11.429, 136.06, 10.509, 137.69, 9.624, 139.26, 8.772, 140.773, 7.952, 142.229, 7.164, 143.63, 6.408, 144.976, 5.682, 146.27, 4.986, 147.511, 4.319, 148.7, 3.681, 149.84, 3.072, 150.931, 2.49, 151.974, 1.935, 152.97, 1.406, 153.921, 0.902, 154.827, 0.424, 156.509, -0.46, 158.025, -1.251, 159.385, -1.955, 160.596, -2.576, 161.148, -2.857]; var d = [ 124.993, 16.553, 125.65, 17.738, 127.643, 16.621, 129.57, 15.541, 131.433, 14.497, 133.234, 13.489, 134.972, 12.516, 136.649, 11.577, 138.267, 10.672, 139.826, 9.8, 141.328, 8.961, 142.773, 8.153, 144.162, 7.377, 145.497, 6.632, 146.779, 5.916, 148.009, 5.23, 149.187, 4.573, 150.316, 3.944, 151.395, 3.342, 152.427, 2.768, 153.412, 2.219, 154.351, 1.696, 155.246, 1.199, 156.905, 0.276, 158.399, -0.555, 159.736, -1.298, 160.924, -1.958, 161.466, -2.259, 162.448, -2.805, 163.498, -3.389, 164.521, -3.96, 165.424, -4.466, 166.128, -4.869, 166.742, -5.251, 166.82, -5.327, 166.826, -5.373, 166.793, -5.407, 166.676, -5.407, 165.979, -5.173, 164.99, -4.74, 163.963, -4.255, 163.031, -3.8, 161.914, -3.244, 161.148, -2.857]; var f=[ 130.655, 47.377, 130.586, 48.73, 130.586, 48.73, 199.5, 51.586, 130.655, 47.377]; var g=[ 120.77, 80.122, 120.16, 81.332, 122.662, 82.582, 125.08, 83.791, 127.417, 84.96, 129.673, 86.09, 131.85, 87.182, 133.95, 88.235, 135.973, 89.252, 137.922, 90.232, 139.797, 91.175, 141.6, 92.084, 143.333, 92.958, 144.997, 93.798, 146.593, 94.605, 148.123, 95.379, 149.587, 96.122, 150.989, 96.833, 152.328, 97.513, 153.607, 98.164, 154.826, 98.785, 155.988, 99.378, 157.093, 99.942, 158.143, 100.479, 159.14, 100.99, 160.084, 101.475, 160.978, 101.934, 162.618, 102.78, 164.073, 103.532, 164.734, 103.875, 165.647, 104.349, 166.724, 104.911, 167.651, 105.396, 168.616, 105.904, 169.521, 106.382, 170.36, 106.826, 171.092, 107.199, 171.199, 107.233, 171.222, 107.227, 171.242, 107.219, 171.242, 107.219, 171.258, 107.205, 171.26, 107.173, 171.193, 107.063, 170.536, 106.536, 169.609, 105.93, 168.688, 105.368, 167.705, 104.787, 166.761, 104.243, 165.664, 103.62, 165.055, 103.278, 163.709, 102.53, 162.182, 101.691, 160.464, 100.756, 159.529, 100.251, 158.542, 99.72, 157.501, 99.162, 156.406, 98.577, 155.254, 97.964, 154.044, 97.322, 152.775, 96.651, 151.445, 95.95, 150.053, 95.219, 148.598, 94.456, 147.078, 93.661, 145.491, 92.834, 143.837, 91.973, 142.114, 91.079, 140.32, 90.15, 138.454, 89.185, 136.515, 88.185, 134.502, 87.148, 132.412, 86.074, 130.244, 84.962, 127.997, 83.812, 125.671, 82.622, 123.262, 81.392, 120.77, 80.122]; const list = [a,b,c,d,f,g]; function goose(t) { const scale =.2; for(let k=0;k<list.length;++k) { let j=0; t.penup(); t.goto( scale*list[k][j*2+0], -scale*list[k][j*2+1] ); t.pendown(); for(j=1;j<list[k].length/2;++j) { t.goto( scale*list[k][j*2+0], -scale*list[k][j*2+1] ); } t.penup(); } }