Monocurl Essays
Series Download

The unit circle: sine and cosine as coordinates

Sine and cosine start as ratios in a right triangle, which stops at 90°. Placing the triangle in a circle of radius 1 extends them to every angle.

21 min·High school·

AssumesSimilar triangles and why area grows as the squareThe Pythagorean theorem: a proof you can see

A point turns around a circle of radius 1. Its horizontal position is the cosine of the angle turned and its height is the sine. The sweep ends at 120°, where the cosine is $-0.50$ and the sine is $0.87$.
Monocurl source
let O = [-1.55, 0, 0]
let R = 1.85
mesh base = [CircleAxes(O, R), ArcPath(O, R, 0, TAU)]
mesh labels = [
    center{[2.4, 1.6, 0]} Note("angle in degrees", 0.74),
    Name("x = \cos\theta", [2.4, 0.45, 0], 0.9, AZURE),
    Name("y = \sin\theta", [2.4, -0.7, 0], 0.9, EMBER)
]
let Turn = |deg| {
    let th = rad(deg)
    return [
        Wedge(O, 0, th, SLATE, 0.42),
        Legs(O, R, th),
        center{[2.4, 1.1, 0]} scale{1.5} color{INK} Number(deg, 0),
        center{[2.4, -0.05, 0]} scale{1.5} color{AZURE} Number(snap(cos(th)), 2),
        center{[2.4, -1.2, 0]} scale{1.5} color{EMBER} Number(snap(sin(th)), 2)
    ]
}
mesh turn = Turn(deg: 3)

slide "turn"
    play Wait(0.5)
    turn.deg = 360
    play Lerp(6, [&turn], linear)
    turn = Turn(deg: 3)
    play Set([&turn])
    turn.deg = 120
    play Lerp(2, [&turn])
    play Wait(1.6)

Uses the shared definitions for this lesson's figures.

Type $\sin 120°$ into a calculator and it answers $0.8660$ without complaint. Yet sine, as most people first meet it, is “opposite over hypotenuse” in a right triangle containing the angle, and no right triangle contains an angle of 120°. The angles of a triangle add to 180°, the right angle uses 90° of that, and so each of the other two is less than 90°.

So the calculator is working from some other definition, one that agrees with the triangle for small angles and keeps going where the triangle gives out. You might try to guess it. Perhaps $\sin 120° = \sin 90° + \sin 30° = 1 + 0.5 = 1.5$? The calculator says $0.8660$, so that guess is wrong, and we will see later that a sine can never exceed 1. To find the real definition we go back to the triangle and look at what it is measuring.

Sine and cosine in a right triangle

Take a right triangle and pick one of its two acute angles, $\theta$. The side across from $\theta$ is the opposite side, the leg touching $\theta$ is the adjacent side, and the longest side, across from the right angle, is the hypotenuse. The triangle definitions are

$$ \sin\theta = \frac{\text{opposite}}{\text{hypotenuse}}, \qquad \cos\theta = \frac{\text{adjacent}}{\text{hypotenuse}}. $$

These definitions only make sense if the ratio is the same in every right triangle with the angle $\theta$, large or small. Here is that fact on one angle.

Three right triangles that share a 30° angle, with hypotenuses 1, 2 and 3. Their opposite sides are 0.5, 1 and 1.5, so opposite divided by hypotenuse is 0.5 in each.
Three right triangles that share a 30° angle, with hypotenuses 1, 2 and 3. Their opposite sides are 0.5, 1 and 1.5, so opposite divided by hypotenuse is 0.5 in each.
Monocurl source
let V = [-3.45, -1.8, 0]
let U = 2.3
let A = rad(30)
mesh fills = Region([V, V + [3 * U * cos(A), 0, 0], V + 3 * U * dir(A)], tint(SLATE, 0.12))
mesh lines = block {
    . Wedge(V, 0, A, SLATE, 0.8)
    . Seg(V, V + [3 * U * cos(A), 0, 0], AZURE, 4)
    . Seg(V, V + 3 * U * dir(A), INK, 4)
    for (k in [1, 2, 3]) {
        let top = V + k * U * dir(A)
        . Seg([top[0], V[1], 0], top, EMBER, 5)
        . Pt(top, INK, 0.09)
        . Name(to_string(k), top + [-0.2, 0.32, 0], 0.9)
        . Name(to_string(k * sin(A), 1), [top[0] + 0.4, (V[1] + top[1]) / 2, 0], 0.9, EMBER)
    }
    . Name("30^\circ", V + 1.25 * dir(A / 2), 0.78, SLATE)
}
mesh ratio = [
    center{[-1.9, 1.65, 0]} Note("opposite ÷ hypotenuse", 0.76),
    Name(str_join([
        "\frac{", to_string(sin(A), 1), "}{1} = \frac{", to_string(2 * sin(A), 1), "}{2} = \frac{",
        to_string(3 * sin(A), 1), "}{3} = ", to_string(sin(A), 1)
    ]), [-1.9, 0.95, 0], 0.9)
]

Uses the shared definitions for this lesson's figures.

The three triangles have the same three angles, 30°, 60° and 90°. Triangles with the same angles are similar, meaning each is a scaled copy of the others, and scaling multiplies every side by the same factor. So when the hypotenuse doubles, the opposite side doubles too, and their ratio does not change. That holds for any angle, which is why $\sin\theta$ is a property of the angle alone.

For 30° we can also say why the ratio is exactly $\frac{1}{2}$. Two copies of the triangle placed back to back along the adjacent side form a triangle whose angles are all 60°, an equilateral triangle. Its side is the hypotenuse, and the two opposite sides together make up one side. So the opposite side is half the hypotenuse, and $\sin 30° = \frac{1}{2}$.

The adjacent side comes from the Pythagorean theorem, which says the squares of the two legs add up to the square of the hypotenuse. With hypotenuse 1 and opposite side $\frac{1}{2}$, the adjacent side is $\sqrt{1 - \frac{1}{4}} = \frac{\sqrt{3}}{2} \approx 0.8660$, so $\cos 30° = \frac{\sqrt 3}{2}$. Those are the calculator’s digits for $\sin 120°$, which is a hint worth keeping in mind.

Since the size of the triangle does not matter, choose the most convenient size: make the hypotenuse 1. Dividing by 1 changes nothing, so in such a triangle $\sin\theta$ is the length of the opposite side and $\cos\theta$ is the length of the adjacent side.

Pause and try

A right triangle has a 45° angle and hypotenuse 1. Find the lengths of its two legs exactly, and so find $\sin 45°$ and $\cos 45°$.

Show answerHide answer

The third angle is $180° - 90° - 45° = 45°$, so the triangle has two equal angles and therefore two equal legs. Call each leg $x$. By the Pythagorean theorem $x^2 + x^2 = 1$, so $x^2 = \frac{1}{2}$ and $x = \frac{1}{\sqrt 2} = \frac{\sqrt 2}{2} \approx 0.7071$. Hence $\sin 45° = \cos 45° = \frac{\sqrt 2}{2}$.

The 60° angle uses the 30° triangle again, viewed from its other acute corner, where the roles of opposite and adjacent swap. That gives three angles with exact values.

$\theta$30°45°60°
$\cos\theta$$\frac{\sqrt 3}{2} \approx 0.866$$\frac{\sqrt 2}{2} \approx 0.707$$\frac{1}{2}$
$\sin\theta$$\frac{1}{2}$$\frac{\sqrt 2}{2} \approx 0.707$$\frac{\sqrt 3}{2} \approx 0.866$

The triangle inside a circle

A triangle with hypotenuse 1 still stops at 90°. What rescues us is a change of viewpoint about what the two legs are. Step through the figure.

  1. A right triangle with a 35° angle and hypotenuse 1. Its adjacent leg has length cos 35° ≈ 0.82 and its opposite leg has length sin 35° ≈ 0.57.
  2. Lay it on a coordinate grid with the angle at the origin and the adjacent leg along the x axis. The far corner is 0.82 across and 0.57 up: it is the point (cos 35°, sin 35°).
  3. Change the angle. The far corner moves, but the hypotenuse keeps it at distance 1 from the origin, so it travels along a circle of radius 1.
  4. Keep turning. At 120° there is no right triangle with that angle, but the point is still there and still has coordinates: −0.50 across and 0.87 up.
A right triangle with hypotenuse 1 is laid on a coordinate grid. Its legs become the coordinates of its far corner, the corner traces a circle of radius 1 as the angle changes, and the corner keeps its coordinates after the angle passes 90°.
Monocurl source
let O = [-1.55, 0, 0]
let R = 1.85
let Tri = |deg| {
    let th = rad(deg)
    return [
        Wedge(O, 0, th, SLATE, 0.42),
        Legs(O, R, th),
        center{[2.4, 1.1, 0]} scale{1.5} color{INK} Number(deg, 0),
        center{[2.4, -0.05, 0]} scale{1.5} color{AZURE} Number(snap(cos(th)), 2),
        center{[2.4, -1.2, 0]} scale{1.5} color{EMBER} Number(snap(sin(th)), 2)
    ]
}
let Sweep = |e| ArcPath(O, R, 0, e)
mesh ghost = [
    ArcPath(O, R, 0, TAU, MIST, 2),
    Seg([O[0] - R - 0.3, O[1], 0], [O[0] + R + 0.3, O[1], 0], MIST, 2),
    Seg([O[0], O[1] - R - 0.2, 0], [O[0], O[1] + R + 0.2, 0], MIST, 2)
]
mesh axes = []
mesh arc = []
mesh tri = Tri(deg: 35)
mesh labels = []
mesh hyp = Name("1", pol(O, R / 2, rad(35)) + [-0.18, 0.24, 0], 0.8)

slide "A right triangle with a 35° angle and hypotenuse 1. Its adjacent leg has length cos 35° ≈ 0.82 and its opposite leg has length sin 35° ≈ 0.57."
    labels = [
        center{[2.4, 1.6, 0]} Note("angle in degrees", 0.74),
        center{[2.4, 0.45, 0]} Cap("adjacent leg", 0.76, AZURE),
        center{[2.4, -0.7, 0]} Cap("opposite leg", 0.76, EMBER)
    ]
    play Fade(0.6, [&labels])

slide "Lay it on a coordinate grid with the angle at the origin and the adjacent leg along the x axis. The far corner is 0.82 across and 0.57 up: it is the point (cos 35°, sin 35°)."
    axes = CircleAxes(O, R)
    labels = []
    play Fade(0.5)
    labels = [
        center{[2.4, 1.6, 0]} Note("angle in degrees", 0.74),
        Name("x = \cos\theta", [2.4, 0.45, 0], 0.9, AZURE),
        Name("y = \sin\theta", [2.4, -0.7, 0], 0.9, EMBER)
    ]
    play Fade(0.5, [&labels])

slide "Change the angle. The far corner moves, but the hypotenuse keeps it at distance 1 from the origin, so it travels along a circle of radius 1."
    hyp = []
    arc = Sweep(e: 0.05)
    play Fade(0.2, [&hyp, &arc])
    tri.deg = 85
    arc.e = PI / 2
    play [Lerp(1.4, [&tri]), Lerp(1.4, [&arc])]
    tri.deg = 5
    play Lerp(1.8, [&tri])
    tri.deg = 35
    play Lerp(1, [&tri])

slide "Keep turning. At 120° there is no right triangle with that angle, but the point is still there and still has coordinates: −0.50 across and 0.87 up."
    tri.deg = 120
    arc.e = TAU
    play [Lerp(2.2, [&tri]), Lerp(2.2, [&arc])]

Uses the shared definitions for this lesson's figures.

In the second step nothing about the triangle changed. We only named its legs differently: the adjacent leg is how far the far corner lies to the right of the origin, and the opposite leg is how far it lies above. For an acute angle, then, $\cos\theta$ and $\sin\theta$ are the $x$ and $y$ coordinates of a point. In the third step that point stays on a circle, because a hypotenuse of length 1 keeps it at distance 1 from the origin. The circle of radius 1 centered at the origin is called the unit circle.

Coordinates do not care whether a triangle exists. Every point of the circle has an $x$ and a $y$, including the points that a radius reaches after turning more than 90°. That suggests the definition the calculator must be using: turn through the angle, then read off the coordinates.

Past 90 degrees

Pause and try

Before reading on, find the exact coordinates of the point on the unit circle reached by turning 120° counterclockwise from the positive $x$ axis. (The radius to it makes an angle of 60° with the negative $x$ axis.)

Show answerHide answer

Drop a vertical line from the point to the $x$ axis. It forms a right triangle with hypotenuse 1 and a 60° angle at the origin, on the left of the $y$ axis. Its legs are $\cos 60° = \frac{1}{2}$ along the axis and $\sin 60° = \frac{\sqrt 3}{2}$ upward. The point is half a unit to the left of the origin and $\frac{\sqrt 3}{2}$ above, so its coordinates are $\left(-\frac{1}{2}, \frac{\sqrt 3}{2}\right) \approx (-0.5, 0.866)$.

The points of the unit circle at 60° and at 120° are mirror images in the y axis. They have the same height, \frac{\sqrt 3}{2}, and opposite horizontal positions, \frac{1}{2} and -\frac{1}{2}.
The points of the unit circle at 60° and at 120° are mirror images in the $y$ axis. They have the same height, $\frac{\sqrt 3}{2}$, and opposite horizontal positions, $\frac{1}{2}$ and $-\frac{1}{2}$.
Monocurl source
let O = [0, -1.4, 0]
let R = 3.15
let P = pol(O, R, rad(60))
let Q = pol(O, R, rad(120))
let FP = [P[0], O[1], 0]
let FQ = [Q[0], O[1], 0]
mesh back = [
    Region([O, FP, P], tint(SLATE, 0.12)),
    Region([O, FQ, Q], tint(SLATE, 0.12)),
    Seg([-3.7, O[1], 0], [3.7, O[1], 0], SLATE, 2),
    Seg([0, O[1], 0], [0, 2.0, 0], SLATE, 2),
    ArcPath(O, R, 0, PI),
    Seg(Q, P, MIST, 2.5),
    Wedge(O, 0, rad(60), SLATE, 0.6),
    Wedge(O, rad(120), rad(60), SLATE, 0.6),
    ArcPath(O, 1.3, 0, rad(120), PLUM, 3.5)
]
mesh tris = [
    Seg(O, P, INK, 3),
    Seg(O, Q, INK, 3),
    Seg(O, FP, AZURE, 5),
    Seg(O, FQ, AZURE, 5),
    Seg(FP, P, EMBER, 5),
    Seg(FQ, Q, EMBER, 5),
    Square90(FP, [-1, 0, 0], [0, 1, 0], SLATE),
    Square90(FQ, [1, 0, 0], [0, 1, 0], SLATE),
    Pt(P, INK, 0.1),
    Pt(Q, INK, 0.1)
]
mesh names = [
    Name("60^\circ", O + 1.0 * dir(rad(27)), 0.74, SLATE),
    Name("60^\circ", O + 1.0 * dir(rad(153)), 0.74, SLATE),
    Name("120^\circ", O + 1.68 * dir(rad(72)), 0.78, PLUM),
    Name("\frac{1}{2}", 0.5 * (O + FP) + [0.1, -0.4, 0], 0.74, AZURE),
    Name("-\frac{1}{2}", 0.5 * (O + FQ) + [-0.1, -0.4, 0], 0.74, AZURE),
    Name("\frac{\sqrt{3}}{2}", 0.5 * (FP + P) + [0.42, 0, 0], 0.78, EMBER),
    Name("\frac{\sqrt{3}}{2}", 0.5 * (FQ + Q) + [-0.42, 0, 0], 0.78, EMBER),
    Name("\left(\frac{1}{2},\ \frac{\sqrt{3}}{2}\right)", P + [1.05, 0.3, 0], 0.8),
    Name("\left(-\frac{1}{2},\ \frac{\sqrt{3}}{2}\right)", Q + [-1.1, 0.3, 0], 0.8),
    Name("1", 0.5 * (O + P) + [0.3, -0.12, 0], 0.78),
    Name("1", 0.5 * (O + Q) + [-0.3, -0.12, 0], 0.78)
]

Uses the shared definitions for this lesson's figures.

The height of that point is $\frac{\sqrt 3}{2} \approx 0.8660$, which is the calculator’s answer for $\sin 120°$. Its horizontal coordinate is $-\frac{1}{2}$, and a calculator does report $\cos 120° = -0.5$. A negative value could never come out of a ratio of two lengths. It comes out of a coordinate without any trouble, since it only says that the point is to the left of the origin.

Here is the definition in full.

“Any real number” is the gain: 120°, 270°, 1000° and $-45°$ are all allowed, because a rotation can continue past a full turn or run backward. “Start at $(1, 0)$” and “counterclockwise” are conventions, matching the way the triangle sat on the grid with its adjacent leg along the positive $x$ axis. A new definition that reuses an old name owes us a check that the two agree where both apply.

The proof is the second step of the figure, with similar triangles supplying the reason that one triangle of hypotenuse 1 speaks for all the others.

Signs in the four quadrants

The axes cut the plane into four quadrants, numbered I to IV counterclockwise starting from the upper right. Which quadrant $P(\theta)$ lands in settles the signs of $\cos\theta$ and $\sin\theta$ at once, since these are coordinates.

One point of the unit circle in each quadrant, at 40°, 140°, 220° and 320°, with the signs of its coordinates. Cosine is positive on the right half of the circle and sine is positive on the top half.
One point of the unit circle in each quadrant, at 40°, 140°, 220° and 320°, with the signs of its coordinates. Cosine is positive on the right half of the circle and sine is positive on the top half.
Monocurl source
let O = [0, 0, 0]
let R = 1.8
let Corner = |sx, sy, numeral| {
    var cs = "\cos\theta > 0"
    var sn = "\sin\theta > 0"
    if (sx < 0) {
        cs = "\cos\theta < 0"
    }
    if (sy < 0) {
        sn = "\sin\theta < 0"
    }
    let cy = sy * 1.05
    return [
        center{[sx * 2.85, cy + 0.5, 0]} Note(str_join(["quadrant ", numeral]), 0.74),
        Name(cs, [sx * 2.85, cy, 0], 0.82, AZURE),
        Name(sn, [sx * 2.85, cy - 0.5, 0], 0.82, EMBER)
    ]
}
mesh base = [
    Seg([-2.15, 0, 0], [2.15, 0, 0], SLATE, 2),
    Seg([0, -2.05, 0], [0, 2.05, 0], SLATE, 2),
    ArcPath(O, R, 0, TAU)
]
mesh pts = map([40, 140, 220, 320], |d| Legs(O, R, rad(d)))
mesh corners = [Corner(1, 1, "I"), Corner(-1, 1, "II"), Corner(-1, -1, "III"), Corner(1, -1, "IV")]

Uses the shared definitions for this lesson's figures.

On the axes themselves one coordinate is zero. A quarter turn takes $(1, 0)$ to the top of the circle, so $P(90°) = (0, 1)$, which gives $\cos 90° = 0$ and $\sin 90° = 1$. In the same way $P(0°) = (1, 0)$, $P(180°) = (-1, 0)$ and $P(270°) = (0, -1)$. These angles have no triangle at all, and the definition handles them without a special case.

Pause and try

Without a calculator, decide the signs of $\sin 200°$ and $\cos 200°$. Then decide which of the two is further from zero.

Show answerHide answer

200° is 20° past the half turn at 180°, so $P(200°)$ is in quadrant III, a little below the leftmost point $(-1, 0)$. Both coordinates are negative. The point is far to the left and only slightly down, so the cosine is the one further from zero. (The values are $\cos 200° \approx -0.940$ and $\sin 200° \approx -0.342$.)

Symmetries that give new values from old ones

The figure for 120° worked by reflecting the 60° point in the $y$ axis. The circle has other symmetries, and each of them turns into a rule about sine and cosine.

Turning the plane a quarter turn about the origin carries the point at angle $\theta$ to the point at $\theta + 90°$. The triangle under the point turns with it, so its horizontal leg becomes vertical and its vertical leg becomes horizontal, pointing left.
Monocurl source
let O = [-1.6, 0, 0]
let R = 1.7
let TH = rad(30)
let turned = |q, a| [
    O[0] + (q[0] - O[0]) * cos(a) - (q[1] - O[1]) * sin(a),
    O[1] + (q[0] - O[0]) * sin(a) + (q[1] - O[1]) * cos(a),
    0
]
let P = pol(O, R, TH)
let F = [P[0], O[1], 0]
let Quarter = |u| {
    let a = u * PI / 2
    return [
        Region([O, turned(F, a), turned(P, a)], tint(SLATE, 0.3)),
        Seg(O, turned(P, a), INK, 3),
        Seg(O, turned(F, a), AZURE, 5),
        Seg(turned(F, a), turned(P, a), EMBER, 5),
        Pt(turned(P, a), INK, 0.09)
    ]
}
mesh base = [CircleAxes(O, R), ArcPath(O, R, 0, TAU)]
mesh ghost = [
    Region([O, F, P], tint(SLATE, 0.1)),
    Seg(O, P, MIST, 3),
    Seg(O, F, tint(AZURE, 0.45), 5),
    Seg(F, P, tint(EMBER, 0.45), 5),
    Pt(P, SLATE, 0.08)
]
mesh sweep = Quarter(u: 0)
mesh labels = [
    center{[2.4, 1.55, 0]} Note("the point at θ", 0.74),
    center{[2.4, 0.95, 0]}
        color{AZURE, |tags| 1 in tags}
        color{EMBER, |tags| 2 in tags}
        color{INK}
        Tex(["(", text_tag{1} "\cos\theta", ",\ ", text_tag{2} "\sin\theta", ")"], 0.85),
    center{[2.4, -0.25, 0]} Note("the point at θ + 90°", 0.74),
    center{[2.4, -0.85, 0]}
        color{AZURE, |tags| 1 in tags}
        color{EMBER, |tags| 2 in tags}
        color{INK}
        Tex(["(", text_tag{2} "-\sin\theta", ",\ ", text_tag{1} "\cos\theta", ")"], 0.85)
]

slide "quarter"
    play Wait(1)
    sweep.u = 1
    play Lerp(3, [&sweep])
    play Wait(2)

Uses the shared definitions for this lesson's figures.

With these rules, the three exact triangles from the start of the lesson supply exact values all the way around the circle.

The graphs of sine and cosine

So far $\theta$ has been one angle at a time. Let it run, and record the height of the point against the angle.

Pause and try

Sketch a graph of the height of $P(\theta)$ against $\theta$ for $0° \le \theta \le 360°$, before you play the animation. Mark where the height is 0, where it is largest and where it is smallest. Is the graph made of straight pieces?

Show answerHide answer

The height is 0 at 0°, 180° and 360°, largest ($1$) at 90° and smallest ($-1$) at 270°. The pieces are not straight. Near 0° the point is moving almost straight up, so the height rises quickly; near 90° it is moving almost sideways, so the height hardly changes. For example the height is already $0.5$ at 30°, a third of the way to 90°. The graph is steep at the crossings and flat at the top and bottom.

The height of a point on the unit circle is carried across to a graph whose horizontal axis is the angle turned. One full turn draws one full wave of $\sin\theta$.
Monocurl source
let R = 1.16
let C = [-2.35, 0, 0]
let fw = Frame(0, 360, -1.25, 1.25, [1.4, 0, 0], 3.6, 2.9)
mesh grid = GridLines(fw, [90, 180, 270, 360], [-1, 1])
mesh axes = [
    Axes(fw),
    YTicks(fw, [-1, 1]),
    DegTicks(fw, [90, 180, 270, 360]),
    Name("\theta", [fx(fw, 360) + 0.25, -0.32, 0], 0.85, SLATE),
    Name("\sin\theta", [fx(fw, 0) + 0.62, fy(fw, 1.25) + 0.33, 0], 0.85, EMBER),
    Seg([C[0] - R - 0.15, 0, 0], [C[0] + R + 0.15, 0, 0], SLATE, 2),
    Seg([C[0], -R - 0.2, 0], [C[0], R + 0.2, 0], SLATE, 2),
    ArcPath(C, R, 0, TAU)
]
let Unroll = |deg| {
    let th = rad(deg)
    let p = pol(C, R, th)
    let n = to_int(max(2, ceil(deg / 4)))
    return [
        Seg(p, at(fw, deg, sin(th)), MIST, 2),
        Wedge(C, 0, th, SLATE, 0.3),
        Seg(C, p, INK, 2.5),
        Seg([p[0], 0, 0], p, EMBER, 5),
        Seg(at(fw, deg, 0), at(fw, deg, sin(th)), EMBER, 3),
        stroke{EMBER, 4} Polyline(map(sample(0, deg, n), |v| at(fw, v, sin(rad(v))))),
        Pt(at(fw, deg, sin(th)), EMBER, 0.085),
        Pt(p, INK, 0.085)
    ]
}
mesh unroll = Unroll(deg: 4)

slide "unroll"
    play Wait(0.6)
    unroll.deg = 360
    play Lerp(7, [&unroll], linear)
    play Wait(1.5)

Uses the shared definitions for this lesson's figures.

The wave is the height of the point, read out as the angle advances. It repeats every 360° by rule 1, and it never leaves the band between $-1$ and $1$, because no point of a circle of radius 1 is more than 1 above or below the center.

Recording the horizontal coordinate instead gives the graph of cosine.

The graphs of \sin\theta and \cos\theta from -90° to 450°. The cosine graph is the sine graph moved 90° to the left: each feature of sine, such as its peak at 90°, happens to cosine 90° earlier.
The graphs of $\sin\theta$ and $\cos\theta$ from $-90°$ to $450°$. The cosine graph is the sine graph moved 90° to the left: each feature of sine, such as its peak at 90°, happens to cosine 90° earlier.
Monocurl source
let fw = Frame(-90, 450, -1.25, 1.25, [0.15, 0.15, 0], 6.3, 3.0)
mesh grid = [
    GridLines(fw, [-90, 0, 90, 180, 270, 360, 450], [-1, 1]),
    Seg(at(fw, -90, 0), at(fw, 450, 0), SLATE, 2.5),
    Seg(at(fw, -90, -1.25), at(fw, -90, 1.25), SLATE, 2.5)
]
mesh ticks = block {
    . DegTicks(fw, [-90, 0, 90, 180, 270, 360, 450])
    for (v in [-1, 0, 1]) {
        . Name(to_string(v), [fx(fw, -90) - 0.32, fy(fw, v), 0], 0.72, SLATE)
    }
    . Name("\theta", [fx(fw, 450) + 0.28, fy(fw, 0), 0], 0.85, SLATE)
}
mesh curves = [
    Graph(fw, |d| cos(rad(d)), -90, 450, AZURE),
    Graph(fw, |d| sin(rad(d)), -90, 450, EMBER)
]
mesh marks = [
    Tip(at(fw, 86, 1.12), at(fw, 4, 1.12), LEAF, 3, 0.16),
    Name("90^\circ", at(fw, 45, 1.12) + [0, 0.3, 0], 0.76, LEAF),
    Pt(at(fw, 90, 1), EMBER, 0.085),
    Pt(at(fw, 0, 1), AZURE, 0.085),
    Name("\sin\theta", at(fw, 170, 0.78), 0.85, EMBER),
    Name("\cos\theta", at(fw, 225, 0.6), 0.85, AZURE)
]

Uses the shared definitions for this lesson's figures.

The two curves have the same shape. Rule 4 says why: $\sin(\theta + 90°) = \cos\theta$, so the value cosine has at $\theta$ is the value sine will have 90° later. Whatever sine does, cosine did it a quarter turn earlier.

Limits of the definition, and two mistakes

The triangle definition is the unit circle definition restricted to $0° < \theta < 90°$. Outside that range the phrase “opposite over hypotenuse” has no meaning and only the coordinates remain.

The circle also sets limits. Since $-1 \le \sin\theta \le 1$ and $-1 \le \cos\theta \le 1$ for every $\theta$, an equation such as $\sin\theta = 1.5$ has no solution, which is the reason the opening guess had to fail. And when a solution exists it is not unique. The third example found two angles in one turn with the same sine, and adding 360° to either gives more. A calculator’s inverse sine key returns only one of them.

Looking back

The obstacle was that a definition built on right triangles cannot be asked about 120°. The way past it was to notice that the two legs of a triangle with hypotenuse 1 are also the coordinates of a point, and that coordinates remain available after the triangle is gone. Replacing a definition by an equivalent one that makes sense in more cases is a move you will see again whenever a formula is stretched beyond the setting that produced it.

Because $(\cos\theta, \sin\theta)$ is a point at distance 1 from the origin, its coordinates are tied together by the Pythagorean theorem. That relation, $\sin^2\theta + \cos^2\theta = 1$, is the subject of the Pythagorean identity. Before that, the lesson on radians asks why a full turn should be 360 of anything.

Check yourself

What is $\cos 240°$?

Problems

Draw the circle for each of these. The first three repeat the lesson’s moves, the next three combine them, and the last two ask for an argument.

Problem 1

Find the exact values of $\sin 135°$ and $\cos 135°$.

Show solutionHide solution

$135° = 180° - 45°$, so $P(135°)$ is the mirror image of $P(45°) = \left(\frac{\sqrt 2}{2}, \frac{\sqrt 2}{2}\right)$ in the $y$ axis, which is $\left(-\frac{\sqrt 2}{2}, \frac{\sqrt 2}{2}\right)$. So $\sin 135° = \frac{\sqrt 2}{2}$ and $\cos 135° = -\frac{\sqrt 2}{2}$. The signs fit quadrant II.

Problem 2

Find the exact values of $\sin 300°$ and $\cos 300°$.

Show solutionHide solution

$300° = -60° + 360°$, so $P(300°) = P(-60°)$ by the full turn rule, and $P(-60°)$ is the mirror image of $P(60°) = \left(\frac{1}{2}, \frac{\sqrt 3}{2}\right)$ in the $x$ axis. So $P(300°) = \left(\frac{1}{2}, -\frac{\sqrt 3}{2}\right)$, giving $\cos 300° = \frac{1}{2}$ and $\sin 300° = -\frac{\sqrt 3}{2}$. The point is in quadrant IV, right of the origin and below it, which matches.

Problem 3

(a) In which quadrant is $\sin\theta < 0$ and $\cos\theta > 0$? (b) In which quadrant does the point at $1000°$ lie, and what are the signs of $\sin 1000°$ and $\cos 1000°$?

Show solutionHide solution

(a) A negative sine puts the point below the $x$ axis and a positive cosine puts it right of the $y$ axis. That is quadrant IV. (b) Remove full turns: $1000° - 2 \times 360° = 280°$, so $P(1000°) = P(280°)$. Since $270° < 280° < 360°$ the point is in quadrant IV, so $\sin 1000° < 0$ and $\cos 1000° > 0$. (A calculator gives about $-0.985$ and $0.174$.)

Problem 4

Find every angle $\theta$ with $0° \le \theta < 360°$ and $\cos\theta = -\frac{1}{2}$.

Show solutionHide solution

We need the points of the circle whose $x$ coordinate is $-\frac{1}{2}$. We know $\cos 60° = \frac{1}{2}$. Mirroring in the $y$ axis changes the sign of the cosine: $\cos(180° - 60°) = \cos 120° = -\frac{1}{2}$. Mirroring that point in the $x$ axis keeps the cosine: $\cos(-120°) = -\frac{1}{2}$, and $-120° + 360° = 240°$. The vertical line $x = -\frac{1}{2}$ meets the circle in exactly two points, so these are all: $\theta = 120°$ and $\theta = 240°$.

Problem 5

A circle of radius $r$ is centered at the origin. Explain why the point on it at angle $\theta$ from the positive $x$ axis is $(r\cos\theta, r\sin\theta)$, and find the point at 150° on the circle of radius 5.

Show solutionHide solution

Scaling the plane by the factor $r$ about the origin multiplies both coordinates of every point by $r$. It carries the unit circle to the circle of radius $r$, and it moves each point along its own ray from the origin, so it does not change the angle. The point $(\cos\theta, \sin\theta)$ therefore goes to the point at angle $\theta$ on the larger circle, which is $(r\cos\theta, r\sin\theta)$. For $r = 5$ and $\theta = 150°$, using $\cos 150° = -\frac{\sqrt 3}{2}$ and $\sin 150° = \frac{1}{2}$ from the first example, the point is $\left(-\frac{5\sqrt 3}{2}, \frac{5}{2}\right) \approx (-4.33, 2.5)$.

Problem 6

A Ferris wheel has radius 20 m and its hub is 22 m above the ground. A rider starts level with the hub, at the rightmost point, and the wheel turns counterclockwise. (a) How high is the rider after the wheel has turned 210°? (b) At which angles in the first turn is the rider 32 m above the ground?

Show solutionHide solution

Measured from the hub, the rider is at the point at angle $\theta$ on a circle of radius 20, so by the previous problem the rider’s height above the hub is $20\sin\theta$ meters and the height above the ground is $22 + 20\sin\theta$ meters.

(a) $210° = 30° + 180°$, and a half turn reverses both coordinates, so $\sin 210° = -\sin 30° = -\frac{1}{2}$. The height is $22 + 20 \times \left(-\frac{1}{2}\right) = 12$ m.

(b) $22 + 20\sin\theta = 32$ gives $\sin\theta = \frac{1}{2}$. One solution is $\theta = 30°$, and its mirror image in the $y$ axis is $\theta = 180° - 30° = 150°$. A horizontal line meets the circle at most twice, so the rider is at 32 m when the wheel has turned 30° and again at 150°.

Problem 7

The point $(-0.6, 0.8)$ is at distance $\sqrt{0.36 + 0.64} = 1$ from the origin, so it is $P(\theta)$ for some angle $\theta$. Without finding $\theta$, give the values of $\sin\theta$, $\cos\theta$, $\sin(\theta + 180°)$, $\cos(\theta + 90°)$, $\sin(180° - \theta)$ and $\cos(-\theta)$.

Show solutionHide solution

By definition $\cos\theta = -0.6$ and $\sin\theta = 0.8$. A half turn sends $(x, y)$ to $(-x, -y)$, so $\sin(\theta + 180°) = -0.8$. The quarter turn rule gives $\cos(\theta + 90°) = -\sin\theta = -0.8$. The mirror in the $y$ axis keeps the height: $\sin(180° - \theta) = 0.8$. The mirror in the $x$ axis keeps the horizontal coordinate: $\cos(-\theta) = -0.6$.

Problem 8

(a) Find every angle $\theta$ with $0° \le \theta < 360°$ and $\sin\theta = \cos\theta$, and prove there are no others. (b) For which angles in that range is $\sin\theta > \cos\theta$?

Show solutionHide solution

(a) $\sin\theta = \cos\theta$ says that $P(\theta)$ has equal coordinates, so it lies on the line $y = x$. That line passes through the origin and through $P(45°) = \left(\frac{\sqrt 2}{2}, \frac{\sqrt 2}{2}\right)$. A line through the center of a circle meets the circle in exactly two points, at opposite ends of a diameter, so the only other point is the one a half turn away, $P(225°) = \left(-\frac{\sqrt 2}{2}, -\frac{\sqrt 2}{2}\right)$. The solutions are $\theta = 45°$ and $\theta = 225°$.

(b) $\sin\theta > \cos\theta$ says $y > x$, so the point lies above the line $y = x$. The line cuts the circle into two arcs, and the one above it runs counterclockwise from 45° to 225°, passing through the top of the circle. So $\sin\theta > \cos\theta$ exactly when $45° < \theta < 225°$. Check with one angle on each arc: at 90°, $1 > 0$ holds; at 0°, $0 > 1$ fails.

Shared definitions used by this lesson's figures
# house kit: prepended to every essay figure after the std imports

# palette. AZURE and EMBER are the two actors, LEAF marks an answer, ROSE a problem
let PAPER = [1, 1, 1, 1]
let INK = [0.08, 0.09, 0.11, 1]
let SLATE = [0.40, 0.44, 0.50, 1]
let MIST = [0.85, 0.86, 0.88, 1]
let AZURE = [0.13, 0.42, 0.68, 1]
let EMBER = [0.89, 0.42, 0.12, 1]
let LEAF = [0.13, 0.55, 0.36, 1]
let ROSE = [0.78, 0.22, 0.24, 1]
let PLUM = [0.47, 0.30, 0.66, 1]
let GOLD = [0.85, 0.62, 0.08, 1]

background = PAPER

# an opaque pastel of col; use for fills so overlaps do not darken
let tint = |col, amount = 0.18| [
    1 - (1 - col[0]) * amount,
    1 - (1 - col[1]) * amount,
    1 - (1 - col[2]) * amount,
    1
]

# text: Cap for labels, Note for quiet labels, Math for typeset maths
let Cap = |txt, size = 0.75, col = INK| color{col} Text(txt, size, "Charter")
let Note = |txt, size = 0.65| color{SLATE} Text(txt, size, "Charter")
let Math = |tex, size = 0.9, col = INK| color{col} Tex(tex, size)

# a paper rectangle to sit behind text that crosses lines
let Plate = |pos, size| center{pos} fill{PAPER} stroke{alpha{0} PAPER, 0} Rect(size)

# shapes with fill and stroke both set, so no stray black appears
let Pt = |pos, col = INK, r = 0.075| center{pos} fill{col} stroke{col, 1} Circle(r, 48)
let Ring = |pos, col = INK, r = 0.1, w = 3| center{pos} fill{PAPER} stroke{col, w} Circle(r, 48)
let Seg = |a, b, col = INK, w = 3| stroke{col, w} Line(a, b)
let Path = |pts, col = INK, w = 3| stroke{col, w} Polyline(pts)
let Region = |pts, col| fill{col} stroke{alpha{0} col, 0} Polygon(pts)
let Outline = |pts, col = INK, w = 3| fill{alpha{0} PAPER} stroke{col, w} Polygon(pts)
let Shape = |pts, col, amount = 0.18, w = 3| fill{tint(col, amount)} stroke{col, w} Polygon(pts)
let Disc = |pos, r, col, amount = 0.18, w = 3| center{pos} fill{tint(col, amount)} stroke{col, w} Circle(r, 96)
let Box = |pos, size, col, amount = 0.18, w = 3| center{pos} fill{tint(col, amount)} stroke{col, w} Rect(size)
# a line from a to b ending in a small solid arrowhead
let Tip = |a, b, col = INK, w = 3, head = 0.17| {
    let d = normalize([b[0] - a[0], b[1] - a[1], 0])
    let n = [-d[1], d[0], 0]
    let base = [b[0] - d[0] * head, b[1] - d[1] * head, 0]
    return [
        stroke{col, w} Line(a, base),
        fill{col} stroke{col, 1} Polygon([
            b,
            [base[0] + n[0] * head * 0.42, base[1] + n[1] * head * 0.42, 0],
            [base[0] - n[0] * head * 0.42, base[1] - n[1] * head * 0.42, 0]
        ])
    ]
}

# plots. a frame is [x0, x1, y0, y1, centre, width, height]: a data window and the scene box it fills
let Frame = |x0, x1, y0, y1, c = [0, 0, 0], w = 6.4, h = 3.6| [x0, x1, y0, y1, c, w, h]
let fx = |fr, x| fr[4][0] + (x - (fr[0] + fr[1]) / 2) * fr[5] / (fr[1] - fr[0])
let fy = |fr, y| fr[4][1] + (y - (fr[2] + fr[3]) / 2) * fr[6] / (fr[3] - fr[2])
let at = |fr, x, y| [fx(fr, x), fy(fr, y), 0]

# axes through the data origin (or the nearest edge of the window), with optional names
let Axes = |fr, x_name = "", y_name = "", col = SLATE| {
    let ox = clamp(fr[0], 0, fr[1])
    let oy = clamp(fr[2], 0, fr[3])
    var parts = [
        Tip(at(fr, fr[0], oy), [fx(fr, fr[1]) + 0.25, fy(fr, oy), 0], col, 2.5, 0.15),
        Tip(at(fr, ox, fr[2]), [fx(fr, ox), fy(fr, fr[3]) + 0.25, 0], col, 2.5, 0.15)
    ]
    if (x_name != "") {
        parts .= center{[fx(fr, fr[1]) + 0.5, fy(fr, oy), 0]} Math(x_name, 0.8, col)
    }
    if (y_name != "") {
        parts .= center{[fx(fr, ox), fy(fr, fr[3]) + 0.5, 0]} Math(y_name, 0.8, col)
    }
    return parts
}

# tick marks with numbers at the listed data values
let XTicks = |fr, xs, col = SLATE, places = 0| block {
    let oy = fy(fr, clamp(fr[2], 0, fr[3]))
    for (x in xs) {
        . Seg([fx(fr, x), oy - 0.07, 0], [fx(fr, x), oy + 0.07, 0], col, 2)
        . center{[fx(fr, x), oy - 0.33, 0]} Math(to_string(x, places), 0.72, col)
    }
}
let YTicks = |fr, ys, col = SLATE, places = 0| block {
    let ox = fx(fr, clamp(fr[0], 0, fr[1]))
    for (y in ys) {
        . Seg([ox - 0.07, fy(fr, y), 0], [ox + 0.07, fy(fr, y), 0], col, 2)
        . center{[ox - 0.36, fy(fr, y), 0]} Math(to_string(y, places), 0.72, col)
    }
}

# faint grid lines at the listed data values
let GridLines = |fr, xs, ys, col = MIST| block {
    for (x in xs) {
        . Seg(at(fr, x, fr[2]), at(fr, x, fr[3]), col, 1.5)
    }
    for (y in ys) {
        . Seg(at(fr, fr[0], y), at(fr, fr[1], y), col, 1.5)
    }
}

# the graph of f over [a, b], drawn in the frame. values are clamped to the window
let Graph = |fr, f, a, b, col = AZURE, w = 4, n = 160|
    stroke{col, w} Polyline(map(sample(a, b, n), |x| at(fr, x, clamp(fr[2], f(x), fr[3]))))

# the region between the graph of f and the x axis over [a, b]
let AreaUnder = |fr, f, a, b, col = AZURE, amount = 0.2, n = 80| {
    var pts = [at(fr, a, 0)]
    for (x in sample(a, b, n)) {
        pts .= at(fr, x, clamp(fr[2], f(x), fr[3]))
    }
    pts .= at(fr, b, 0)
    return fill{tint(col, amount)} stroke{alpha{0} col, 0} Polygon(pts)
}

let dir = |th| [cos(th), sin(th), 0]
let rad = |d| d * PI / 180
let pol = |o, r, t| [o[0] + r * cos(t), o[1] + r * sin(t), 0]
let ArcPath = |o, r, a, b, col = SLATE, w = 2.5| {
    let n = to_int(max(2, min(120, ceil(abs(b - a) * r / 0.05))))
    return stroke{col, w} Polyline(map(sample(a, b, n), |t| pol(o, r, t)))
}
let Wedge = |p, t0, sw, col, r = 0.5| fill{tint(col, 0.5)} stroke{col, 2.5} Polygon(block {
    . p
    for (t in sample(t0, t0 + sw, to_int(max(8, ceil(abs(sw) * 14))))) {
        . p + r * dir(t)
    }
})
let Name = |txt, pos, size = 0.8, col = INK| center{pos} Math(txt, size, col)
let Square90 = |p, s, t, col = INK, k = 0.2| stroke{col, 2.5} Polyline([p + k * s, p + k * s + k * t, p + k * t])
let snap = |v| {
    if (abs(v) < 0.005) {
        return 0
    }
    return v
}
# the two axes through the centre of a circle of radius r, with 1 and -1 marked
let CircleAxes = |o, r| [
    Seg([o[0] - r - 0.3, o[1], 0], [o[0] + r + 0.3, o[1], 0], SLATE, 2),
    Seg([o[0], o[1] - r - 0.2, 0], [o[0], o[1] + r + 0.2, 0], SLATE, 2),
    Name("1", [o[0] + r + 0.17, o[1] - 0.27, 0], 0.72, SLATE),
    Name("-1", [o[0] - r - 0.2, o[1] - 0.27, 0], 0.72, SLATE),
    Name("1", [o[0] - 0.2, o[1] + r + 0.17, 0], 0.72, SLATE)
]
# radius to the point at angle th, with its across leg (blue) and up leg (orange)
let Legs = |o, r, th, w = 5| {
    let p = pol(o, r, th)
    let f = [p[0], o[1], 0]
    return [Seg(o, p, INK, 3), Seg(o, f, AZURE, w), Seg(f, p, EMBER, w), Pt(p, INK, 0.09)]
}
let DegTicks = |fr, ds, col = SLATE| block {
    for (d in ds) {
        . center{[fx(fr, d), fy(fr, fr[2]) - 0.3, 0]} Math(str_join([to_string(d), "^\circ"]), 0.72, col)
    }
}