2016-06-20 2 views
1

Я пишу модуль ограничивающей коробки для библиотеки octree. Вы можете найти мой филиал here. В приведенной ниже функции я пытаюсь сделать явным неявные ограничивающие поля Octree. Проблема в том, что не все ограничивающие прямоугольники действительны.Где я ошибаюсь в своей функции ограничительной рамки?

Это функция, о которой идет речь, за которой следует способ репликации проблемы в ghci.

explicateMBB :: (BBox3, Octree a) -> [BBox3] 
explicateMBB (mbb, (Leaf _)) = [mbb] 
explicateMBB (mbb, (Node { split = split', 
          nwu = nwu', 
          nwd = nwd', 
          neu = neu', 
          ned = ned', 
          swu = swu', 
          swd = swd', 
          seu = seu', 
          sed = sed' 
      })) = 
    mbb:concatMap explicateMBB octList 
    where 
    octList = zip boxList children 
    boxList = [swdBox, sedBox, nwdBox, nedBox, swuBox, seuBox, nwuBox, neuBox] 
    children = [swd',sed',nwd',ned',swu',seu',nwu',neu'] 
    swdBox = bound_corners swdCorner neuCorner 
     where 
     swdCorner = Vector3 (minX mbb) (minY mbb) (minZ mbb) 
     neuCorner = Vector3 (v3x split') (v3y split') (v3z split') 
    sedBox = bound_corners swdCorner neuCorner 
     where 
     swdCorner = Vector3 (v3x split') (minY mbb) (minZ mbb) 
     neuCorner = Vector3 (maxX mbb) (v3y split') (minZ mbb) 
    nwdBox = bound_corners swdCorner neuCorner 
     where 
     swdCorner = Vector3 (minX mbb) (v3y split') (minZ mbb) 
     neuCorner = Vector3 (v3x split') (maxY mbb) (v3z split') 
    nedBox = bound_corners swdCorner neuCorner 
     where 
     swdCorner = Vector3 (v3x split') (v3y split') (minZ mbb)  
     neuCorner = Vector3 (maxX mbb) (maxY mbb) (v3z split') 
    swuBox = bound_corners swdCorner neuCorner 
     where 
     swdCorner = Vector3 (minX mbb) (minY mbb) (v3z split') 
     neuCorner = Vector3 (v3x split') (v3y split') (maxZ mbb) 
    seuBox = bound_corners swdCorner neuCorner 
     where 
     swdCorner = Vector3 (v3x split') (minY mbb) (v3z split') 
     neuCorner = Vector3 (maxX mbb) (v3y split') (maxZ mbb) 
    nwuBox = bound_corners swdCorner neuCorner 
     where 
     swdCorner = Vector3 (minX mbb) (v3y split') (v3z split') 
     neuCorner = Vector3 (v3x split') (maxY mbb) (maxZ mbb) 
    neuBox = bound_corners swdCorner neuCorner 
     where 
     swdCorner = Vector3 (v3x split') (v3y split') (v3z split') 
     neuCorner = Vector3 (maxX mbb) (maxY mbb) (maxZ mbb) 

Для репликации проблемы:

git clone https://github.com/mlitchard/octree.git

git checkout MBB

stack ghci

В ghci, сделайте следующее:

:m + Data.List Data.Vector.Class System.Random System.Random.Shuffle Data.BoundingBox.B3 
let infinity = (read "Infinity") :: Double 
let swdCorner = Vector3 (-infinity) (-infinity) (-infinity) 
let neuCorner = Vector3 (infinity) (infinity) (infinity) 
let rbb = bound_corners swdCorner neuCorner 
xGen <- getStdGen 
yGen <- newStdGen 
zGen <- newStdGen 
let xPoints = shuffle' [-256 .. 256] 513 xGen 
let yPoints = shuffle' [-256 .. 256] 513 yGen 
let zPoints = shuffle' [-256 .. 256] 513 zGen 
let xPoints' = map fromInteger xPoints :: [Double] 
let yPoints' = map fromInteger yPoints :: [Double] 
let zPoints' = map fromInteger zPoints :: [Double] 
let tup513 = zip3 xPoints' yPoints' zPoints' 
let construct_vect = (\(x,y,z) -> Vector3 x y z) 
let vect513 = map construct_vect tup513 
let pre_oct513 = zip vect513 [1 .. 513] 
let octree513 = fromList pre_oct513 
length $ filter (== False) $ map isValidMBB $ explicateMBB (rbb,octree513) 

Ответ будет 9, но должен быть 0.

Я чувствую, как один из fooBoxwhere статей неправильно, но я пошел по каждому из них несколько раз, и я не вижу, какой он есть.

Если вам нужна визуальная помощь, как я, я нашел this pic, чтобы быть полезным. Моя выборка состоит из 2 подразделений.

Любое понимание того, что происходит неправильно, будет оценено по достоинству.

+1

Просто сказать: этот вид вопроса мог бы гораздо лучше быть представлены [с блокнотом Jupyter] (https: // GitHub .com/gibiansky/IHaskell). – leftaroundabout

+0

@leftaroundabout вы можете использовать jupyter для stackoverflow? – epsilonhalbe

+1

@epsilonhalbe: это было бы здорово! Но нет, на самом деле я думал связать ноутбук с Github, но, конечно, внешние ссылки в принципе не так уж велики. Хм, [Я полагаю, я просто прошу такую ​​функцию на мета) (http://meta.stackoverflow.com/questions/326619/would-it-be-feasible-to-implement-some-kind-of-integration- для-jupyter-ноутбуков) ... – leftaroundabout

ответ

3

Это ваш второй where пункт:

where 
    swdCorner = Vector3 (v3x split') (minY mbb) (minZ mbb) 
    neuCorner = Vector3 (maxX mbb) (v3y split') (minZ mbb) 

должно быть:

where 
    swdCorner = Vector3 (v3x split') (minY mbb) (minZ mbb) 
    neuCorner = Vector3 (maxX mbb) (v3y split') (v3z split') <-- v3z split'