A lot of parameters to set all pieces, but you can make all Tangram puzzles. en.wikipedia.org/wiki/tangram
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(-1); const scale = 150 // min = 1, max = 200, step = 1 const loadConfIgnoreRest = 0 // min = 0, max = 1, step = 1 const bigOneX = 0 //min = -90, max = 90, step = .5 const bigOneY = 0 //min = -90, max = 90, step = .5 const bigOneOrientation = 225 //min = 0, max = 359, step = 1 const bigTwoX = 0 //min = -90, max = 90, step = .5 const bigTwoY = 0 //min = -90, max = 90, step = .5 const bigTwoOrientation = 135 //min = 0, max = 359, step = 1 const squareX = 0 //min = -90, max = 90, step = .5 const squareY = 0 //min = -90, max = 90, step = .5 const squareOrientation = 315 //min = 0, max = 359, step = 1 const littleOneX = 0 //min = -90, max = 90, step = .5 const littleOneY = 0 //min = -90, max = 90, step = .5 const littleOneOrientation = 45 //min = 0, max = 359, step = 1 const littleTwoX = 37.5 //min = -90, max = 90, step = .5 const littleTwoY = -37.5 //min = -90, max = 90, step = .5 const littleTwoOrientation = 315 //min = 0, max = 359, step = 1 const parallelogramX = -75 //min = -90, max = 90, step = .5 const parallelogramY = 75 //min = -90, max = 90, step = .5 const parallelogramOrientation = 0 //min = 0, max = 359, step = 1 const parallelogramMirrored = 0 //min = 0, max = 1, step = 1 const remainingOneX = 75 //min = -90, max = 90, step = .5 const remainingOneY = 75 //min = -90, max = 90, step = .5 const remainingOneOrientation = 180 //min = 0, max = 359, step = 1 const fill = 0 // min = 0, max = 10, step = 1 const root2 = Math.sqrt(2); class TangramPiece { constructor(location, orientation, size) { this.l = location; this.o = orientation; this.s = size; } } class TangramTriangle extends TangramPiece { draw(turtle) { for(let ss = this.s; ss > 0; ss-=.2 * fill) { turtle.jump(this.l[0], this.l[1]); turtle.setheading(this.o); turtle.forward(ss); turtle.right(135); turtle.forward(ss * root2); turtle.right(135); turtle.forward(ss); if(fill == 0) { return; } } } } class TangramParallelogram extends TangramPiece { constructor(location, orientation, size, isMirrored) { super(location, orientation, size); this.m = isMirrored; } draw(turtle) { for(let ss = this.s; ss > 0; ss-=.2 * fill) { turtle.jump(this.l[0], this.l[1]); turtle.setheading(this.o); turtle.forward(this.s); turtle.left(this.m == 1? -45: 45); turtle.forward(ss / 2 * root2); turtle.left(this.m == 1? -135: 135); turtle.forward(this.s); turtle.left(this.m == 1? -45: 45); turtle.forward(ss / 2 * root2); if(fill == 0) { return; } } } } class TangramSquare extends TangramPiece { draw(turtle) { for(let ss = this.s; ss > 0; ss-=.2 * fill) { turtle.jump(this.l[0], this.l[1]); turtle.setheading(this.o); for(let i = 0; i < 4; i++) { turtle.forward(i % 2 == 0? ss:this.s); turtle.right(90); } if(fill == 0) { return; } } } } // Global code will be evaluated once. const turtle = new Turtle(); // The walk function will be called until it returns false. function walk(i) { let piece = [ //bigOne new TangramTriangle([bigOneX, bigOneY], bigOneOrientation, root2 * scale / 2), //bigTwo new TangramTriangle([bigTwoX, bigTwoY], bigTwoOrientation, root2 * scale / 2), //square new TangramSquare([squareX, squareY], squareOrientation, root2 * scale / 4), //littleOne new TangramTriangle([littleOneX, littleOneY], littleOneOrientation, root2 * scale / 4), //littleTwo new TangramTriangle([littleTwoX, littleTwoY], littleTwoOrientation, root2 * scale / 4), //parallelogram new TangramParallelogram([parallelogramX, parallelogramY], parallelogramOrientation, scale / 2, parallelogramMirrored), //remainingOne new TangramTriangle([remainingOneX, remainingOneY], remainingOneOrientation, scale / 2), ]; if(loadConfIgnoreRest > 0) { piece = getConfig(loadConfIgnoreRest); } for(let j = 0; j < piece.length; j++) { piece[j].draw(turtle); } return false; } function getConfig(cfg) { return ([null, [ //bigOne new TangramTriangle([0, -90], 0, 90), //bigTwo new TangramTriangle([0, -90], 90, 90), //square new TangramSquare([0, 0], 135, 45), //littleOne new TangramTriangle([90 / root2, 0], 135, 45), //littleTwo new TangramTriangle([-90 / root2 / 2, 90 / root2 / 2], 45, 45), //parallelogram new TangramParallelogram([-90 / root2 / 2, 90 / root2 / 2], 0, 90 / root2, 1), //remainingOne new TangramTriangle([90 / root2 / 2, 90 / root2 / 2], 180, 90 / root2), ] //todo: add more presets ])[cfg]; }