Files
nage/workshop/steps/02-vectors-length/README.md
T
2026-07-11 17:48:28 +02:00

1.4 KiB

Step 02 — Length, Normalize, Dot

Concept

Length (magnitude)

An arrow (x, y) has a length: how far it reaches. Pythagoras: length = sqrt(x*x + y*y). A velocity's length is its speed.

Normalize

Often you want just the direction of an arrow, with length exactly 1 (a "unit vector"). You get it by dividing the arrow by its own length: (x / len, y / len).

This is how your engine turns "the player pressed up+left" into a clean diagonal direction before multiplying by a speed — so diagonal movement isn't faster than straight movement.

⚠️ The zero-vector trap. What is the length of (0, 0)? Zero. What is 0 / 0? NaN. If you normalize a zero vector naively, you poison it with NaN, and NaN spreads through every later calculation silently. A correct normalize must check for zero length and return (0, 0) instead of dividing. Remember this trap — it is exactly the kind of bug that hides in a real engine.

Dot product

dot(a, b) = a.x*b.x + a.y*b.y. One number out of two vectors. For now just implement it; in step 09 you'll learn that it answers "how much of arrow A points along arrow B?" — the key to sliding along a wall.

Task

Implement length, normalize (zero-safe!), and dot in mathv.ts. vec/add/sub/scale are already provided in given.ts.

bun test workshop/steps/02-vectors-length