Skip to content

相关计算

规范的判定线事件列表应该满足以下条件:

  • 按照事件的 startTime 从小到大排序。

  • 对于速度事件列表,第一个事件的 startTime0

  • 对于其它事件列表,第一个事件的 startTime 为一个足够小的数,如-999999

  • 紧接着,每个事件的 startTime 应该与上一个事件的 endTime 相等。

  • 最后一个事件的 endTime 为一个足够大的数,如1000000000

满足条件后,我们才能正确进行下面的计算。

速度事件的 floorPosition

速度事件的 floorPosition 表示事件开始时刻的垂直位置,单位 Y

  • 设第 k 个事件的 startTimetkvaluevkfloorPositionpk,则有:

    p1=t11.875BPM=0, pk=pk1+vk1(tktk1)1.875BPM, k2

判定线的实时参数

判定线的实时速度和垂直位置可以通过以下方法计算:

  • 设第 k 个事件的 startTimetkvaluevkfloorPositionpk,则有:

    VJ(t)=vk, PJ(t)=pk+vk(ttk)1.875BPM, tkt<tk+1

    VJ(t) 表示判定线在时刻 t 的速度,单位 Y/s

    PJ(t) 表示判定线在时刻 t 的垂直位置,单位 Y

判定线的其它参数(不透明度、X/Y 坐标、旋转角度)计算较为简单,仅需进行线性插值:

  • 设第 k 个事件的 startTimetkstartskendek,则有:

    SJ(t)=sk+(ttk)eksktk+1tk, tkt<tk+1

    SJ(t) 表示判定线在时刻 t 的参数,单位与 skek 相同。

音符的实时参数

音符的实时参数可以通过以下方法计算:

  • 设音符的 floorPositionpN,判定线在时刻 t 的实时垂直位置为 PJ(t),则有:

    PN(t)=pNPJ(t)

    PN(t) 表示音符在时刻 tcurrentFloorPosition,单位 Y

  • 设音符的 timetN,令 t=tN,则有:

    PN(tN)=pNPJ(tN)

    音符在判定时刻应该与判定线重合,即

    PN(tN)=0pN=PJ(tN)

    由此可知,音符的 floorPosition 应该等于 PJ(tN),确保在判定时刻恰好与判定线重合。

  • 设音符的 holdTimetHspeedη,然后有:

    • 对音符实时垂直距离的计算,视乎音符类型而有所不同。

    非 Hold 音符:

    Y(t)=ηPN(t)=η(pNPJ(t))

    Hold 音符头部,ttN

    Y(t)=PN(t)=pNPJ(t)

    Hold 音符尾部,ttN

    YT(t)=Y(t)+ηtH1.875BPM=pNPJ(t)+ηtH1.875BPM=PJ(tN)PJ(t)+ηtH1.875BPMpN=PJ(tN)

    Hold 音符尾部,tN<ttN+tH

    YT(t)=tN+tHttHYT(tN)=η(tN+tHt)1.875BPMpN=PJ(tN)

    Y(t) 表示音符在时刻 t 的实时垂直距离,单位 Y

    联立上述二式取极限,解得:

    η=limttNPJ(tN)PJ(t)(tNt)1.875BPM=VJ(tN)

    由此可知,Hold 音符的 speed 应该等于 VJ(tN),确保打击时 Hold 尾速度与打击前相同。

CC-BY-NC-4.0 Licensed