Notice v/1 = y/z. Therefore we can compute v = y/z by assuming the box size is 1.

Assume camera has unit size, then:

v = \frac{y}{z} (it just the slope, or height difference divided by distance)

u = \frac{x}{z} (width difference divided by distance)

Draw an image: assume camera at C = (a, b, c):

for each vertex V = (x, y, z) calculate V' = V - C

let V' = (x', y', z'), then (u, v) = (\frac{x}{z}, \frac{y}{z})

The steps to draw is:
1. assuming the camera is at c = (2, 3, 5)
2. then subtract camera c from vertex (X, Y, Z) to get (x, y, z). This is simulating view direction
3. divide (x, y) by z to get (u, v), This is using the similar triangle to compute perspective projection.

Rasterization

Rasterization Accuracy

Thickness Rule: turn on a pixel if the line (with a specified width) occupies some percentage of a pixel

Rasterization Performance

Naive Rasterization: to cover n pixel, if we check the condition for every pixel we probably need n^2 times.

Incremental Line Rasterization: given endpoints (u_1, v_1), (u_2, v_2)

we know the slope s = \frac{v_2 - v_1}{u_2 - u_1}

assume u_1 < u_2 \land v_1 < v_2 \land 0 < s < 1, we can write the following code

'''
v = v1;
for (u = u1; u <= u2; u++) {
v += s;
draw(u, round(v))
}
'''

This algorithm requires floating point, which is bad. Also, if the line does not start in the diamond area, there are some fixes to the method. Modern implementation uses Branson Ham's line Algorithm.