Add math function into individual and group

This commit is contained in:
MrKBear 2022-02-17 11:52:22 +08:00
parent f999fc1268
commit ff4c85f589
2 changed files with 149 additions and 5 deletions

View File

@ -6,18 +6,75 @@ import { Individual } from "./Individual";
class Group {
/**
*
*
*/
public individuals: Individual[] = [];
public individuals: Set<Individual> = new Set();
/**
*
*
* @param count
*/
public add(count: number = 1) {
public new(count: number = 1): this {
for (let i = 0; i < count; i++) {
this.individuals.push(new Individual(this));
this.individuals.add(new Individual(this));
}
return this;
}
/**
*
* @param individual
*/
public add(individual: Individual[] | Individual): this {
if (Array.isArray(individual)) {
for (let i = 0; i < individual.length; i++) {
this.individuals.add(individual[i]);
}
} else {
this.individuals.add(individual);
}
return this;
}
/**
*
* @param individual
*/
public remove(individual: Individual[] | Individual): this {
if (Array.isArray(individual)) {
for (let i = 0; i < individual.length; i++) {
this.individuals.delete(individual[i]);
}
} else {
this.individuals.delete(individual);
}
return this;
}
/**
*
*
* @param position
* @param distance
* @param excludeSelf
*/
public getIndividualsByDistance(
position: Individual | number[], distance: number, excludeSelf?: boolean
): Individual[] {
const result: Individual[] = [];
this.individuals.forEach(((individual) => {
// 排除自身
if (individual === position && excludeSelf) {
return;
}
if (individual.distanceTo(position) < distance) {
result.push(individual);
}
}));
return result;
}
}
export default Group;

View File

@ -5,6 +5,47 @@ import type { Group } from "./Group";
*/
class Individual {
/**
*
* @param x x |
* @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 {
if (Array.isArray(x)) {
return ((x[0] ?? 0)**2 + (x[1] ?? 0)**2 + (x[2] ?? 0)**2)**.5;
} else {
return ((x ?? 0)**2 + (y ?? 0)**2 + (z ?? 0)**2)**.5;
}
}
/**
*
* @param x x |
* @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);
if (Array.isArray(x)) {
return [
(x[0] ?? 0) / length,
(x[1] ?? 0) / length,
(x[2] ?? 0) / length
];
} else {
return [
(x ?? 0) / length,
(y ?? 0) / length,
(z ?? 0) / length
];
}
}
/**
*
*/
@ -21,6 +62,52 @@ class Individual {
public constructor(group: Group) {
this.group = group;
}
/**
*
*/
public die(): this {
this.group.remove(this);
return this;
}
/**
*
* @param newGroup
*/
public transfer(newGroup: Group): this {
this.group.remove(this);
newGroup.add(this);
this.group = newGroup;
return this;
}
/**
*
*/
public vectorTo(position: Individual | number[]): [number, number, number] {
if (position instanceof Individual) {
return [
position.position[0] - this.position[0],
position.position[1] - this.position[1],
position.position[2] - this.position[2]
];
} else {
return [
(position[0] ?? 0) - this.position[0],
(position[1] ?? 0) - this.position[1],
(position[2] ?? 0) - this.position[2]
];
}
}
/**
*
* @param position
*/
public distanceTo(position: Individual | number[]): number {
return Individual.vectorLength(this.vectorTo(position));
}
}
export default Individual;