--
-- Patricia Fasel
-- Los Alamos National Laboratory
-- 1990 August
--
module Distance (distSurf) where
import GamtebType
import Consts
-- find distance of a particle to a surface
distSurf :: Point -> Point -> (Value, Indx)
distSurf (p1@(x,y,z)) (p2@(u,v,w)) =
(dSurf+small, surf)
where
d1 = distPlane y v 0
d2 = distCyl p1 p2
d3 = distPlane y v cylLen
d4 = distPlane y v cylLen2
s1 = 1::Indx
s2 = 2::Indx
s3 = 3::Indx
s4 = 4::Indx
(dSurf, surf) = minP (minP (d1,s1) (d2,s2)) (minP (d3,s3) (d4,s4))
minP (d, j) (d', j') =
if (d < d')
then (d, j)
else (d', j')
-- find distance to a cylinder
distCyl :: Point -> Point -> Value
distCyl (x,y,z) (u,v,w)
| (u*u + w*w) == 0 = big -- w*w used to be v*v LA
| (u /= 0) =
let
m = w/u
b = z - m*x
s = m*m + 1
r = sqrt (s - b*b)
x' = if (u > 0)
then (-m*b + r) / s
else (-m*b - r) / s
in
(x'-x) / u
| (u == 0 && v /= 0) =
let
m = w/v
b = z - m*y
r = sqrt (1 - x*x)
y' = if (v > 0)
then (r-b) / m
else (-r-b) / m
in
(y'-y) / v
| w > 0 = (sqrt (1 - x*x)) - z
| otherwise = -(sqrt (1 - x*x)) - z
-- find distance of a particle to a plane
distPlane :: Coord -> Coord -> Value -> Value
distPlane y v yPlane
| v == 0 = big
| y >= yPlane = big
| otherwise = (yPlane-y) / v
|