@@ -19,6 +19,7 @@ class Demo extends React.Component<{ classes: any }, State> {
1919 private timer : any
2020 private clickTimer : any
2121 private frameInterval = 20
22+ private readonly correctionDelayMs = 50 // Delay before overshoot correction starts
2223
2324 constructor ( props : any ) {
2425 super ( props )
@@ -37,12 +38,16 @@ class Demo extends React.Component<{ classes: any }, State> {
3738 }
3839
3940 /**
40- * Generates a seeded random value for consistent but varied jitter
41- * Uses a simple hash -based PRNG to ensure reproducible jitter patterns
41+ * Generates a seeded random value using a simple LCG algorithm
42+ * Better quality than sin -based PRNG for consistent jitter patterns
4243 */
4344 private seededRandom ( seed : number ) : number {
44- const x = Math . sin ( seed ) * 10000
45- return x - Math . floor ( x )
45+ // Linear Congruential Generator with common constants
46+ const a = 1664525
47+ const c = 1013904223
48+ const m = Math . pow ( 2 , 32 )
49+ const x = ( a * seed + c ) % m
50+ return x / m
4651 }
4752
4853 /**
@@ -94,22 +99,27 @@ class Demo extends React.Component<{ classes: any }, State> {
9499 targetX : number ,
95100 targetY : number
96101 ) : { x : number ; y : number } | null {
102+ const dx = targetX - startX
103+ const dy = targetY - startY
104+ const distance = Math . sqrt ( dx * dx + dy * dy )
105+
106+ // Don't overshoot for very short distances (less than 10px)
107+ if ( distance < 10 ) {
108+ return null
109+ }
110+
97111 // 30% chance of overshoot for natural variation
98112 if ( this . seededRandom ( this . state . jitterSeed * 3 ) > 0.3 ) {
99113 return null
100114 }
101115
102- const dx = targetX - startX
103- const dy = targetY - startY
104- const distance = Math . sqrt ( dx * dx + dy * dy )
105-
106116 // Overshoot by 2-8% of the distance
107117 const overshootPercent = 0.02 + this . seededRandom ( this . state . jitterSeed * 4 ) * 0.06
108118 const overshootDistance = distance * overshootPercent
109119
110120 // Overshoot in the direction of movement
111- const dirX = dx / ( distance || 1 )
112- const dirY = dy / ( distance || 1 )
121+ const dirX = dx / distance
122+ const dirY = dy / distance
113123
114124 return {
115125 x : targetX + dirX * overshootDistance ,
@@ -180,7 +190,8 @@ class Demo extends React.Component<{ classes: any }, State> {
180190 if ( progress < 1 ) {
181191 // Add random delay variation (jitter in timing)
182192 // Frame interval varies between 15-25ms for irregular movement
183- const jitterDelay = this . seededRandom ( this . state . jitterSeed * 6 + elapsed ) * 10 - 5
193+ // Use modulo to keep seed in reasonable range
194+ const jitterDelay = this . seededRandom ( ( this . state . jitterSeed * 6 + elapsed ) % 100000 ) * 10 - 5
184195 const nextInterval = Math . max ( 10 , this . frameInterval + jitterDelay )
185196
186197 this . timer = setTimeout ( ( ) => {
@@ -202,7 +213,7 @@ class Demo extends React.Component<{ classes: any }, State> {
202213 duration : correctionDuration ,
203214 } )
204215 this . moveCloser ( )
205- } , 50 ) // Small delay before correction
216+ } , this . correctionDelayMs )
206217 } else {
207218 // Reset overshoot state for next movement
208219 this . setState ( { isOvershootCorrection : false } )
0 commit comments