Create easy function 40% off set

后端 未结 1 1952
走了就别回头了
走了就别回头了 2020-12-12 07:18

I have animation follows this timing function: cubic-bezier(0.25, 0.1, 0.25, 1.0)

I want to mod this function so i just get the ending 40% of it. To make things easy

相关标签:
1条回答
  • 2020-12-12 07:46

    If you want only a section of a cubic curve, with t from 0 to 1, there are "simple" formulae to determine what the new coordinates need to be. I say simple because it's pretty straight forward to implement, but if you also want to know why the implementation actually works, that generally requires diving into maths, and some people consider that scary.

    (The end result of the section on matrix splitting pretty much gives you the new coordinates for an arbitrary split-point without needing to read the explanation of why that works)

    Let's take your example curve: first, we need to figure out what the curve's original coordinates are. We go with a guess of (0,0)-(0.4,0.25)-(0.2,1)-(1,1). We then want to split that curve up at t=0.4, so we ignore all of section 7 except for the final bit that tells us how to derive new coordinates. For any splitting point t=z (where z is somewhere between 0 and 1` we'll have two new sets of coordinates. One for the curve "before" the splitting point, and one for "after" the splitting point. We want the latter, so we pick:

    coordinate derivation for the post-split curve

    So we just plug in 0.4 for z and off we go. Our new first point is 0.064 * P4 - 3 * 0.096 * P3 + 3 * 0.144 * P2 + 0.216 * P1 = 0.2944 (which we need to evaluate twice. Once for our x values, and one for our y values). We do the same for P2, P3 and P4 (although our fourth point is of course still the same so we don't need to bother. It was (1,1) and is still (1,1) after the split).

    So, let's implement that in javascript:

    function split(options) {
    
      var z = options.z,
          cz = z-1,
          z2 = z*z,
          cz2 = cz*cz,
          z3 = z2*z,
          cz3 = cz2*cz,
          x = options.x,
          y = options.y;
    
      var left = [
        x[0],
        y[0],
        z*x[1] - cz*x[0], 
        z*y[1] - cz*y[0], 
        z2*x[2] - 2*z*cz*x[1] + cz2*x[0],
        z2*y[2] - 2*z*cz*y[1] + cz2*y[0],
        z3*x[3] - 3*z2*cz*x[2] + 3*z*cz2*x[1] - cz3*x[0],
        z3*y[3] - 3*z2*cz*y[2] + 3*z*cz2*y[1] - cz3*y[0]];
    
      var right = [
        z3*x[3] - 3*z2*cz*x[2] + 3*z*cz2*x[1] - cz3*x[0],
        z3*y[3] - 3*z2*cz*y[2] + 3*z*cz2*y[1] - cz3*y[0],
                        z2*x[3] - 2*z*cz*x[2] + cz2*x[1],
                        z2*y[3] - 2*z*cz*y[2] + cz2*y[1],
                                        z*x[3] - cz*x[2], 
                                        z*y[3] - cz*y[2], 
                                                    x[3],
                                                    y[3]];
      return { left: left, right: right};
    }
    

    Done deal. This function will give us two subcurves (called left and right, both Number[8] arrays in x1/y1/x2/y2/... ordering) that are mathematically identical to our original curve if taken together, except modeled as two new t=[0,1] intervals, for any splitting point t=z with z between 0 and 1. Our work is done forever.

    0 讨论(0)
提交回复
热议问题