Angel wings

Zhukovsky airfoil shapes via Joukowsky transform

```Canvas.setpenopacity(-0.5);

const t = new Turtle();

function airfoil(cx, cy, n) {
const i = []
const j = []

let r = Math.sqrt((cx - 1)**2 + cy**2)
let dphi = 2 * Math.PI / n

for (let k = 0, phi = -Math.PI; k <= n; k++, phi += dphi) {
let x = cx + r * Math.cos(phi)
let y = cy + r * Math.sin(phi)

i[k] = x * (1 + 1 / (x**2 + y**2))
j[k] = y * (1 - 1 / (x**2 + y**2))
}

return [i, j]
}

function draw_airfoil(i, j, Rw, phi, Rc, flip) {
let i_min = Math.min(...i)

let x0 = (i[0] - i_min) * Rw
let y0 = j[0] * Rw

let sx0 = Rc * Math.cos(phi)
let sy0 = Rc * Math.sin(phi)

t.jump(sx0, sy0)

for (let ind = 0; ind < i.length; ind++) {
let x = (i[ind] - i_min) * Rw;
let y = j[ind] * Rw;

if (flip) {
[x, y] = [x * Math.cos(phi) + y * Math.sin(phi), -x * Math.sin(phi) + y * Math.cos(phi)]

t.goto(sx0 + x, sy0 - y)
}
else {
[x, y] = [x * Math.cos(phi) - y * Math.sin(phi), x * Math.sin(phi) + y * Math.cos(phi)]

t.goto(sx0 + x, sy0 + y)
}
}
}

const Rw = 15
const Rc = 16

// eye

t.jump(-Rc, 0)
t.seth(-90)
t.circle(Rc)

t.jump(-Rc, 0)
t.seth(-45)
t.circle(Rc * Math.sqrt(2), 90)

t.jump(-Rc, 0)
t.seth(-60)
t.circle(Rc * 2 /  Math.sqrt(3), 120)

t.jump(Rc, 0)
t.seth(135)
t.circle(Rc * Math.sqrt(2), 90)

t.jump(Rc, 0)
t.seth(120)
t.circle(Rc * 2 /  Math.sqrt(3), 120)

for (let r = 3; r <= 6; r += 0.25) {
t.jump(-r, 0)
t.seth(-90)
t.circle(r)
}

// wings

const N1 = 20

for (let k = 0; k < N1; k++) {
let ci = -0.15;
let cj = -0.1 - 0.45 * k / (N1 - 1);

[i, j] = airfoil(ci, cj, 100)

let phi1 = -Math.PI * (-0.1 + 0.2 * (1 - k / (N1 - 1)))
let phi2 = -Math.PI - phi1

draw_airfoil(i, j, Rw, phi1, Rc, false)
draw_airfoil(i, j, Rw, phi2, Rc, true)
}

const N2 = 20
const Rw2 = Rw * 0.8

for (let k = 0; k < N2; k++) {
let ci = -0.15;
let cj = -0.2 - 0.65 * k / (N2 - 1);

[i, j] = airfoil(ci, cj, 100)

let phi1 = Math.PI * (0.2 + 0.25 * k / (N2 - 1))
let phi2 = -Math.PI - phi1

draw_airfoil(i, j, Rw2, phi1, Rc, false)
draw_airfoil(i, j, Rw2, phi2, Rc, true)
}

const N3 = 20
const Rw3 = Rw * 1.2

for (let k = 0; k < N3; k++) {
let ci = -0.15;
let cj = -0.1 - 0.15 * (1 - k / (N3 - 1));

[i, j] = airfoil(ci, cj, 100)

let phi1 = -Math.PI * (0.3 + 0.15 * (1 - k / (N3 - 1)))
let phi2 = -Math.PI - phi1

draw_airfoil(i, j, Rw3, phi1, Rc, true)
draw_airfoil(i, j, Rw3, phi2, Rc, false)
}```