2017-01-06 5 views
1

私は知っている、 "循環依存性は悪い設計です"しかし、私はこの場合は正当だと思います。円の依存関係(Voronoi Halfedge)

ボロノイ図を作成するとき、セルを「ハーフエッジ」と呼ばれるものに分割します。これにより、図を簡単にトラバースすることができます。

とにかく、ハーフエッジをインスタンス化するには、ミラーまたはハーフエッジの双子を指定する必要があります。

これはどの言語でもファンキーですが、Kotlinではvalの代わりにnull値のvarを使用する必要があるため、Kotlinではさらに迷惑になります。

今私は好きではないこのファンクをやっています。

val mirrorEdge: HalfEdge 
    get() = halfEdge!! 

private var halfEdge: HalfEdge? = null 

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

//他の場所

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

halfedgeミラーがnullになることはありません、と不変でなければなりませんが、私は自分のコードでその意図を伝えるためにどのように表示されません。

答えて

3

HalfEdgeの完全な定義を見ることなく、これは次のように動作しますが考慮しない場合があります:あなたは同時に、あなたがかもしれないが両方の半分を作成する必要が

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

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 
} 

使い方を両方のハーフエンドが直接エッジコンテナへの参照を保持しないようにして、相互にアクセスできるようにします。上記の実装は、データを2つのハーフ・エッジに渡す、および/またはデータをエッジ全体に関連付けるように容易に適合させることができる。

この同じ原理は、エッジが互いに鏡像する内部の双方向マップを持つ親「グラフ」または「ネットワーク」クラスで実装することもできます。