Algorithm 我的边界框函数哪里出了问题?
我正在为库编写一个边界框模块。你可以找到我的分行。在下面的函数中,我尝试将Algorithm 我的边界框函数哪里出了问题?,algorithm,haskell,data-structures,octree,Algorithm,Haskell,Data Structures,Octree,我正在为库编写一个边界框模块。你可以找到我的分行。在下面的函数中,我尝试将八叉树的隐式边界框显式化。问题是,并非所有边界框都有效 这是有问题的函数,然后是在ghci中复制问题的方法 explicateMBB :: (BBox3, Octree a) -> [BBox3] explicateMBB (mbb, (Leaf _)) = [mbb] explicateMBB (mbb, (Node { split = split', nwu
八叉树的隐式边界框显式化。问题是,并非所有边界框都有效
这是有问题的函数,然后是在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克隆https://github.com/mlitchard/octree.git
git签出MBB
堆栈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)
:m+数据。列表数据。向量。类系统。随机系统。随机。随机数据。边界框。B3
设无穷大=(读“无穷大”)::Double
设swdCorner=Vector3(-无穷大)(-无穷大)(-无穷大)
设neuCorner=Vector3(无穷大)(无穷大)(无穷大)
设rbb=边界_角SWD角neuCorner角
xGen这是您的第二个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'
在哪里
swdCorner=Vector3(v3x拆分’)(最小mbb)(最小mbb)
neuCorner=Vector3(maxX mbb)(v3y split')(v3z split')只是说:这种问题可以更好地呈现出来。@leftaroundabout你能在stackoverflow上使用jupyter吗?@epsilonhalbe:那太棒了!但是没有,实际上我想从Github链接一个笔记本,但是当然外部链接在原则上不是很好。陛下