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
}