{-
 -  Fulsom (The Solid Modeller, written in Haskell)
 -
 -  Copyright 1990,1991,1992,1993 Duncan Sinclair
 -
 - Permissiom to use, copy, modify, and distribute this software for any
 - purpose and without fee is hereby granted, provided that the above
 - copyright notice and this permission notice appear in all copies, and
 - that my name not be used in advertising or publicity pertaining to this
 - software without specific, written prior permission.  I makes no
 - representations about the suitability of this software for any purpose.
 - It is provided ``as is'' without express or implied warranty.
 -
 - Duncan Sinclair 1993.
 -
 - Vector arithmetic routines.
 -
 -}

module Vector where

import Interval
import Types

makevector :: In -> In -> In -> In -> Vector
makevector a' b' c' d' = (x,y,z)
  where
    a = unpt a' ; b = unpt b' ; c = unpt c' ; d = unpt d'
    x = b - a
    y = c - a
    z = d - a

normalise :: Vector -> Vector
normalise xyz@(x,y,z) = (x/l,y/l,z/l)
  where l = len xyz

len :: Vector -> FType
len (x,y,z) = ans
  where
    ans | sqs /= 0.0 = sqrt sqs
        | True       = 1
    sqs :: FType
    sqs = (x2 + y2 + z2)
    x2  = x * x
    y2  = y * y
    z2  = z * z

light :: Color -> Vector -> Color
light (RGB r g b) (x,y,z) = RGB (a*r) (a*g) (a*b)
    where a = (max ((0.5773*x + 0.5773*y + 0.5773*z) * (1-amb)) 0) + amb

-- amb = (0.05 :: FType)
amb = (0.50 :: FType)
