Leminscate of Bernoulii

Arjen Markus (25 november 2020) It is a classic, elegant, curve, which resembles a figure eight: the lemniscate. You can find a description on MathWorld or MacTutor and it was Jacob Bernoulli who named it in 1694.

For the mathematically inclined, here are two equations that describe the curve:

In cartesian coordinates:

   (x**2 + y**2) ** 2 = a**2 (x**2 - y**2)

and in polar coordinates:

   r**2 = a**2 cos(2 theta)

But rather than use either of these equations directly, it is more artistic (in my personal view ;)) to use the construction via the envelope of circles:

Lemniscate - picture

The construction is simple:

  • Draw a rectangular hyperbola
  • Then draw circles with the centres on the hyperbola (both branches) and passing through the origin

The envelope of the circles is the lemniscate.

Here is the code I used for the picture:

# lemniscate.tcl --
#     Draw a lemniscate of Bernoulli via the envelope of cicles on a hyperbola
#     Note:
#     Draw in the square x: -2 to 2, y: -2 to 2 and then scale the result to fit the
#     canvas.
pack [canvas .c -width 800 -height 800]

# Draw the hyperbola: x**2 - y**2 = 1

set dy [expr {4.0 / 40.0}]
for {set n -20} {$n <= 20} {incr n} {
    if { $n > -20 } {
        set xp $x
        set yp $y

    set y [expr {$dy * $n}]
    set x [expr {sqrt($y**2 + 1.0)}]

    if { $n > -20 } {
        set xpm [expr {-$xp}]
        set xm  [expr {-$x}]
        set ypm [expr {-$yp}]
        set ym  [expr {-$y}]

        .c create line $xp  $yp  $x   $y   -width 2 -fill red
        .c create line $xpm $yp  $xm  $y   -width 2 -fill red
        .c create line $xp  $ypm $x   $ym  -width 2 -fill red
        .c create line $xpm $ypm $xm  $ym  -width 2 -fill red

# Draw the circles ...

for {set n -20} {$n <= 20} {incr n} {
    set y [expr {$dy * $n}]
    set x [expr {sqrt($y**2 + 1.0)}]

    # This is the centre, now determine the bounding box:
    # the circle should pass through the origin
    set radius [expr {hypot($x,$y)}]

    set x1min   [expr { $x - $radius}]
    set x1max   [expr { $x + $radius}]
    set y1min   [expr { $y - $radius}]
    set y1max   [expr { $y + $radius}]

    set x2min   [expr {-$x - $radius}]
    set x2max   [expr {-$x + $radius}]
    set y2min   [expr { $y - $radius}]
    set y2max   [expr { $y + $radius}]

    set x3min   [expr {-$x - $radius}]
    set x3max   [expr {-$x + $radius}]
    set y3min   [expr {-$y - $radius}]
    set y3max   [expr {-$y + $radius}]

    set x4min   [expr { $x - $radius}]
    set x4max   [expr { $x + $radius}]
    set y4min   [expr {-$y - $radius}]
    set y4max   [expr {-$y + $radius}]

    .c create oval $x1min $y1min $x1max $y1max
    .c create oval $x2min $y2min $x2max $y2max
    .c create oval $x3min $y3min $x3max $y3max
    .c create oval $x4min $y4min $x4max $y4max

.c scale all 0 0 180 180
.c move  all 400 400

Note: to make the calculation of the coordinates easy I simply used the geometrical coordinate system and relied on the canvas to do the transformation to the pixel coordinates.

anonymous - 2020-11-28 11:37:14

There must be Lemniscate of Bernoulli in the title...

arjen - 2020-11-30 09:43:06

Indeed a typo! I do not know how to correct a page title though.

anonymous - 2020-11-30 11:45:33

Really and truly, there would be nice to have the "Rename the page (by its author)" in the wiki menu.