Log in to post a comment.
// Turtletoy Protractor // use with the setheading(angle) command // code by Rupert Russell // https://turtletoy.net/turtle/0a5860aa5b# // 6 October 2025 // You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(1); // Global code will be evaluated once. const turtle = new Turtle(); const fontSize = 0.18; /// min= 0 max=1 step=0.01 for(let degrees = 0; degrees <=359; degrees++){ turtle.penup(); turtle.goto(0,0); turtle.setheading(degrees); // Draw every 10th line longer if(degrees % 10 == 0){ turtle.forward(97-18); turtle.pendown() turtle.forward(18); } else{ turtle.forward(87); turtle.pendown() turtle.forward(10); } } turtle.penup(); turtle.goto(0,0); turtle.setheading(0); // Draw Circles turtle.penup(); turtle.goto(0,-97); turtle.pendown() turtle.circle(97, extent = 360) // outer circle turtle.penup(); turtle.goto(0,-68); turtle.pendown() turtle.circle(68, extent = 360) // 1st inner circle // draw cardinal compass lines // North - South turtle.penup(); turtle.goto(0,0); turtle.pendown() turtle.setheading(90); // S turtle.forward(65) // North - South turtle.penup(); turtle.goto(0,-14); turtle.pendown() turtle.setheading(270); // N turtle.forward(64-14) // East - West turtle.penup(); turtle.goto(-65,0); turtle.pendown() turtle.setheading(0); turtle.forward(130) turtle.penup(); turtle.goto(-63,-14); turtle.pendown() turtle.setheading(0); turtle.forward(127) //NW - SE turtle.penup(); turtle.goto(0,0); turtle.pendown() turtle.setheading(45); // SE turtle.forward(65) turtle.penup(); turtle.goto(0,0); turtle.setheading(225); // NW turtle.forward(20) turtle.pendown() turtle.forward(65-20) //NE - SW turtle.penup(); turtle.goto(0,0); turtle.pendown() turtle.setheading(135); // SE turtle.forward(65) turtle.penup(); turtle.goto(0,0); turtle.setheading(315); // NW turtle.forward(20) turtle.pendown() turtle.forward(65-20) turtle.setheading(0); const text = new Text(); let size = text.print(null, "turtle.setheading(angle);", .3); turtle.jump(-size[0]/2, -7); // center text more or less text.print(turtle, "turtle.setheading(angle);", .3); turtle.setheading(0); size = text.print(null, "270", fontSize); turtle.jump(-size[0]/2 , -74); // center text more or less text.print(turtle, "270", fontSize); turtle.setheading(10); size = text.print(null, "280", fontSize); turtle.jump((-size[0]/2)+ 12.9, -74); // center text more or less text.print(turtle, "280", fontSize); turtle.setheading(20); size = text.print(null, "290", fontSize); turtle.jump((-size[0]/2)+ 25.8, -71.6); // center text more or less text.print(turtle, "290", fontSize); turtle.setheading(30); size = text.print(null, "300", fontSize); turtle.jump((-size[0]/2)+ 37.2, -67.4); // center text more or less text.print(turtle, "300", fontSize); turtle.setheading(40); size = text.print(null, "310", fontSize); turtle.jump((-size[0]/2)+ 48.7, -60.6); // center text more or less text.print(turtle, "310", fontSize); turtle.setheading(50); size = text.print(null, "320", fontSize); turtle.jump((-size[0]/2)+ 58.7, -51.9); // center text more or less text.print(turtle, "320", fontSize); turtle.setheading(60); size = text.print(null, "330", fontSize); turtle.jump((-size[0]/2)+ 67.0, -41.8); // center text more or less text.print(turtle, "330", fontSize); turtle.setheading(70); size = text.print(null, "340", fontSize); turtle.jump((-size[0]/2)+ 72.5, -30.8); // center text more or less text.print(turtle, "340", fontSize); turtle.setheading(80); size = text.print(null, "350", fontSize); turtle.jump((-size[0]/2)+ 77, -17.6); // center text more or less text.print(turtle, "350", fontSize); turtle.setheading(90); size = text.print(null, "0", fontSize); turtle.jump((-size[0]/2)+ 75.7, -1.8); // center text more or less text.print(turtle, "0", fontSize); turtle.setheading(100); size = text.print(null, "10", fontSize); turtle.jump((-size[0]/2)+ 76.9, 9.4); // center text more or less text.print(turtle, "10", fontSize); turtle.setheading(110); size = text.print(null, "20", fontSize); turtle.jump((-size[0]/2)+ 73.9, 21.8); // center text more or less text.print(turtle, "20", fontSize); turtle.setheading(120); size = text.print(null, "30", fontSize); turtle.jump((-size[0]/2)+ 69.3, 33.6); // center text more or less text.print(turtle, "30", fontSize); turtle.setheading(130); size = text.print(null, "40", fontSize); turtle.jump((-size[0]/2)+ 62.4, 44.5); // center text more or less text.print(turtle, "40", fontSize); turtle.setheading(140); size = text.print(null, "50", fontSize); turtle.jump((-size[0]/2)+ 53.5, 54.3); // center text more or less text.print(turtle, "50", fontSize); turtle.setheading(150); size = text.print(null, "60", fontSize); turtle.jump((-size[0]/2)+ 43.7, 62); // center text more or less text.print(turtle, "60", fontSize); turtle.setheading(160); size = text.print(null, "70", fontSize); turtle.jump((-size[0]/2)+ 32.1, 68); // center text more or less text.print(turtle, "70", fontSize); turtle.setheading(170); size = text.print(null, "80", fontSize); turtle.jump((-size[0]/2)+ 19.8, 72.3); // center text more or less text.print(turtle, "80", fontSize); turtle.setheading(180); size = text.print(null, "90", fontSize); turtle.jump((-size[0]/2)+ 7, 74); // center text more or less text.print(turtle, "90", fontSize); turtle.setheading(190); size = text.print(null, "100", fontSize); turtle.jump((-size[0]/2)+ -2, 73.5); // center text more or less text.print(turtle, "100", fontSize); turtle.setheading(200); size = text.print(null, "110", fontSize); turtle.jump((-size[0]/2)+ -14.4, 71); // center text more or less text.print(turtle, "110", fontSize); turtle.setheading(210); size = text.print(null, "120", fontSize); turtle.jump((-size[0]/2)+ -26.8, 66.7); // center text more or less text.print(turtle, "120", fontSize); turtle.setheading(220); size = text.print(null, "130", fontSize); turtle.jump((-size[0]/2)+ -37.7, 60.3); // center text more or less text.print(turtle, "130", fontSize); turtle.setheading(230); size = text.print(null, "140", fontSize); turtle.jump((-size[0]/2)+ -47.5, 51.3); // center text more or less text.print(turtle, "140", fontSize); turtle.setheading(240); size = text.print(null, "150", fontSize); turtle.jump((-size[0]/2)+ -56, 41.5); // center text more or less text.print(turtle, "150", fontSize); turtle.setheading(250); size = text.print(null, "160", fontSize); turtle.jump((-size[0]/2)+ -62, 30.4); // center text more or less text.print(turtle, "160", fontSize); turtle.setheading(260); size = text.print(null, "170", fontSize); turtle.jump((-size[0]/2)+ -66.1, 17.7); // center text more or less text.print(turtle, "170", fontSize); turtle.setheading(270); size = text.print(null, "180", fontSize); turtle.jump((-size[0]/2)+ -68.5, 5.3); // center text more or less text.print(turtle, "180", fontSize); turtle.setheading(280); size = text.print(null, "190", fontSize); turtle.jump((-size[0]/2)+ -68.1, -7.4); // center text more or less text.print(turtle, "190", fontSize); turtle.setheading(290); size = text.print(null, "200", fontSize); turtle.jump((-size[0]/2)+ -65.7, -20.2); // center text more or less text.print(turtle, "200", fontSize); turtle.setheading(300); size = text.print(null, "210", fontSize); turtle.jump((-size[0]/2)+ -61.3, -32.2); // center text more or less text.print(turtle, "210", fontSize); turtle.setheading(310); size = text.print(null, "220", fontSize); turtle.jump((-size[0]/2)+ -55.3, -43); // center text more or less text.print(turtle, "220", fontSize); turtle.setheading(320); size = text.print(null, "230", fontSize); turtle.jump((-size[0]/2)+ -46.1, -53); // center text more or less text.print(turtle, "230", fontSize); turtle.setheading(330); size = text.print(null, "240", fontSize); turtle.jump((-size[0]/2)+ -36.5, -61); // center text more or less text.print(turtle, "240", fontSize); turtle.setheading(340); size = text.print(null, "250", fontSize); turtle.jump((-size[0]/2)+ -25.3, -67.7); // center text more or less text.print(turtle, "250", fontSize); turtle.setheading(350); size = text.print(null, "260", fontSize); turtle.jump((-size[0]/2)+ -12.5, -71.8); // center text more or less text.print(turtle, "260", fontSize); //////////////////////////////////////////////////////////////// // Text utility code. Created by Reinder Nijhoff 2019 // https://turtletoy.net/turtle/1713ddbe99 //////////////////////////////////////////////////////////////// function Text() { const rotAdd = (a, b, h) => [Math.cos(h)*a[0] - Math.sin(h)*a[1] + b[0], Math.cos(h)*a[1] + Math.sin(h)*a[0] + b[1]]; class Text { print (t, str, scale = 1, italic = 0, kerning = 1) { let pos = t ? [t.x(), t.y()] : [0,0], h = t ? t.h() * Math.PI * 2 / t.fullCircle() : 0, o = pos; str.split('').forEach(c => { const i = c.charCodeAt(0) - 32; if (i < 0 ) { pos = o = rotAdd([0, 48*scale], o, h); } else if (i > 96 ) { pos = rotAdd([16*scale, 0], o, h); } else { const d = dat[i], lt = d[0]*scale, rt = d[1]*scale, paths = d[2]; paths.map( p => { t && t.up(); p.map( s=> { t && t.goto(rotAdd([(s[0]-s[1]*italic)*scale - lt, s[1]*scale], pos, h)); t && t.down(); }); }); pos = rotAdd([(rt - lt)*kerning, 0], pos, h); } }); return rotAdd([0, 48*scale], pos, h); } } const dat = ('br>eoj^jl<jqirjskrjq>brf^fe<n^ne>`ukZdz<qZjz<dgrg<cmqm>`thZhw<lZlw<qao_l^h^e_caccdeefg'+ 'gmiojpkqmqporlshsercp>^vs^as<f^h`hbgdeeceacaab_d^f^h_k`n`q_s^<olmmlolqnspsrrspsnqlol>]wtgtfsereqfph'+ 'nmlpjrhsdsbraq`o`makbjifjekckaj_h^f_eaecffhimporqssstrtq>eoj`i_j^k_kajcid>cqnZl\\j_hcghglhqjulxnz>c'+ 'qfZh\\j_lcmhmllqjuhxfz>brjdjp<egom<ogem>]wjajs<ajsj>fnkojpiojnkokqis>]wajsj>fnjniojpkojn>_usZaz>`ti'+ '^f_dbcgcjdofrisksnrpoqjqgpbn_k^i^>`tfbhak^ks>`tdcdbe`f_h^l^n_o`pbpdofmicsqs>`te^p^jfmfogphqkqmppnrk'+ 'shserdqco>`tm^clrl<m^ms>`to^e^dgefhekenfphqkqmppnrkshserdqco>`tpao_l^j^g_ebdgdlepgrjsksnrppqmqlping'+ 'kfjfggeidl>`tq^gs<c^q^>`th^e_dadceegfkgnhpjqlqopqorlshserdqcocldjfhigmfoepcpao_l^h^>`tpeohmjjkikfjd'+ 'hcecddaf_i^j^m_oapepjoomrjshserdp>fnjgihjikhjg<jniojpkojn>fnjgihjikhjg<kojpiojnkokqis>^vrabjrs>]wag'+ 'sg<amsm>^vbarjbs>asdcdbe`f_h^l^n_o`pbpdofngjijl<jqirjskrjq>]xofndlcicgdfeehekfmhnknmmnk<icgefhfkgmh'+ 'n<ocnknmpnrntluiugtdsbq`o_l^i^f_d`bbad`g`jambodqfrislsorqqrp<pcokompn>asj^bs<j^rs<elol>_tc^cs<c^l^o'+ '_p`qbqdpfoglh<chlhoipjqlqopqorlscs>`urcqao_m^i^g_eadccfckdnepgrismsorqprn>_tc^cs<c^j^m_oapcqfqkpnop'+ 'mrjscs>`sd^ds<d^q^<dhlh<dsqs>`rd^ds<d^q^<dhlh>`urcqao_m^i^g_eadccfckdnepgrismsorqprnrk<mkrk>_uc^cs<'+ 'q^qs<chqh>fnj^js>brn^nnmqlrjshsfreqdndl>_tc^cs<q^cl<hgqs>`qd^ds<dsps>^vb^bs<b^js<r^js<r^rs>_uc^cs<c'+ '^qs<q^qs>_uh^f_daccbfbkcndpfrhslsnrppqnrkrfqcpan_l^h^>_tc^cs<c^l^o_p`qbqepgohlici>_uh^f_daccbfbkcnd'+ 'pfrhslsnrppqnrkrfqcpan_l^h^<koqu>_tc^cs<c^l^o_p`qbqdpfoglhch<jhqs>`tqao_l^h^e_caccdeefggmiojpkqmqpo'+ 'rlshsercp>brj^js<c^q^>_uc^cmdpfrisksnrppqmq^>asb^js<r^js>^v`^es<j^es<j^os<t^os>`tc^qs<q^cs>asb^jhjs'+ '<r^jh>`tq^cs<c^q^<csqs>cqgZgz<hZhz<gZnZ<gznz>cqc^qv>cqlZlz<mZmz<fZmZ<fzmz>brj\\bj<j\\rj>asazsz>fnkc'+ 'ieigjhkgjfig>atpeps<phnfleiegfehdkdmepgrislsnrpp>`sd^ds<dhffhekemfohpkpmopmrkshsfrdp>asphnfleiegfeh'+ 'dkdmepgrislsnrpp>atp^ps<phnfleiegfehdkdmepgrislsnrpp>asdkpkpiognfleiegfehdkdmepgrislsnrpp>eqo^m^k_j'+ 'bjs<gene>atpepuoxnylzizgy<phnfleiegfehdkdmepgrislsnrpp>ate^es<eihfjemeofpips>fni^j_k^j]i^<jejs>eoj^'+ 'k_l^k]j^<kekvjyhzfz>are^es<oeeo<ikps>fnj^js>[y_e_s<_ibfdegeifjijs<jimfoeretfuius>ateees<eihfjemeofp'+ 'ips>atiegfehdkdmepgrislsnrppqmqkphnfleie>`sdedz<dhffhekemfohpkpmopmrkshsfrdp>atpepz<phnfleiegfehdkd'+ 'mepgrislsnrpp>cpgegs<gkhhjfleoe>bsphofleieffehfjhkmlompopporlsisfrep>eqj^jokrmsos<gene>ateeeofrhsks'+ 'mrpo<peps>brdejs<pejs>_ubefs<jefs<jens<rens>bseeps<pees>brdejs<pejshwfydzcz>bspees<eepe<esps>cqlZj['+ 'i\\h^h`ibjckekgii<j[i]i_jakbldlfkhgjkllnlpkrjsiuiwjy<ikkmkojqirhthvixjylz>fnjZjz>cqhZj[k\\l^l`kbjci'+ 'eigki<j[k]k_jaibhdhfihmjilhnhpirjskukwjy<kkimiojqkrltlvkxjyhz>^vamakbhdgfghhlknlplrksi<akbidhfhhill'+ 'nmpmrlsisg>brb^bscsc^d^dsese^f^fsgsg^h^hsisi^j^jsksk^l^lsmsm^n^nsoso^p^psqsq^r^rs').split('>').map( r=> { return [r.charCodeAt(0)-106,r.charCodeAt(1)-106, r.substr(2).split('<').map(a => {const ret = []; for (let i=0; i<a.length; i+=2) {ret.push(a.substr(i, 2).split('').map(b => b.charCodeAt(0) -106));} return ret; })]; }); return new Text(); }