Skip to content

Commit d6282e6

Browse files
Address code review: improve PRNG quality, handle edge cases, extract constants
Co-authored-by: thomasnordquist <7721625+thomasnordquist@users.noreply.github.com>
1 parent 75d599d commit d6282e6

1 file changed

Lines changed: 23 additions & 12 deletions

File tree

app/src/components/Demo/Mouse.tsx

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)