Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/plugins/default-human-emulator/curveLength.ts
1030 views
1
import IPoint from '@secret-agent/interfaces/IPoint';
2
3
// Legendre-Gauss abscissae with n=24 (x_i values, defined at i=n as the roots of the nth order Legendre polynomial Pn(x))
4
const Tvalues = [
5
-0.0640568928626056260850430826247450385909,
6
0.0640568928626056260850430826247450385909,
7
-0.1911188674736163091586398207570696318404,
8
0.1911188674736163091586398207570696318404,
9
-0.3150426796961633743867932913198102407864,
10
0.3150426796961633743867932913198102407864,
11
-0.4337935076260451384870842319133497124524,
12
0.4337935076260451384870842319133497124524,
13
-0.5454214713888395356583756172183723700107,
14
0.5454214713888395356583756172183723700107,
15
-0.6480936519369755692524957869107476266696,
16
0.6480936519369755692524957869107476266696,
17
-0.7401241915785543642438281030999784255232,
18
0.7401241915785543642438281030999784255232,
19
-0.8200019859739029219539498726697452080761,
20
0.8200019859739029219539498726697452080761,
21
-0.8864155270044010342131543419821967550873,
22
0.8864155270044010342131543419821967550873,
23
-0.9382745520027327585236490017087214496548,
24
0.9382745520027327585236490017087214496548,
25
-0.9747285559713094981983919930081690617411,
26
0.9747285559713094981983919930081690617411,
27
-0.9951872199970213601799974097007368118745,
28
0.9951872199970213601799974097007368118745,
29
];
30
31
// Legendre-Gauss weights with n=24 (w_i values, defined by a function linked to in the Bezier primer article)
32
const Cvalues = [
33
0.1279381953467521569740561652246953718517,
34
0.1279381953467521569740561652246953718517,
35
0.1258374563468282961213753825111836887264,
36
0.1258374563468282961213753825111836887264,
37
0.121670472927803391204463153476262425607,
38
0.121670472927803391204463153476262425607,
39
0.1155056680537256013533444839067835598622,
40
0.1155056680537256013533444839067835598622,
41
0.1074442701159656347825773424466062227946,
42
0.1074442701159656347825773424466062227946,
43
0.0976186521041138882698806644642471544279,
44
0.0976186521041138882698806644642471544279,
45
0.086190161531953275917185202983742667185,
46
0.086190161531953275917185202983742667185,
47
0.0733464814110803057340336152531165181193,
48
0.0733464814110803057340336152531165181193,
49
0.0592985849154367807463677585001085845412,
50
0.0592985849154367807463677585001085845412,
51
0.0442774388174198061686027482113382288593,
52
0.0442774388174198061686027482113382288593,
53
0.0285313886289336631813078159518782864491,
54
0.0285313886289336631813078159518782864491,
55
0.0123412297999871995468056670700372915759,
56
0.0123412297999871995468056670700372915759,
57
];
58
59
export default function curveLength(derivativePoint: (t: number) => IPoint) {
60
const z = 0.5;
61
62
let sum = 0;
63
for (let i = 0; i < Tvalues.length; i += 1) {
64
const t = z * Tvalues[i] + z;
65
const { x, y } = derivativePoint(t);
66
const arc = Math.sqrt(x * x + y * y);
67
68
sum += Cvalues[i] * arc;
69
}
70
return z * sum;
71
}
72
73