Dependencia circular (Voronoi Halfedge)

Lo sé, "la dependencia circular es un mal layout", pero creo que en este caso está garantizado.

Al build un diagtwig de voronoi, las celdas se dividen en lo que se denominan "medios bordes", esto le permite recorrer el diagtwig de maneras prácticas.

De todos modos, para crear una instancia de un halfedge, tengo que especificar el espejo o gemelo del halfedge.

Esto es funky en cualquier idioma, pero en Kotlin es aún más molesto porque tengo que usar una var de nullable en lugar de un val, como prefiero.

En este momento estoy haciendo este funkiness, que no me gusta;

val mirrorEdge: HalfEdge get() = halfEdge!! private var halfEdge: HalfEdge? = null fun setMirror(halfEdge: HalfEdge) { this.halfEdge = halfEdge } 

//en otra parte

 newEdge.setMirror(newEdge2) newEdge2.setMirror(newEdge) 

Un espejo halfedge nunca puede ser nulo, y debe ser inmutable, pero no veo cómo comunicar esa intención en mi código.

Sin ver la definición completa de HalfEdge esto podría no funcionar, pero considere lo siguiente:

 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 } 

Uso:

 val (newEdge, newEdge2) = HalfEdges() check(newEdge == newEdge2.mirrorHalf) check(newEdge.mirrorHalf == newEdge2) 

Debe crear ambas mitades al mismo time y, aunque es posible que nunca conserve una reference directamente, ambas mitades mantienen una reference a su contenedor de borde completo para que puedan tener acceso el uno al otro. La implementación anterior podría adaptarse fácilmente para pasar datos a los dos medios bordes y / o asociar datos con el borde completo.

Este mismo principio también podría implementarse con una class principal "Gráfico" o "Red" con un map bidireccional interno cuyos bordes se reflejan entre sí.