From 17ee906f90ba382fa6930bedd02f142f6f9ff1a5 Mon Sep 17 00:00:00 2001 From: MrKBear Date: Wed, 30 Mar 2022 17:19:45 +0800 Subject: [PATCH] Add brownian behavior --- source/Behavior/Behavior.ts | 4 +- source/Behavior/Brownian.ts | 109 ++++++++++++++++++++++ source/Behavior/Template.ts | 11 ++- source/Model/Behavior.ts | 2 +- source/Page/SimulatorWeb/SimulatorWeb.tsx | 7 ++ 5 files changed, 130 insertions(+), 3 deletions(-) create mode 100644 source/Behavior/Brownian.ts diff --git a/source/Behavior/Behavior.ts b/source/Behavior/Behavior.ts index dce8051..90e7119 100644 --- a/source/Behavior/Behavior.ts +++ b/source/Behavior/Behavior.ts @@ -1,9 +1,11 @@ import { BehaviorRecorder, IAnyBehaviorRecorder } from "@Model/Behavior"; import { Template } from "./Template"; import { Dynamics } from "./Dynamics"; +import { Brownian } from "./Brownian"; const AllBehaviors: IAnyBehaviorRecorder[] = [ - new BehaviorRecorder(Dynamics) + new BehaviorRecorder(Dynamics), + new BehaviorRecorder(Brownian) ] /** diff --git a/source/Behavior/Brownian.ts b/source/Behavior/Brownian.ts new file mode 100644 index 0000000..094d00b --- /dev/null +++ b/source/Behavior/Brownian.ts @@ -0,0 +1,109 @@ +import { Behavior } from "@Model/Behavior"; +import { Group } from "@Model/Group"; +import { Individual } from "@Model/Individual"; +import { Model } from "@Model/Model"; + +type IBrownianBehaviorParameter = { + maxFrequency: "number", + minFrequency: "number", + maxStrength: "number", + minStrength: "number" +} + +type IBrownianBehaviorEvent = {} + +class Brownian extends Behavior { + + public override behaviorId: string = "Brownian"; + + public override behaviorName: string = "$Title"; + + public override iconName: string = "Running"; + + public override describe: string = "$Intro"; + + public override category: string = "$Physics"; + + public override parameterOption = { + maxFrequency: { + type: "number", + name: "$Max.Frequency", + defaultValue: 5, + numberStep: .1, + numberMin: 0 + }, + minFrequency: { + type: "number", + name: "$Min.Frequency", + defaultValue: 0, + numberStep: .1, + numberMin: 0 + }, + maxStrength: { + type: "number", + name: "$Max.Strength", + defaultValue: .1, + numberStep: .01, + numberMin: 0 + }, + minStrength: { + type: "number", + name: "$Min.Strength", + defaultValue: 0, + numberStep: .01, + numberMin: 0 + } + }; + + public override terms: Record> = { + "$Title": { + "ZH_CN": "布朗运动", + "EN_US": "Brownian motion" + }, + "$Intro": { + "ZH_CN": "一种无规则的随机运动", + "EN_US": "An irregular random motion" + }, + "$Max.Frequency": { + "ZH_CN": "最大频率", + "EN_US": "Maximum frequency" + }, + "$Min.Frequency": { + "ZH_CN": "最小频率", + "EN_US": "Minimum frequency" + }, + "$Max.Strength": { + "ZH_CN": "最大强度", + "EN_US": "Maximum strength" + }, + "$Min.Strength": { + "ZH_CN": "最小强度", + "EN_US": "Minimum strength" + } + }; + + public effect(individual: Individual, group: Group, model: Model, t: number): void { + + const {maxFrequency, minFrequency, maxStrength, minStrength} = this.parameter; + + let nextTime = individual.getData("Brownian.nextTime") ?? + minFrequency + Math.random() * (maxFrequency - minFrequency); + let currentTime = individual.getData("Brownian.currentTime") ?? 0; + + currentTime += t; + if (currentTime > nextTime) { + individual.applyForce( + minStrength + (Math.random() * 2 - 1) * (maxStrength - minStrength), + minStrength + (Math.random() * 2 - 1) * (maxStrength - minStrength), + minStrength + (Math.random() * 2 - 1) * (maxStrength - minStrength) + ); + nextTime = minFrequency + Math.random() * (maxFrequency - minFrequency); + currentTime = 0; + } + + individual.setData("Brownian.nextTime", nextTime); + individual.setData("Brownian.currentTime", currentTime); + } +} + +export { Brownian }; \ No newline at end of file diff --git a/source/Behavior/Template.ts b/source/Behavior/Template.ts index fca9fd2..b862559 100644 --- a/source/Behavior/Template.ts +++ b/source/Behavior/Template.ts @@ -1,4 +1,7 @@ import { Behavior } from "@Model/Behavior"; +import { Group } from "@Model/Group"; +import { Individual } from "@Model/Individual"; +import { Model } from "@Model/Model"; type ITemplateBehaviorParameter = { @@ -16,7 +19,9 @@ class Template extends Behavior> = { + public override category: string = "$Category"; + + public override terms: Record> = { "$Title": { "ZH_CN": "行为", "EN_US": "Behavior" @@ -26,6 +31,10 @@ class Template extends Behavior