gpt4 book ai didi

kotlin - 循环依赖(Voronoi Halfedge)

转载 作者:行者123 更新时间:2023-12-02 13:15:21 25 4
gpt4 key购买 nike

我知道,“循环依赖关系是一个错误的设计”,但我认为在这种情况下,这是有必要的。

在构建voronoi图时,将单元划分为所谓的“半边”,这使您可以方便地遍历图。

无论如何,为了实例化一个半边,我必须指定半边的镜像或两个。

这在任何语言中都很时髦,但是在Kotlin中,这更令人讨厌,因为我必须像我希望的那样使用可为空的var而不是val。

现在我正在做这种我不喜欢的时髦。

val mirrorEdge: HalfEdge
get() = halfEdge!!

private var halfEdge: HalfEdge? = null

fun setMirror(halfEdge: HalfEdge) {
this.halfEdge = halfEdge
}

//别处
newEdge.setMirror(newEdge2)
newEdge2.setMirror(newEdge)

半边镜永远不能为空,并且应该是不可变的,但是我看不出如何在我的代码中传达这种意图。

最佳答案

如果没有看到HalfEdge的完整定义,这可能不起作用,但请考虑以下因素:

interface HalfEdge {
val mirrorHalf: HalfEdge
}

class HalfEdges {
private inner class First : HalfEdge {
override val mirrorHalf: HalfEdge
get() = second
}

private inner class Second : HalfEdge {
override val mirrorHalf: HalfEdge
get() = first
}

val first: HalfEdge = First()
val second: HalfEdge = Second()

operator fun component1() = first
operator fun component2() = second
}

用法:
val (newEdge, newEdge2) = HalfEdges()
check(newEdge == newEdge2.mirrorHalf)
check(newEdge.mirrorHalf == newEdge2)

您必须同时创建两个半部,尽管您可能永远都不能直接对其进行引用,但两个半边都保留了对整个边缘容器的引用,以便它们可以相互访问。上述实施方式可以容易地适于将数据传递到两个半边缘和/或将数据与整个边缘相关联。

同样的原理也可以通过父“Graph”或“Network”类来实现,该类具有内部双向映射,其边缘相互镜像。

关于kotlin - 循环依赖(Voronoi Halfedge),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41514165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com