Определить, пересекает ли линия сферу

Попытка создать очень простую логическую функцию, которая определит, пересекает ли линия сферу.

Это не похоже на то, что я хочу, хотя вопрос был похож: Пересечение линии и сферы?

Также я пробовал алгоритмы, перечисленные по адресу:

http://www.docstoc.com/docs/7747820/Intersection-of-a-Line-and- a-Sphere

и

http://www.ccs.neu.edu/home/fell/CSU540/programs/RayTracingFormulas.htm

без особого успеха.

Мой последний код (в Haskell) выглядит так:

data Point = Point { x :: Float, y :: Float, z :: Float} deriving (Eq, Show, Read)
data Sphere = Sphere { center :: Point, radius :: Float } deriving (Eq, Show, Read)

inView :: Point -> Point -> Sphere -> Bool
inView (Point x1 y1 z1) (Point x2 y2 z2) (Sphere (Point x3 y3 z3) r)
  | result > 0 && result < r = False
  | otherwise                = True
  where result = top/bot
        top = (x3 - x1) * (x2 - x1) + (y3 - y1) * (y2 - y1) + (z3 - z1) * (z2 - z1)
        bot = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1)

Где он возвращает истину, если 2 точки имеют прямую линию доступа. Это работает для некоторых простых случаев, но не работает для других, которые должны работать, например:

inView (Point {x = 43.64, y = -183.20, z = 187.37}) (Point {x = 42.04, y = -183.58, z = 187.37}) (Sphere (Point 0 0 0) 5)

Любая помощь будет принята с благодарностью.

5
задан Community 23 May 2017 в 12:34
поделиться