二次元座標
二次元座標クラス
code: geometry.ts
/**
* 2次元座標クラス
*/
export class Point {
/**
* x座標
*/
x: number;
/**
* y座標
*/
y: number;
/**
* @param x x座標
* @param y y座標
*/
constructor(x?: number, y?: number) {
if (x == null) {
x = 0;
}
if (y == null) {
y = 0;
}
this.x = x;
this.y = y;
}
/**
* 大小関係を比較します,
* 第一キー: x座標, 第二キー: y座標
* @param p 比較される座標
*/
lt(p: Point) {
if (this.eq(p)) {
return 0;
} else {
if (this.x.eq(p.x)) {
return this.y - p.y;
} else {
return this.x - p.x;
}
}
}
/**
* 絶対値を求めます
*/
abs(): number {
return Math.sqrt(this.norm());
}
/**
* 絶対値の二乗を求めます
*/
norm(): number {
return this.x * this.x + this.y * this.y;
}
/**
* 偏角を求めます
*/
arg(): number {
return Math.atan2(this.y, this.x);
}
/**
* x座標を実部, y座標を虚部と見たときに共役な座標を返します
*/
conj(): Point {
return new Point(this.x, -this.y);
}
/**
* 引数と等しいかを比較します
* @param point
*/
eq(point: Point): boolean {
return this.x.eq(point.x) && this.y.eq(point.y);
}
/**
* 引数を加えた座標を求めます
* @param point
*/
plus(point: Point): Point {
return new Point(this.x + point.x, this.y + point.y);
}
/**
* 引数を引いた座標を求めます
* @param point
*/
minus(point: Point): Point {
return new Point(this.x - point.x, this.y - point.y);
}
/**
* 引数との内積を求めます
* @param point
*/
dot(point: Point): number {
return this.x * point.x + this.y * point.y;
}
/**
* 引数との外積を求めます
* @param point
*/
cross(point: Point): number {
return this.x * point.y - this.y * point.x;
}
/**
* 引数との中点を求めます
* @param point
*/
midPoint(point: Point): Point {
return new Point((this.x + point.x) / 2, (this.y + point.y) / 2);
}
/**
* 原点を中心にangleだけ回転させた座標を求めます
* @param angle 回転角(ラジアン)
*/
rotate(angle: number): Point {
return this.mult(Pt(Math.cos(angle), Math.sin(angle)));
}
/**
* 引数を乗算します
* 引数がPoint型の場合は複素数の乗算として扱います。
* @param obj 乗数
*/
mult(obj: Point | number): Point {
if (obj instanceof Point) {
return new Point(
this.x * obj.x - this.y * obj.y,
this.y * obj.x + this.x * obj.y
);
}
return new Point(this.x * obj, this.y * obj);
}
/**
* 引数で除算します
* @param obj 除数
*/
div(obj: Point | number): Point {
if (obj instanceof Point) {
return new Point(
obj.dot(this) / obj.norm(),
obj.cross(this) / obj.norm()
);
}
return this.mult(1 / obj);
}
/**
* 引数の直線に向かって垂直に下ろした座標を返します
* @param line
*/
projectTo(line: LineModel) {
let t =
this.minus(line.points1).dot(line.vector()) * (1 / line.vector().norm());
return line.points1.plus(line.vector().mult(t)); }
/**
* 引数の直線を軸に点対称な座標を返します
* @param line
*/
lineSymmetryBy(line: LineModel) {
return this.plus(this.projectTo(line).minus(this).mult(2));
}
}
二次元面積クラス
code: geometry.js
/**
* 2次元面積クラス(Pointのラッパー)
*/
class SizeModel extends Point {
constructor(width: number, height: number) {
super(width, height);
}
/**
* 幅
*/
get width() {
return this.x;
}
set width(val: number) {
this.x = val;
}
/**
* 高さ
*/
get height() {
return this.y;
}
set height(val: number) {
this.y = val;
}
}