滑塊驗(yàn)證核心是后臺(tái)驗(yàn)證軌跡參數(shù),效驗(yàn)軌跡取點(diǎn)的分布,正常情況是如下圖的離散分布

如果橫坐標(biāo)x是時(shí)間、縱坐標(biāo)y是位移,那么每個(gè)點(diǎn)的切線就是加速度,會(huì)發(fā)現(xiàn)這樣的一個(gè)規(guī)律,加速度由小變大,再又大變小,這是最主要的特征之一。
速度的變化率如下:

對(duì)速度而言肯定是先加速在減速,但加速度不會(huì)是固定的,應(yīng)該是變變加速和變變加速,不過目前實(shí)際應(yīng)用中的情況來說,是以速度變化情況為主要判別依據(jù),因?yàn)樵谝院慵訙p速度生成的軌跡應(yīng)用中一樣可以通過檢測(cè),就說明目前沒有對(duì)是否恒定加速度來鑒別機(jī)器和人工。
知道上面的兩點(diǎn)后我們就應(yīng)該明白滑塊驗(yàn)證的關(guān)鍵,并且可以預(yù)測(cè)它的下一步優(yōu)化方式將是對(duì)加速度變化的驗(yàn)證,收集了兩種軌跡生成方式:一種是以加減速為主的物理學(xué)生成方式,另一種是根據(jù)軌跡離散分布生成的數(shù)學(xué)生成。
def generate_tracks(S):
"""
:param S: 缺口距離Px
:return:
"""
S += 20
v = 0
t = 0.2
forward_tracks = []
current = 0
mid = S * 3 / 5 # 減速閥值
while current < S:
if current < mid:
a = 2 # 加速度為+2
else:
a = -3 # 加速度-3
s = v * t + 0.5 * a * (t ** 2)
v = v + a * t
current += s
forward_tracks.append(round(s))
back_tracks = [-3, -3, -2, -2, -2, -2, -2, -1, -1, -1]
return {'forward_tracks': forward_tracks, 'back_tracks': back_tracks}
傳入距離S,先加上20的距離然后在生成軌跡中再減去20,達(dá)到超過缺口在回滑的效果,以固定周期0.2秒來計(jì)算軌跡和速度。
def ease_out_quad(x):
return 1 - (1 - x) * (1 - x)
def ease_out_quart(x):
return 1 - pow(1 - x, 4)
def ease_out_expo(x):
if x == 1:
return 1
else:
return 1 - pow(2, -10 * x)
def get_tracks(distance, seconds, ease_func):
tracks = [0]
offsets = [0]
for t in np.arange(0.0, seconds, 0.1):
ease = globals()[ease_func]
offset = round(ease(t/seconds) * distance)
tracks.append(offset - offsets[-1])
offsets.append(offset)
return offsets, tracks
這種方式是從時(shí)間出發(fā),在假設(shè)勻速的情況下,把時(shí)間分割成一段一段的,每段都對(duì)應(yīng)一個(gè)軌跡,那么這個(gè)軌跡先大后小如下:
[0, 0.0, 21.0, 16.0, 13.0, 10.0, 9.0, 6.0, 5.0, 4.0, 4.0, 2.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]
目前這兩種軌跡都是可行的,能夠通過騰訊的滑塊驗(yàn)證。
轉(zhuǎn)載自https://yq.aliyun.com/articles/693344