Driics

Untitled

Jul 20th, 2023
1,177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.47 KB | None | 0 0
  1. abstract class ChartData(points: List<ChartPoint>) : AnimationProvider, Filter {
  2.  
  3.     private val startTime: Long
  4.     private val endTime: Long  
  5.     private val startValue: Double
  6.     private val endValue: Double
  7.     private val pointCount: Int
  8.     private val sortedPoints: List<ChartPoint>
  9.     private val turningPoints: List<ChartPoint>
  10.  
  11.     init {
  12.         val sortedPoints = points.sortedBy { it.date }
  13.         this.sortedPoints = sortedPoints
  14.         this.turningPoints = findTurningPoints(sortedPoints)
  15.        
  16.         val firstPoint = sortedPoints.first()
  17.         startTime = firstPoint.date
  18.         startValue = firstPoint.amount
  19.        
  20.         val lastPoint = sortedPoints.last()
  21.         endTime = lastPoint.date
  22.         endValue = lastPoint.amount
  23.        
  24.         pointCount = sortedPoints.size
  25.     }
  26.  
  27.     private fun findTurningPoints(points: List<ChartPoint>): List<ChartPoint> {
  28.         val turningPoints = mutableListOf<ChartPoint>()
  29.         var prevValue = 0.0
  30.  
  31.         for (i in 1..points.size - 1) {
  32.             val point = points[i]
  33.             val curValue = point.amount
  34.             if (i > 0 && prevValue > curValue != prevValue < curValue) {
  35.                 turningPoints.add(point)
  36.             }
  37.             prevValue = curValue
  38.         }
  39.  
  40.         return turningPoints
  41.     }
  42.  
  43.     fun getStartValue() = startValue
  44.  
  45.     fun getEndValue() = endValue
  46.  
  47.     override fun applyFilter(start: Long, end: Long, range: AmountRange): Boolean {
  48.         if (sortedPoints.isEmpty() || start > endTime || end < startTime) return false
  49.  
  50.         range.min = Double.MAX_VALUE
  51.         range.max = Double.MIN_VALUE
  52.        
  53.         addValueToRange(applyAnimation(start), range)
  54.         addValueToRange(applyAnimation(end), range)
  55.  
  56.         var startIndex = turningPoints.size - 1
  57.         while (startIndex >= 0) {
  58.             if (turningPoints[startIndex].date >= start) break
  59.             startIndex--
  60.         }
  61.        
  62.         for (i in startIndex + 1..turningPoints.size - 1) {
  63.             val point = turningPoints[i]
  64.             if (point.date > end) break
  65.             addValueToRange(point.amount, range)
  66.         }
  67.  
  68.         return true
  69.     }
  70.  
  71.     protected fun getPoints() = sortedPoints
  72.  
  73.     fun getStartTime() = startTime
  74.  
  75.     fun getEndTime() = endTime
  76.  
  77.     private fun addValueToRange(value: Double, range: AmountRange) {
  78.         if (value < range.min) range.min = value
  79.         if (value > range.max) range.max = value
  80.     }
  81.  
  82. }
Advertisement
Add Comment
Please, Sign In to add comment