All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.mdr.ascii.layout.LayerOrderingCalculator.scala Maven / Gradle / Ivy

package com.github.mdr.ascii.layout

import com.github.mdr.ascii.util.Utils

object LayerOrderingCalculator {

  def reorder(layering: Layering): Layering = {
    var previousLayerOpt: Option[Layer] = None
    val newLayers = layering.layers.map { currentLayer ⇒
      val updatedLayer = previousLayerOpt match {
        case Some(previousLayer) ⇒ reorder(previousLayer, currentLayer, layering.edges)
        case None                ⇒ currentLayer
      }
      previousLayerOpt = Some(updatedLayer)
      updatedLayer
    }
    layering.copy(layers = newLayers)
  }

  def reorder(layer1: Layer, layer2: Layer, edges: List[Edge]): Layer = {
    def inVertices(vertex: Vertex): List[Vertex] = edges.collect { case Edge(v1, `vertex`) ⇒ v1 }
    def barycenter(vertex: Vertex): Double = {
      val in = inVertices(vertex)
      in.map(v ⇒ layer1.vertices.indexOf(v).ensuring(_ >= 0)).sum.toDouble / in.size
    }
    val reorderedVertices = layer2.vertices.sortBy(barycenter)
    layer2.copy(vertices = reorderedVertices)
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy