diff --git a/source/Behavior/Brownian.ts b/source/Behavior/Brownian.ts index 5f6293a..fab6cae 100644 --- a/source/Behavior/Brownian.ts +++ b/source/Behavior/Brownian.ts @@ -7,7 +7,9 @@ type IBrownianBehaviorParameter = { maxFrequency: "number", minFrequency: "number", maxStrength: "number", - minStrength: "number" + minStrength: "number", + dirLimit: "boolean", + angle: "number" } type IBrownianBehaviorEvent = {} @@ -28,9 +30,88 @@ class Brownian extends Behavior { const {maxFrequency, minFrequency, maxStrength, minStrength} = this.parameter; @@ -41,11 +122,43 @@ class Brownian extends Behavior nextTime) { + + let randomDir: number[]; + + // 开启角度限制 + if (this.parameter.dirLimit) { + + // 计算当前速度大小 + const vLen = individual.vectorLength(individual.velocity); + + // 随机旋转算法 + if (vLen !== 0) { + randomDir = this.randomFocusRange( + [ + individual.velocity[0] / vLen, + individual.velocity[1] / vLen, + individual.velocity[2] / vLen + ], + this.parameter.angle / 2 + ); + } + + else { + randomDir = this.randomFocus360() + } + } + + // 随机生成算法 + else { + randomDir = this.randomFocus360() + } + individual.applyForce( - minStrength + (Math.random() * 2 - 1) * (maxStrength - minStrength), - minStrength + (Math.random() * 2 - 1) * (maxStrength - minStrength), - minStrength + (Math.random() * 2 - 1) * (maxStrength - minStrength) + minStrength + randomDir[0] * (maxStrength - minStrength), + minStrength + randomDir[1] * (maxStrength - minStrength), + minStrength + randomDir[2] * (maxStrength - minStrength) ); + nextTime = minFrequency + Math.random() * (maxFrequency - minFrequency); currentTime = 0; } @@ -78,7 +191,15 @@ class Brownian extends Behavior