## Spiral

*This post is part of a course on geometric modeling at the Summer Liberal Arts Institute for Computer Science held at Carleton College in 2021.*

To make a torus, you took a circle and rotated it around the y-axis. What would happen if on each step of the rotation you also tugged the rotated circle upward? And then kept on going instead of stopping upon reaching a complete circuit? The shape that you would end up with is a spiral. Let’s make one.

### Draw

On your paper, draw the y-axis. To its right, draw a circle with a few points spread around the perimeter. This circle holds the set of seed points of your spiral. You will revolve this circle around the y-axis and pull it upward to form your spiral.

Draw a similar circle to the left of the y-axis, but draw if upward a bit. Connect the two circles to each other to form a half revolution of the spiral.

### Function

Write a function named `generateSpiral`

. Have it accept these parameters:

- An integer
`nlatitudes`

that specifies the number of points that appear on the circular cross section of the spiral. - An integer
`nsteps`

that specifies the number of circular cross sections that will appear revolved around the spiral. - The
`majorRadius`

of the spiral, which is the distance between the center of the inner void and the center of the tube. - The
`minorRadius`

of the spiral, which is the radius of the circular cross section. - The
`radiansPerStep`

, which measures the amount of rotation between each circular cross section. - The
`liftPerStep`

, which measures the amount of upward tugging between each circular cross section.

Copy your code from `generateTorus`

into this function. Much of it will be the same.

### Positions

The seed positions of the spiral are identical to the seed positions of the torus. However, the code that generates `positions`

does need to be adapted. First, your loop is measured in steps instead of longitude indexes. Second, you need to not only rotate the seed points, but also shift or *translate* them upward. Create one matrix that both rotates and translates like this:

```
const rotate = new THREE.Matrix4().makeRotationY(totalRadians);
const translate = new THREE.Matrix4().makeTranslation(0, totalLift, 0);
const matrix = rotate.multiply(translate);
```

Compute `totalRadians`

and `totalLift`

according to the step you are on in the loop.

When you render your scene after making these changes, you should see a spiral.

### Triangles

The topology of the torus means that the surface wraps back around both vertically and horizontally. The spiral does not wrap horizontally. Adjust your loop so that the last circle is not connected back to the first circle.