Zhukovsky airfoil shapes via Joukowsky transform
Log in to post a comment.
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)
}