A work in progress
// Based on the Youtube The Amazing Heptadecagon (17-gon) - Numberphile
// youtu.be/87uo2tprsl8
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax
// Based on the Youtube The Amazing Heptadecagon (17-gon) - Numberphile
// https://youtu.be/87uo2TPrsl8
// Released under the MIT licence
// https://mit-license.org/
// you can use this for commercial gain if you like eg you can sell artworks with this image.
Canvas.setpenopacity(1);
// a simple way to save the current location
// of the turtle so we can jump back to a specific position
var xPos = [];
var yPos = [];
// Global code will be evaluated once.
const turtle = new Turtle();
turtle.pendown();
const step = 20; //min=0 max=25 step=1
const scale = 80; // //min=0 max=150 step=1
const angle = 45; //min=0 max=360 step=1
const start = 0; //min=0 max=360 step=1
const extent = 7; //min=0 max=36 step=1
const X = 0; //min=-365 max=365 step=1
const Y = 0; //min=-360 max=365 step=1
const A = 0; //min=-100 max=100 step=1
const B = 0; //min=-100 max=100 step=1
const R = 0; //min=0 max=300 step=1
const guidelines = 1; //min=0 max=1 step=1 (No, Yes)
const nudge = 0.26; //min=0 max=5 step=0.01
// outer circle
if(guidelines == 1){
centeredCircle(0,0, scale,360)
}
// diameter
// https://youtu.be/87uo2TPrsl8?t=252
if(step>=1 && guidelines == 1){
turtle.jump(-scale,0);
turtle.pendown();
turtle.setheading(0);
turtle.forward(scale *2)
}
//Perpendicular bisector of the diameter.
// https://youtu.be/87uo2TPrsl8?t=263
if(step >= 2 && guidelines == 1){
// lower x
drawArc(127, 41, 7, -90 , 0);
drawArc(127, 132, 7, 90 , 0);
}
if(step >= 3 && guidelines == 1){
// upper x
drawArc(127, 312, 7, -90 , 0);
drawArc(127, 221, 7, 90 , 0);
}
if(step >= 4 && guidelines == 1){
//Perpendicular bisector of the diameter.
turtle.jump(0,98);
turtle.pendown();
turtle.setheading(-90);
turtle.goto(0,-98)
}
// divide the lower 1/2 of the bisector into 1/4's
// https://youtu.be/87uo2TPrsl8?t=278
if(step >= 5 && guidelines == 1){
turtle.jump(0,scale * 0.25);
turtle.setheading(0);
turtle.forward(5);
turtle.pendown();
turtle.back(10);
}
if(step >= 6 && guidelines == 1){
turtle.jump(0,scale* 0.5);
turtle.setheading(0);
turtle.forward(5);
turtle.pendown();
turtle.back(10);
}
if(step >= 7 && guidelines == 1){
turtle.jump(0,scale* 0.75);
turtle.setheading(0);
turtle.forward(5);
turtle.pendown();
turtle.back(10);
}
// Line from edge of circle through first 1/4 mark on lower bisector
// https://youtu.be/87uo2TPrsl8?t=305
if(step >= 8 && guidelines == 1){
turtle.jump(scale,0);
turtle.pendown();
turtle.goto(0,scale * 0.25);
turtle.setheading(166);
turtle.forward(scale * 0.75);
}
// https://youtu.be/87uo2TPrsl8?t=310
// Arc with radius 1/8 scale
if(step >= 9 && guidelines == 1){
drawArc(scale * 0.5, 346, 0, 0 , scale * 0.25);
// save starting position for later reference (location 0)
xPos.push(turtle.x());
yPos.push(turtle.y());
drawArc(scale * 0.5, 346, 180, 0 , scale * 0.25);
}
// Draw lins inside 180 degree arc
if(step >= 10 && guidelines == 1){
// save the current turtle position for use in step 14
// save starting position for later reference (location 1)
xPos.push(turtle.x());
yPos.push(turtle.y());
turtle.goto(0,scale * 0.75);
}
// Draw lins inside 180 degree arc
if(step >= 11 && guidelines == 1){
turtle.goto(0,scale * 0.75);
turtle.goto(xPos[0], yPos[0]);
}
// Draw and store as [2] & [3] the 1/2 and 3/4 ticks on right line inside 180 degree arc
// calculate the distance between xPos[0],yPos[0] and (0,scale* 0.75);
if(step >= 12 && guidelines == 1){
var distance = Math.sqrt((Math.pow(xPos[0] - 0,2))+(Math.pow(yPos[0] - scale* 0.75,2)));
// Use drawArc to find the location of the tick mark
// save location and then jump to that location and
// draw the tick
drawArc(distance * 0.5, 128, 0, xPos[0],yPos[0]);
xPos.push(turtle.x()); // xPos[2]
yPos.push(turtle.y()); // yPos[2]
drawArc(distance * 0.75, 128, 0, xPos[0],yPos[0]);
xPos.push(turtle.x()); // xPos[3]
yPos.push(turtle.y()); // yPos[3]
// draw the tick marks
turtle.jump(xPos[2],yPos[2]);
turtle.setheading(39);
turtle.penup;
turtle.forward(4); // consider scaling this tick size
turtle.pendown;
turtle.back(8)
}
if(step >= 13 && guidelines == 1){
// draw the tick marks
turtle.jump(xPos[3],yPos[3]);
turtle.setheading(39);
turtle.penup;
turtle.forward(4);
turtle.pendown;
turtle.back(8)
}
// Draw and store as [4] & [5] the 1/2 and 3/4 ticks on left line inside 180 degree arc
// calculate the distance between xPos[1],yPos[1] and (0,scale* 0.75);
if(step >= 14 && guidelines == 1){
var distance = pointDistance(xPos[1],yPos[1],0,scale* 0.75);
// Use drawArc to find the location of the tick mark
// save location and then jump to that location and
// draw the tick
drawArc(distance * 0.5, 38, 0, xPos[1],yPos[1]);
xPos.push(turtle.x()); // xPos[4]
yPos.push(turtle.y()); // yPos[4]
drawArc(distance * 0.75, 38, 0, xPos[1],yPos[1]);
xPos.push(turtle.x()); // xPos[5]
yPos.push(turtle.y()); // yPos[5]
// draw the tick marks
turtle.jump(xPos[4],yPos[4]);
turtle.setheading(39 + 90);
turtle.penup;
turtle.forward(4); // consider scaling this tick size
turtle.pendown;
turtle.back(8)
}
if(step >= 15 && guidelines == 1){
// draw the tick marks
turtle.jump(xPos[5],yPos[5]);
turtle.setheading(39 + 90);
turtle.penup;
turtle.forward(4); // consider scaling this tick size
turtle.pendown;
turtle.back(8)
}
// https://youtu.be/87uo2TPrsl8?t=381
if(step >= 16 && guidelines == 1){
turtle.jump(xPos[3],yPos[3]);
turtle.goto(0,scale * 0.25);
turtle.setheading(70.46 + 180); // https://www.omnicalculator.com/math/right-triangle-side-angle
turtle.forward(scale * 0.4); // consider scaling this size
// dist2 = pointDistance(xPos[3],yPos[3],0,scale* 0.25);
// console.log("dist2:");
// console.log(dist2);
}
if(step >= 17 && guidelines == 1){
// draw tick save position
turtle.jump(-7.098,0);
xPos.push(turtle.x()); // xPos[6]
yPos.push(turtle.y()); // yPos[6]
turtle.setheading(90);
turtle.penup;
turtle.forward(4); // consider scaling this tick size
turtle.pendown;
turtle.back(8)
}
if(step >= 18 && guidelines == 1){
turtle.jump(xPos[5],yPos[5]);
turtle.goto(0,scale * 0.25);
turtle.goto(0,scale * 0.25);
turtle.setheading(16.68 + 90 + 180); // https://www.omnicalculator.com/math/right-triangle-side-angle
turtle.forward(scale * 0.26); // consider scaling this size
xPos.push(turtle.x()); // xPos[7]
yPos.push(turtle.y()); // yPos[7]
// centeredCircle(xPos[7],yPos[7], 2,360)
}
// https://youtu.be/87uo2TPrsl8?t=403
if(step >= 19 && guidelines == 1){
turtle.jump(40-7.098,0); // half the distance between the outer curcumfrance and the point xPos[6],yPos[6]
xPos.push(turtle.x()); // xPos[8]
yPos.push(turtle.y()); // yPos[8]
turtle.setheading(90);
turtle.penup;
turtle.pendown;
turtle.forward(2); // consider scaling this tick size
turtle.back(4)
drawArc( 40 + (7.098 /2), 180, 180, 40 - (7.098 /2),0);
}
// https://youtu.be/87uo2TPrsl8?t=436
if(step >= 20 && guidelines == 1){
console.log("xPos[7]:");
console.log(xPos[7]);
console.log("xPos[8]:");
console.log(xPos[8]);
drawArc(5.97, 180, 180, 0,0);
// https://www.varsitytutors.com/intermediate_geometry-help/how-to-find-the-length-of-a-chord
// Chord length using perpendicular distance from the center = 2 × √(r2 − d2).
// https://www.cuemath.com/geometry/Chords-of-a-circle/
}
if(step >= 21 && guidelines == 1){
centeredCircle(xPos[8],yPos[8], 2,360);
}
if(step >= 22 && guidelines == 1){
centeredCircle(0,0, 2,360);
}
if(step >= 23 && guidelines == 1){
centeredCircle(0,0, 2,360); // origin
// https://www.varsitytutors.com/intermediate_geometry-help/how-to-find-the-length-of-a-chord
// Chord length using perpendicular distance from the center = 2 × √(r2 − d2).
// https://www.cuemath.com/geometry/Chords-of-a-circle/
let d = pointDistance(0, 0, xPos[8], 0);
let d2 = xPos[8] * xPos[8];
let r = 40 + (7.098 /2);
let r2 = r * r;
let chordLength = 2 * Math.sqrt(r2 - d2);
centeredCircle(0,-chordLength/2, 2,360);
centeredCircle(xPos[8],-r, 2,360) // radius
centeredCircle(xPos[8]-r,0, 2,360) // radius
centeredCircle(xPos[8]+r,0, 2,360) // radius
console.log("d:");
console.log(d);
console.log("xPos[8]:");
console.log(xPos[8]);
}
// -------------------------------------------------------------------
function centeredCircle(x,y, radius,ext) {
turtle.setheading(0);
turtle.jump(x,y-radius);
turtle.circle(radius, ext);
}
// from Rotated Arcs by nftbiker
// https://turtletoy.net/turtle/4f7a575cbf
function drawArc(radius, startAngle, endAngle, X, Y) {
let start_angle = startAngle;
let draw_angle = endAngle;
let start = {
x: Math.cos(start_angle*Math.PI/180)*radius,
y: Math.sin(start_angle*Math.PI/180)*radius
}
turtle.jump(start.x + X, start.y + Y)
for (i=start_angle; i<=start_angle+draw_angle; i+=1) {
let x = Math.cos(i*Math.PI/180)*radius
let y = Math.sin(i*Math.PI/180)*radius
turtle.goto(x + X, y + Y)
}
}
function pointDistance(x1, y1, x2, y2) {
return Math.hypot(x1 - x2, y1 - y2);
}