Add dynamics behavior
This commit is contained in:
@@ -64,7 +64,7 @@ interface IBehaviorParameterOptionItem<T extends IParamType = IParamType> {
|
||||
/**
|
||||
* 参数类型
|
||||
*/
|
||||
type: T;
|
||||
type: T | string;
|
||||
|
||||
/**
|
||||
* 参数默认值
|
||||
@@ -269,6 +269,7 @@ class BehaviorRecorder<
|
||||
this.behaviorId = this.behaviorInstance.behaviorId;
|
||||
this.behaviorName = this.behaviorInstance.behaviorName;
|
||||
this.describe = this.behaviorInstance.describe;
|
||||
this.category = this.behaviorInstance.category;
|
||||
this.terms = this.behaviorInstance.terms;
|
||||
}
|
||||
}
|
||||
@@ -371,7 +372,7 @@ class Behavior<
|
||||
* @param model 模型
|
||||
* @param t 经过时间
|
||||
*/
|
||||
public beforeEffect(individual: Individual, group: Group, model: Model, t: number): void {};
|
||||
public effect(individual: Individual, group: Group, model: Model, t: number): void {};
|
||||
|
||||
/**
|
||||
* 作用影响于个体
|
||||
@@ -380,7 +381,7 @@ class Behavior<
|
||||
* @param model 模型
|
||||
* @param t 经过时间
|
||||
*/
|
||||
public effect(individual: Individual, group: Group, model: Model, t: number): void {};
|
||||
public afterEffect(individual: Individual, group: Group, model: Model, t: number): void {};
|
||||
|
||||
/**
|
||||
* 全部影响作用后
|
||||
@@ -389,7 +390,7 @@ class Behavior<
|
||||
* @param model 模型
|
||||
* @param t 经过时间
|
||||
*/
|
||||
public afterEffect(individual: Individual, group: Group, model: Model, t: number): void {};
|
||||
public finalEffect(individual: Individual, group: Group, model: Model, t: number): void {};
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -330,7 +330,7 @@ class Group extends CtrlObject {
|
||||
* 执行行为影响
|
||||
* @param
|
||||
*/
|
||||
public runner(t: number, effectType: "beforeEffect" | "effect" | "afterEffect" ): void {
|
||||
public runner(t: number, effectType: "finalEffect" | "effect" | "afterEffect" ): void {
|
||||
this.individuals.forEach((individual) => {
|
||||
for(let j = 0; j < this.behaviors.length; j++) {
|
||||
this.behaviors[j][effectType](individual, this, this.model, t);
|
||||
|
||||
@@ -12,9 +12,9 @@ class Individual {
|
||||
* @param y y 坐标
|
||||
* @param z z 坐标
|
||||
*/
|
||||
public static vectorLength(x: number[]): number;
|
||||
public static vectorLength(x: number, y: number, z: number): number;
|
||||
public static vectorLength(x: number | number[], y?: number, z?: number): number {
|
||||
public vectorLength(x: number[]): number;
|
||||
public vectorLength(x: number, y: number, z: number): number;
|
||||
public vectorLength(x: number | number[], y?: number, z?: number): number {
|
||||
if (Array.isArray(x)) {
|
||||
return ((x[0] ?? 0)**2 + (x[1] ?? 0)**2 + (x[2] ?? 0)**2)**.5;
|
||||
} else {
|
||||
@@ -28,10 +28,10 @@ class Individual {
|
||||
* @param y y 坐标
|
||||
* @param z z 坐标
|
||||
*/
|
||||
public static vectorNormalize(x: number[]): [number, number, number];
|
||||
public static vectorNormalize(x: number, y: number, z: number): [number, number, number];
|
||||
public static vectorNormalize(x: number | number[], y?: number, z?: number): [number, number, number] {
|
||||
let length = Individual.vectorLength(x as number, y as number, z as number);
|
||||
public vectorNormalize(x: number[]): [number, number, number];
|
||||
public vectorNormalize(x: number, y: number, z: number): [number, number, number];
|
||||
public vectorNormalize(x: number | number[], y?: number, z?: number): [number, number, number] {
|
||||
let length = this.vectorLength(x as number, y as number, z as number);
|
||||
if (Array.isArray(x)) {
|
||||
return [
|
||||
(x[0] ?? 0) / length,
|
||||
@@ -52,6 +52,39 @@ class Individual {
|
||||
*/
|
||||
public position: number[] = [0, 0, 0];
|
||||
|
||||
/**
|
||||
* 速度
|
||||
*/
|
||||
public velocity: number[] = [0, 0, 0];
|
||||
|
||||
/**
|
||||
* 加速度
|
||||
*/
|
||||
public acceleration: number[] = [0, 0, 0];
|
||||
|
||||
/**
|
||||
* 作用力
|
||||
*/
|
||||
public force: number[] = [0, 0, 0];
|
||||
|
||||
/**
|
||||
* 施加力
|
||||
*/
|
||||
public applyForce(x: number[]): [number, number, number];
|
||||
public applyForce(x: number, y: number, z: number): [number, number, number];
|
||||
public applyForce(x: number | number[], y?: number, z?: number): [number, number, number] {
|
||||
if (Array.isArray(x)) {
|
||||
this.force[0] += x[0] ?? 0;
|
||||
this.force[1] += x[1] ?? 0;
|
||||
this.force[2] += x[2] ?? 0;
|
||||
} else {
|
||||
this.force[0] += x ?? 0;
|
||||
this.force[1] += y ?? 0;
|
||||
this.force[2] += z ?? 0;
|
||||
}
|
||||
return this.force as [number, number, number];
|
||||
}
|
||||
|
||||
/**
|
||||
* 所属群组
|
||||
*/
|
||||
@@ -107,7 +140,7 @@ class Individual {
|
||||
* @param position 目标位置
|
||||
*/
|
||||
public distanceTo(position: Individual | number[]): number {
|
||||
return Individual.vectorLength(this.vectorTo(position));
|
||||
return this.vectorLength(this.vectorTo(position));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -258,7 +258,7 @@ class Model extends Emitter<ModelEvent> {
|
||||
for (let i = 0; i < this.objectPool.length; i++) {
|
||||
let object = this.objectPool[i];
|
||||
if (object instanceof Group && object.update) {
|
||||
object.runner(t, "beforeEffect");
|
||||
object.runner(t, "effect");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -266,7 +266,7 @@ class Model extends Emitter<ModelEvent> {
|
||||
for (let i = 0; i < this.objectPool.length; i++) {
|
||||
let object = this.objectPool[i];
|
||||
if (object instanceof Group && object.update) {
|
||||
object.runner(t, "effect");
|
||||
object.runner(t, "afterEffect");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -274,7 +274,7 @@ class Model extends Emitter<ModelEvent> {
|
||||
for (let i = 0; i < this.objectPool.length; i++) {
|
||||
let object = this.objectPool[i];
|
||||
if (object instanceof Group && object.update) {
|
||||
object.runner(t, "afterEffect");
|
||||
object.runner(t, "finalEffect");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user