41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
import Vector2d from "./Vector2d";
|
|
|
|
export default class LineLinear2d {
|
|
public A: number;
|
|
public B: number;
|
|
public C: number;
|
|
|
|
constructor(pP1: Vector2d = Vector2d.Empty, pP2: Vector2d = Vector2d.Empty) {
|
|
this.A = pP1.Y - pP2.Y;
|
|
this.B = pP2.X - pP1.X;
|
|
this.C = pP1.X * pP2.Y - pP2.X * pP1.Y;
|
|
}
|
|
|
|
public SetFromCoefficients(a: number, b: number, c: number): LineLinear2d {
|
|
this.A = a;
|
|
this.B = b;
|
|
this.C = c;
|
|
|
|
return this;
|
|
}
|
|
|
|
public Collide(pLine: LineLinear2d): Vector2d {
|
|
return LineLinear2d.Collide(this, pLine);
|
|
}
|
|
|
|
public static Collide(pLine1: LineLinear2d, pLine2: LineLinear2d): Vector2d {
|
|
return LineLinear2d.CollideCoeff(pLine1.A, pLine1.B, pLine1.C, pLine2.A, pLine2.B, pLine2.C);
|
|
}
|
|
|
|
public static CollideCoeff(A1: number, B1: number, C1: number, A2: number, B2: number, C2: number): Vector2d {
|
|
const WAB = A1 * B2 - A2 * B1;
|
|
const WBC = B1 * C2 - B2 * C1;
|
|
const WCA = C1 * A2 - C2 * A1;
|
|
|
|
return WAB === 0 ? Vector2d.Empty : new Vector2d(WBC / WAB, WCA / WAB);
|
|
}
|
|
|
|
public Contains(point: Vector2d): boolean {
|
|
return Math.abs((point.X * this.A + point.Y * this.B + this.C)) < Number.EPSILON;
|
|
}
|
|
} |