Files
node-metaverse/lib/tsm/vec2.ts

384 lines
7.1 KiB
TypeScript
Raw Normal View History

/*
* Copyright (c) 2012 Matthias Ferch
*
* Project homepage: https://github.com/matthiasferch/tsm
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not
* be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
///<reference path='./common.ts' />
2017-11-24 01:00:56 +00:00
import {mat3} from './mat3';
import {mat2} from './mat2';
import {vec3} from './vec3';
2017-11-24 01:00:56 +00:00
export class vec2
{
2017-11-24 01:00:56 +00:00
static zero = new vec2([0, 0]);
private values = new Float32Array(2);
static cross(vector: vec2, vector2: vec2, dest: vec3 | null = null): vec3
{
2017-11-24 01:00:56 +00:00
if (!dest)
{
dest = new vec3();
}
2017-11-24 01:00:56 +00:00
const x = vector.x,
y = vector.y;
2017-11-24 01:00:56 +00:00
const x2 = vector2.x,
y2 = vector2.y;
2017-11-24 01:00:56 +00:00
const z = x * y2 - y * x2;
2017-11-24 01:00:56 +00:00
dest.x = 0;
dest.y = 0;
dest.z = z;
2017-11-24 01:00:56 +00:00
return dest;
}
2017-11-24 01:00:56 +00:00
static dot(vector: vec2, vector2: vec2): number
{
return (vector.x * vector2.x + vector.y * vector2.y);
}
2017-11-24 01:00:56 +00:00
static distance(vector: vec2, vector2: vec2): number
{
return Math.sqrt(this.squaredDistance(vector, vector2));
}
2017-11-24 01:00:56 +00:00
static squaredDistance(vector: vec2, vector2: vec2): number
{
const x = vector2.x - vector.x,
y = vector2.y - vector.y;
2017-11-24 01:00:56 +00:00
return (x * x + y * y);
}
2017-11-24 01:00:56 +00:00
static direction(vector: vec2, vector2: vec2, dest: vec2 | null = null): vec2
{
if (!dest)
{
2017-11-24 01:00:56 +00:00
dest = new vec2();
}
2017-11-24 01:00:56 +00:00
const x = vector.x - vector2.x,
y = vector.y - vector2.y;
let length = Math.sqrt(x * x + y * y);
if (length === 0)
{
2017-11-24 01:00:56 +00:00
dest.x = 0;
dest.y = 0;
2017-11-24 01:00:56 +00:00
return dest;
}
2017-11-24 01:00:56 +00:00
length = 1 / length;
2017-11-24 01:00:56 +00:00
dest.x = x * length;
dest.y = y * length;
2017-11-24 01:00:56 +00:00
return dest;
}
2017-11-24 01:00:56 +00:00
static mix(vector: vec2, vector2: vec2, time: number, dest: vec2 | null = null): vec2
{
if (!dest)
{
dest = new vec2();
}
2017-11-24 01:00:56 +00:00
const x = vector.x,
y = vector.y;
2017-11-24 01:00:56 +00:00
const x2 = vector2.x,
y2 = vector2.y;
2017-11-24 01:00:56 +00:00
dest.x = x + time * (x2 - x);
dest.y = y + time * (y2 - y);
2017-11-24 01:00:56 +00:00
return dest;
}
2017-11-24 01:00:56 +00:00
static sum(vector: vec2, vector2: vec2, dest: vec2 | null = null): vec2
{
if (!dest)
{
2017-11-24 01:00:56 +00:00
dest = new vec2();
}
2017-11-24 01:00:56 +00:00
dest.x = vector.x + vector2.x;
dest.y = vector.y + vector2.y;
2017-11-24 01:00:56 +00:00
return dest;
}
2017-11-24 01:00:56 +00:00
static difference(vector: vec2, vector2: vec2, dest: vec2 | null = null): vec2
{
if (!dest)
{
dest = new vec2();
}
2017-11-24 01:00:56 +00:00
dest.x = vector.x - vector2.x;
dest.y = vector.y - vector2.y;
2017-11-24 01:00:56 +00:00
return dest;
}
2017-11-24 01:00:56 +00:00
static product(vector: vec2, vector2: vec2, dest: vec2 | null = null): vec2
{
if (!dest)
{
dest = new vec2();
}
2017-11-24 01:00:56 +00:00
dest.x = vector.x * vector2.x;
dest.y = vector.y * vector2.y;
2017-11-24 01:00:56 +00:00
return dest;
}
2017-11-24 01:00:56 +00:00
static quotient(vector: vec2, vector2: vec2, dest: vec2 | null = null): vec2
{
if (!dest)
{
dest = new vec2();
}
2017-11-24 01:00:56 +00:00
dest.x = vector.x / vector2.x;
dest.y = vector.y / vector2.y;
2017-11-24 01:00:56 +00:00
return dest;
}
2017-11-24 01:00:56 +00:00
get x(): number
{
return this.values[0];
}
2017-11-24 01:00:56 +00:00
get y(): number
{
return this.values[1];
}
2017-11-24 01:00:56 +00:00
get xy(): number[]
{
return [
this.values[0],
this.values[1]
];
}
2017-11-24 01:00:56 +00:00
set x(value: number)
{
this.values[0] = value;
}
2017-11-24 01:00:56 +00:00
set y(value: number)
{
this.values[1] = value;
}
2017-11-24 01:00:56 +00:00
set xy(values: number[])
{
this.values[0] = values[0];
this.values[1] = values[1];
}
2017-11-24 01:00:56 +00:00
constructor(values: number[] | null = null)
{
if (values)
{
2017-11-24 01:00:56 +00:00
this.xy = values;
}
2017-11-24 01:00:56 +00:00
}
2017-11-24 01:00:56 +00:00
at(index: number): number
{
return this.values[index];
}
2017-11-24 01:00:56 +00:00
reset(): void
{
this.x = 0;
this.y = 0;
}
2017-11-24 01:00:56 +00:00
copy(dest: vec2 | null = null): vec2
{
if (!dest)
{
2017-11-24 01:00:56 +00:00
dest = new vec2();
}
2017-11-24 01:00:56 +00:00
dest.x = this.x;
dest.y = this.y;
return dest;
}
negate(dest: vec2 | null = null): vec2
{
if (!dest)
{
2017-11-24 01:00:56 +00:00
dest = this;
}
2017-11-24 01:00:56 +00:00
dest.x = -this.x;
dest.y = -this.y;
return dest;
}
equals(vector: vec2, threshold = EPSILON): boolean
{
if (Math.abs(this.x - vector.x) > threshold)
{
2017-11-24 01:00:56 +00:00
return false;
}
2017-11-24 01:00:56 +00:00
if (Math.abs(this.y - vector.y) > threshold)
{
2017-11-24 01:00:56 +00:00
return false;
}
2017-11-24 01:00:56 +00:00
return true;
}
2017-11-24 01:00:56 +00:00
length(): number
{
return Math.sqrt(this.squaredLength());
}
2017-11-24 01:00:56 +00:00
squaredLength(): number
{
const x = this.x,
y = this.y;
2017-11-24 01:00:56 +00:00
return (x * x + y * y);
}
2017-11-24 01:00:56 +00:00
add(vector: vec2): vec2
{
this.x += vector.x;
this.y += vector.y;
2017-11-24 01:00:56 +00:00
return this;
}
2017-11-24 01:00:56 +00:00
subtract(vector: vec2): vec2
{
this.x -= vector.x;
this.y -= vector.y;
2017-11-24 01:00:56 +00:00
return this;
}
2017-11-24 01:00:56 +00:00
multiply(vector: vec2): vec2
{
this.x *= vector.x;
this.y *= vector.y;
2017-11-24 01:00:56 +00:00
return this;
}
2017-11-24 01:00:56 +00:00
divide(vector: vec2): vec2
{
this.x /= vector.x;
this.y /= vector.y;
2017-11-24 01:00:56 +00:00
return this;
}
2017-11-24 01:00:56 +00:00
scale(value: number, dest: vec2 | null = null): vec2
{
if (!dest)
{
2017-11-24 01:00:56 +00:00
dest = this;
}
2017-11-24 01:00:56 +00:00
dest.x *= value;
dest.y *= value;
2017-11-24 01:00:56 +00:00
return dest;
}
2017-11-24 01:00:56 +00:00
normalize(dest: vec2 | null = null): vec2
{
if (!dest)
{
2017-11-24 01:00:56 +00:00
dest = this;
}
2017-11-24 01:00:56 +00:00
let length = this.length();
2017-11-24 01:00:56 +00:00
if (length === 1)
{
return this;
}
2017-11-24 01:00:56 +00:00
if (length === 0)
{
2017-11-24 01:00:56 +00:00
dest.x = 0;
dest.y = 0;
return dest;
}
2017-11-24 01:00:56 +00:00
length = 1.0 / length;
2017-11-24 01:00:56 +00:00
dest.x *= length;
dest.y *= length;
2017-11-24 01:00:56 +00:00
return dest;
}
2017-11-24 01:00:56 +00:00
multiplyMat2(matrix: mat2, dest: vec2 | null = null): vec2
{
if (!dest)
{
2017-11-24 01:00:56 +00:00
dest = this;
}
2017-11-24 01:00:56 +00:00
return matrix.multiplyVec2(this, dest);
}
2017-11-24 01:00:56 +00:00
multiplyMat3(matrix: mat3, dest: vec2 | null = null): vec2
{
if (!dest)
{
dest = this;
}
2017-11-24 01:00:56 +00:00
return matrix.multiplyVec2(this, dest);
}
}