2017-01-06 18 views
1

Я знаю, что «круговая зависимость - плохой дизайн», но я думаю, что в этом случае это оправданно.Циркулярная зависимость (Voronoi Halfedge)

При построении диаграммы voronoi ячейки делятся на так называемые «половинные края», это позволяет вам удобно перемещать диаграмму.

В любом случае, чтобы создать экземпляр полузадачи, я должен указать зеркало или двойник полузадачи.

Это фанки на любом языке, но в Котлине это еще более раздражает, потому что я должен использовать nullable 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 зеркало никогда не может быть пустым, и должны быть неизменны, но я не вижу, как сообщить, что намерение в моем коде.

ответ

3

Не видя полное определение 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) 

Вы должны создать обе половинки одновременно, и хотя вы можете никогда не ссылайтесь на него, как на обоих краях, так и на их краях, есть ссылка на весь их крайний контейнер, чтобы они могли обращаться друг к другу. Вышеупомянутая реализация может быть легко адаптирована для передачи данных на два полуребра и/или связывания данных со всем краем.

Этот же принцип также может быть реализован с помощью родительского класса «График» или «Сеть» с внутренней двунаправленной картой, краями которой являются зеркала друг друга.

 Смежные вопросы

  • Нет связанных вопросов^_^