November 19, 2015

Nardove had an amazing Jellyfish animation on his website. And this is a note describing how it works.

The shape of a jellyfish can be described using two half ellipses. Above the y axis, draw a half ellipse with vertices on x axis to be 0.7, and on y axis to be 1. Below the y axis, draw a half ellipse with vertices on x axis to be 0.7, and on y axis to be 0.4. Now you have already got a jellyfish without the tentacles. We let `x` and `y` be the points of a jellyfish, then the equations can be expressed as:

``````x = cos(theta) * r * 0.7

y = sin(theta) * r * 0.4 if theta > 0 and theta < pi
y = sin(theta) * r * 1 otherwise
``````

We would also want the shape to expand and contract. So we use the time `t` to calculate a seed. The seed is then feed to a `sin` function. We let `nx` and `ny` be the normals of a point, that is:

``````nx^2 + ny^2 = 1
nx * a = x
ny * a = y
``````

Here we can define `ecx` and `ecy` together with the expansion-contraction effect:

``````ecx = x + nx * sin(-0.2t-0.0375y)
ecy = y + ny * sin(-0.2t-0.0375y)
``````

The tentacles are just stick around the body of a jellyfish. The algorithm works like this. We represent the tentacles using separate dots. There are usually around 7 dots for one tentacle. The first dot is always stick on the jellyfish body. For each update, we update the second dot with y value plus one to simulate the gravity.

``````y1' = y1 + 1
``````

For all other dots (`x2`, `y2`), we update it using the past two dots (`x1`, `y1`) and (`x0`, `y0`). We first calculate the distance `len` between (`x2`, `y2`) and (`x0`, `y0`). The update algorithm can be written as follows:

``````x2 = x1 + (x2 - x0) * (segmentLength / len)
y2 = y1 + (y2 - y0) * (segmentLEngth / len)
``````

### Next: Hack the Ship's Internet

Adventure of hacking for Internet access on a ship.