我想将2d numpy数组转换为多边形.性能对我来说非常重要,但我想避免进行C扩展.可以通过侵蚀来制作二进制轮廓图像.然后我发现了这个.它太慢了,有时无法应对侵蚀造成的尖峰.尖峰:
000100
000100
000100
111011
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试:
mat = mat.copy() != 0
mat = mat - scipy.ndimage.binary_erosion(mat)
vertices = np.argwhere(mat)
minx = vertices.min(axis=0)[0]
maxx = vertices.max(axis=0)[0]
vertices_sorted = {}
for x in xrange(minx - 1, maxx + 2):
vertices_sorted[x] = []
for vertex in vertices:
vertices_sorted[vertex[0]].append(vertex[1])
vertex_loop = [(minx, vertices_sorted[minx][0])]
while True:
x, y = vertex_loop[-1]
for column, row in ((x, y + 1), (x, y - 1),
(x + 1, y), (x + 1, y + 1), …Run Code Online (Sandbox Code Playgroud) 我为榆树缺少单子而苦苦挣扎。实现Elm状态monad的库(http://package.elm-lang.org/packages/folkertdev/elm-state/latest/State)对我有很大帮助。
问题是,当我只想分别使用Result和State类型时,现在遇到了交替嵌套的Result和State类型的情况。
我尝试编写具有以下签名的函数,但似乎不可能,因为内部Result仅在评估外部State后才知道。
join : Result a (State s (Result a (State s x))) -> Result a (State s x)
Run Code Online (Sandbox Code Playgroud)
如果我将Result放入返回值中的State中,则可能会起作用,但是如果外部Result为,那会生成一个哑状态Err。
我认为正确的想法是做出既是结果又是状态的东西。熟悉Haskell monad变压器的人可以解释他们如何解决此类问题或提出替代解决方案吗?
这是一个出现问题的地方的粗略版本:
generateConstraints environment value
|> Result.map (State.map (\(value, valueC) ->
Result.map
(State.map2 (\this (body, bodyC) ->
( this
, valueC ++ bodyC ++ [(this, body)]
))
freshTypevar)
(generateConstraints (extend environment name value) body))
)
Run Code Online (Sandbox Code Playgroud) 盒子和数组是可复制的,为什么这不能编译?
#[derive(Debug, Copy, Clone)]
enum Octree{
Branch(Box<[Octree; 8]>),
Filled,
Empty,
}
Run Code Online (Sandbox Code Playgroud)
编译错误:
main.rs:3:17: 3:21 error: the trait `Copy` may not be implemented for this type; variant `Branch` does not implement `Copy` [E0205]
Run Code Online (Sandbox Code Playgroud)
编辑:好的,所以我不想Octree复制.但是我如何让它变得可变?我希望能够更改节点的子节点.