┌───────────────────────────────────────────────┐ │Vector │ ├───────────────────────────────────────────────┤ │+x: number │ ┌──────────────────────────────────────┐ │+y: number │ ┌──────────────┐ ┌─────────────┐ │Thing │ │+z: number │ │Ray │ │Intersection │ ├──────────────────────────────────────┤ │+{static} times(k: number, v: Vector): Vector │ ├──────────────┤ ├─────────────┤ │+intersect: (ray: Ray) => Intersection│ │+{static} minus(v1: Vector, v2: Vector): Vector│ │+start: Vector│ │+thing: Thing│ │+normal: (pos: Vector) => Vector │ │+{static} plus(v1: Vector, v2: Vector): Vector │ │+dir: Vector │ │+ray: Ray │ │+surface: Surface │ │+{static} dot(v1: Vector, v2: Vector): number │ └──────────────┘ │+dist: number│ │+destroy(): void │ │+{static} mag(v: Vector): number │ └─────────────┘ │+destroy(name: string): void │ │+{static} norm(v: Vector): Vector │ └──────────────────────────────────────┘ │+{static} cross(v1: Vector, v2: Vector): Vector│ └───────────────────────────────────────────────┘ ┌────────────────────────────────────────────────────────────────────────┐ │Color │ ├────────────────────────────────────────────────────────────────────────┤ │+r: number │ ┌──────────────────────────────────────────────────────────────┐ │+g: number │ ┌─────────────────────────────────┐ ┌──────────────────────────────────────┐ │Sphere │ │+b: number │ │Surface │ ┌─────────────┐ │Plane │ ├──────────────────────────────────────────────────────────────┤ │+{static} scale(k: number, v: Color): Color │ ├─────────────────────────────────┤ │Light │ ├──────────────────────────────────────┤ │+radius2: number │ │+{static} plus(v1: Color, v2: Color): Color │ │+diffuse: (pos: Vector) => Color │ ├─────────────┤ │+normal: (pos: Vector) => Vector │ │+center: Vector │ │+{static} times(v1: Color, v2: Color): Color │ │+specular: (pos: Vector) => Color│ │+pos: Vector │ │+intersect: (ray: Ray) => Intersection│ │+surface: Surface │ │+{static} white: Color │ │+reflect: (pos: Vector) => number│ │+color: Color│ │+surface: Surface │ │+normal(pos: Vector): Vector │ │+{static} grey: Color │ │+roughness: number │ └─────────────┘ └──────────────────────────────────────┘ │+intersect(ray: Ray): { thing: this; ray: Ray; dist: number; }│ │+{static} black: Color │ └─────────────────────────────────┘ └──────────────────────────────────────────────────────────────┘ │+{static} background: Color │ │+{static} defaultColor: Color │ │+{static} toDrawingColor(c: Color): { r: number; g: number; b: number; }│ └────────────────────────────────────────────────────────────────────────┘ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │RayTracer │ ┌────────────────┐ ├──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │Camera │ ┌────────────────┐ │-maxDepth: number │ ├────────────────┤ │Scene │ │-intersections(ray: Ray, scene: Scene): Intersection │ │+forward: Vector│ ├────────────────┤ │-testRay(ray: Ray, scene: Scene): number │ │+right: Vector │ │+things: Thing[]│ │-traceRay(ray: Ray, scene: Scene, depth: number): Color │ │+up: Vector │ │+lights: Light[]│ │-shade(isect: Intersection, scene: Scene, depth: number): Color │ │+pos: Vector │ │+camera: Camera │ │-getReflectionColor(thing: Thing, pos: Vector, normal: Vector, rd: Vector, scene: Scene, depth: number): Color│ └────────────────┘ └────────────────┘ │-getNaturalColor(thing: Thing, pos: Vector, norm: Vector, rd: Vector, scene: Scene): any │ │+render(scene: any, ctx: any, screenWidth: any, screenHeight: any): void │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘