@@ -14,28 +14,47 @@ abstract class BezierValueScaleHelper(
1414 var controlPoint2 : RelativeLocation
1515) :
1616 ScaleHelper (minScale, maxScale, scaleTick) {
17- private val deltaScale = maxScale - minScale
17+ private val deltaScale: Double
18+ get() = maxScale - minScale
1819
19- var bezierPoints = Math3DUtil .generateBezierCurve(
20- RelativeLocation (scaleTick.toDouble(), deltaScale, 0.0 ),
21- controlPoint1, controlPoint2, scaleTick
22- )
20+ var bezierPoints = createBezierPoints()
21+
22+ private fun createBezierPoints (): List <RelativeLocation > {
23+ val target = RelativeLocation (scaleTick.toDouble(), deltaScale, 0.0 )
24+ val (startHandle, endHandle) = resolveControlPoints()
25+ return List (scaleTick + 1 ) { tick ->
26+ RelativeLocation (
27+ tick.toDouble(),
28+ Math3DUtil .evaluateBezierCurveYAtX(
29+ target,
30+ startHandle,
31+ endHandle,
32+ tick.toDouble()
33+ ),
34+ 0.0
35+ )
36+ }
37+ }
38+
39+ private fun resolveControlPoints (): Pair <RelativeLocation , RelativeLocation > {
40+ if (controlPoint2.x > 0.0 && controlPoint2.x <= scaleTick.toDouble()) {
41+ return RelativeLocation (controlPoint1.x, controlPoint1.y - minScale, controlPoint1.z) to
42+ RelativeLocation (controlPoint2.x - scaleTick, controlPoint2.y - maxScale, controlPoint2.z)
43+ }
44+ return controlPoint1.clone() to controlPoint2.clone()
45+ }
2346
2447 override fun recalculateStep (): BezierValueScaleHelper {
2548 val temp = min(minScale, maxScale)
2649 maxScale = max(minScale, maxScale)
2750 minScale = temp
28- bezierPoints = Math3DUtil .generateBezierCurve(
29- RelativeLocation (scaleTick.toDouble(), deltaScale, 0.0 ),
30- controlPoint1, controlPoint2, scaleTick
31- )
51+ bezierPoints = createBezierPoints()
3252 return this
3353 }
3454
3555 override fun toggleScale (scale : Double ) {
36- // 遍历scale?
3756 val currentPoint = bezierPoints.withIndex().minBy {
38- abs(it.value.y - scale)
57+ abs(minScale + it.value.y - scale)
3958 }
4059 current = currentPoint.index
4160 scale(minScale + currentPoint.value.y)
@@ -44,23 +63,18 @@ abstract class BezierValueScaleHelper(
4463 override fun doScale () {
4564 if (getLoadedGroup() == null ) return
4665 if (over()) return
47- val value = bezierPoints[ current++ ].y
48- scale(minScale + value )
66+ current = ( current + 1 ).coerceAtMost(scaleTick)
67+ scale(minScale + bezierPoints[current].y )
4968 }
5069
5170 override fun doScaleTo (current : Int ) {
52- val enter = current.coerceAtLeast( 0 )
71+ val enter = current.coerceIn( 0 , scaleTick )
5372 this .current = enter
54- if (current >= scaleTick) {
55- resetScaleMax()
56- return
57- }
58- if (current <= 0 ) {
59- resetScaleMin()
60- return
73+ when {
74+ enter <= 0 -> scale(minScale)
75+ enter >= scaleTick -> scale(maxScale)
76+ else -> scale(minScale + bezierPoints[enter].y)
6177 }
62- val value = bezierPoints[current].y
63- scale(minScale + value)
6478 }
6579
6680 override fun doScaleReversed () {
@@ -70,7 +84,7 @@ abstract class BezierValueScaleHelper(
7084 if (isZero()) {
7185 return
7286 }
73- val value = bezierPoints[ max(0 , -- current)].y
74- scale(minScale + value )
87+ current = max(0 , current - 1 )
88+ scale(minScale + bezierPoints[current].y )
7589 }
7690}
0 commit comments