fun doLayout()

in plot-base/src/commonMain/kotlin/org/jetbrains/letsPlot/core/plot/base/geom/repel/LabelForceLayout.kt [69:122]


    fun doLayout(): List<LabelItem> {
        val start = systemTime.getTimeMs()
        val pauseIter = 0
        val firstRepulsionIter = 1
        val hideLineIter = 2
        for (iter in 0 until maxIter) {
            if (iter <= pauseIter) continue

            if (iter == firstRepulsionIter) {
                labelItems.forEach { label ->
                    val force = selfRepulsion(label)
                    label.setForce(force)
                }
                continue
            }

            val easeFactor = easeOutQuint(1 - iter.toDouble() / maxIter)
            var overlapsCount = 0

            for (label in labelItems) {
                if (label.hidden) continue

                if (iter % 10 == 0) {
                    resolveSegmentIntersection(label)
                }

                var (force, overlaps) = aggregateForces(label)

                // hide overlapping label
                if (iter == hideLineIter && maxOverlaps >= 0 && overlaps > maxOverlaps) {
                    label.hidden = true
                    continue
                }

                if (overlaps == 0) {
                    force = selfAttraction(label)
                }

                label.setForce(force.mul(easeFactor))
                clampToBounds(label)

                overlapsCount += overlaps
            }

            if (overlapsCount == 0)
                break

            if (maxTime > 0 && systemTime.getTimeMs() - start > maxTime) {
                break
            }
        }

        return labelItems
    }