Koch snowflake in Python with numpy and pygame
This is good code — I only have a couple of minor points.


Since nothing changes or animates, there's no need to have a top-level loop or a clock. You can just draw the snowflake and then wait for the user to quit (calling event.wait instead of event.get so that the program isn't busy doing nothing).
It's clearer to write pygame.Color('white') and pygame.Color('black') instead of [255, 255, 255] and [0, 0, 0].
Instead of:

# find the normal to this line
line_normal = numpy.array([
        line_end[1]-line_start[1],
        line_start[0]-line_end[0] ])


consider using the cross product:

line_normal = numpy.cross(line_end - line_start, [0, 0, 1])

There's repeated code in the computation of the triangle points that could be factored out into a function:

def interpolated(x, start, end):
    """Return vector interpolated between start and end by x."""
    return (1 - x) * start + x * end


and then:

triangle_left  = interpolated(1/3, line_start, line_end)
triangle_right = interpolated(2/3, line_start, line_end)