@fbltd/math 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/bin/index.js +17 -0
  2. package/dist/bin/src/angle.js +80 -0
  3. package/dist/bin/src/colors/color.js +18 -0
  4. package/dist/bin/src/colors/conic.gradient.js +97 -0
  5. package/dist/bin/src/colors/index.js +18 -0
  6. package/dist/bin/src/figures/circle.js +15 -0
  7. package/dist/bin/src/figures/index.js +19 -0
  8. package/dist/bin/src/figures/point.js +21 -0
  9. package/dist/bin/src/figures/straight-line.js +19 -0
  10. package/dist/bin/src/index.js +22 -0
  11. package/dist/bin/src/matrix.js +34 -0
  12. package/dist/bin/src/operator.js +23 -0
  13. package/dist/bin/src/utils.js +22 -0
  14. package/dist/types/index.d.ts +1 -0
  15. package/dist/types/src/angle.d.ts +14 -0
  16. package/dist/types/src/colors/color.d.ts +7 -0
  17. package/dist/types/src/colors/conic.gradient.d.ts +17 -0
  18. package/dist/types/src/colors/index.d.ts +2 -0
  19. package/dist/types/src/figures/circle.d.ts +8 -0
  20. package/dist/types/src/figures/index.d.ts +3 -0
  21. package/dist/types/src/figures/point.d.ts +5 -0
  22. package/dist/types/src/figures/straight-line.d.ts +8 -0
  23. package/dist/types/src/index.d.ts +6 -0
  24. package/dist/types/src/matrix.d.ts +14 -0
  25. package/dist/types/src/operator.d.ts +7 -0
  26. package/dist/types/src/utils.d.ts +3 -0
  27. package/package.json +9 -3
  28. package/bundler.config.json +0 -6
  29. package/index.ts +0 -1
  30. package/src/angle.ts +0 -87
  31. package/src/colors/color.ts +0 -11
  32. package/src/colors/conic.gradient.ts +0 -105
  33. package/src/colors/index.ts +0 -2
  34. package/src/figures/circle.ts +0 -12
  35. package/src/figures/index.ts +0 -3
  36. package/src/figures/point.ts +0 -23
  37. package/src/figures/straight-line.ts +0 -15
  38. package/src/index.ts +0 -6
  39. package/src/matrix.ts +0 -32
  40. package/src/operator.ts +0 -23
  41. package/src/utils.ts +0 -17
  42. package/tsconfig.json +0 -10
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./src"), exports);
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Angle = exports.AngleUnits = void 0;
5
+ var utils_1 = require("./utils");
6
+ var AngleUnits;
7
+ (function (AngleUnits) {
8
+ AngleUnits[AngleUnits["Deg"] = 0] = "Deg";
9
+ AngleUnits[AngleUnits["Rad"] = 1] = "Rad";
10
+ AngleUnits[AngleUnits["Turn"] = 2] = "Turn";
11
+ })(AngleUnits || (exports.AngleUnits = AngleUnits = {}));
12
+ var Angle = (function () {
13
+ function Angle() {
14
+ }
15
+ Angle.toRad = function (angle, unit) {
16
+ if (unit === void 0) { unit = AngleUnits.Deg; }
17
+ switch (unit) {
18
+ case AngleUnits.Rad:
19
+ return angle;
20
+ case AngleUnits.Deg:
21
+ return angle * Math.PI / 180;
22
+ case AngleUnits.Turn:
23
+ return Math.PI * 2 * angle;
24
+ }
25
+ };
26
+ Angle.toTurn = function (angle, unit) {
27
+ if (unit === void 0) { unit = AngleUnits.Deg; }
28
+ switch (unit) {
29
+ case AngleUnits.Turn:
30
+ return angle;
31
+ case AngleUnits.Deg:
32
+ return angle / 360;
33
+ case AngleUnits.Rad:
34
+ return angle / (Math.PI * 2);
35
+ }
36
+ };
37
+ Angle.toDeg = function (angle, unit) {
38
+ if (unit === void 0) { unit = AngleUnits.Rad; }
39
+ switch (unit) {
40
+ case AngleUnits.Deg:
41
+ return angle;
42
+ case AngleUnits.Turn:
43
+ return angle * 360;
44
+ case AngleUnits.Rad:
45
+ return angle * 180 / Math.PI;
46
+ }
47
+ };
48
+ Angle.toPositive = function (angle, unit) {
49
+ switch (unit) {
50
+ case AngleUnits.Deg:
51
+ return (0, utils_1.toPositive)(angle, 360);
52
+ case AngleUnits.Turn:
53
+ return (0, utils_1.toPositive)(angle, 1);
54
+ case AngleUnits.Rad:
55
+ return (0, utils_1.toPositive)(angle, Math.PI * 2);
56
+ }
57
+ };
58
+ Angle.normalize = function (angle, unit) {
59
+ switch (unit) {
60
+ case AngleUnits.Deg:
61
+ return Angle.toPositive(angle, unit) % 360;
62
+ case AngleUnits.Rad:
63
+ return Angle.toPositive(angle, unit) % (Math.PI * 2);
64
+ case AngleUnits.Turn:
65
+ return Angle.toPositive(angle, unit) % 1;
66
+ }
67
+ };
68
+ Angle.toCSS = function (angle, unit) {
69
+ if (!(0, utils_1.isCorrectNumber)(angle))
70
+ return '';
71
+ return "rotate(".concat(angle).concat(Angle.angleUnitCorrespondence[unit], ")");
72
+ };
73
+ Angle.angleUnitCorrespondence = (_a = {},
74
+ _a[AngleUnits.Rad] = 'rad',
75
+ _a[AngleUnits.Turn] = 'turn',
76
+ _a[AngleUnits.Deg] = 'deg',
77
+ _a);
78
+ return Angle;
79
+ }());
80
+ exports.Angle = Angle;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Color = void 0;
4
+ var Color = (function () {
5
+ function Color(red, green, blue) {
6
+ this.red = red;
7
+ this.green = green;
8
+ this.blue = blue;
9
+ this.red = Math.max(Math.min(red, 255), 0);
10
+ this.green = Math.max(Math.min(green, 255), 0);
11
+ this.blue = Math.max(Math.min(blue, 255), 0);
12
+ }
13
+ Color.prototype.toCSS = function () {
14
+ return "rgb(".concat(this.red, ", ").concat(this.green, ", ").concat(this.blue, ")");
15
+ };
16
+ return Color;
17
+ }());
18
+ exports.Color = Color;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
+ if (ar || !(i in from)) {
5
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
+ ar[i] = from[i];
7
+ }
8
+ }
9
+ return to.concat(ar || Array.prototype.slice.call(from));
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ConicGradient = void 0;
13
+ var color_1 = require("./color");
14
+ var ConicGradient = (function () {
15
+ function ConicGradient() {
16
+ var colors = [];
17
+ for (var _i = 0; _i < arguments.length; _i++) {
18
+ colors[_i] = arguments[_i];
19
+ }
20
+ this.colors = __spreadArray([], colors, true).sort(function (a, b) { return a.angle - b.angle; });
21
+ this.colors.push({
22
+ angle: 1,
23
+ color: this.colors[0].color
24
+ });
25
+ }
26
+ ConicGradient.prototype.getColorAtAngle = function (angle) {
27
+ var prev = undefined;
28
+ var next = undefined;
29
+ for (var _i = 0, _a = this.colors; _i < _a.length; _i++) {
30
+ var color = _a[_i];
31
+ if (color.angle === angle)
32
+ return color.color;
33
+ if (color.angle < angle)
34
+ prev = color;
35
+ if (color.angle > angle) {
36
+ next = color;
37
+ break;
38
+ }
39
+ }
40
+ if (!prev || !next)
41
+ return undefined;
42
+ var coef = (angle - prev.angle) / (next.angle - prev.angle);
43
+ return new color_1.Color(Math.floor((next.color.red - prev.color.red) * coef + prev.color.red), Math.floor((next.color.green - prev.color.green) * coef + prev.color.green), Math.floor((next.color.blue - prev.color.blue) * coef + prev.color.blue));
44
+ };
45
+ ConicGradient.prototype.getAngleByColor = function (color) {
46
+ var prev;
47
+ var next = this.colors[0];
48
+ if (color.red === next.color.red && color.green === next.color.green && color.blue === next.color.blue)
49
+ return next.angle;
50
+ for (var i = 1; i < this.colors.length; i++) {
51
+ next = this.colors[i];
52
+ prev = this.colors[i - 1];
53
+ if (color.red === next.color.red && color.green === next.color.green && color.blue === next.color.blue)
54
+ return next.angle;
55
+ var redDif = next.color.red - prev.color.red;
56
+ var greenDif = next.color.green - prev.color.green;
57
+ var blueDif = next.color.blue - prev.color.blue;
58
+ var redDifColor = color.red - prev.color.red;
59
+ var greenDifColor = color.green - prev.color.green;
60
+ var blueDifColor = color.blue - prev.color.blue;
61
+ if (((redDifColor >= 0 && redDifColor <= redDif) || (redDifColor <= 0 && redDifColor >= redDif)) &&
62
+ ((greenDifColor >= 0 && greenDifColor <= greenDif) || (greenDifColor <= 0 && greenDifColor >= greenDif)) &&
63
+ ((blueDifColor >= 0 && blueDifColor <= blueDif) || (blueDifColor <= 0 && blueDifColor >= blueDif))) {
64
+ var redCoef = ((color.red - prev.color.red) / (next.color.red - prev.color.red));
65
+ var greenCoef = ((color.green - prev.color.green) / (next.color.green - prev.color.green));
66
+ var blueCoef = ((color.blue - prev.color.blue) / (next.color.blue - prev.color.blue));
67
+ var coefs = [redCoef, greenCoef, blueCoef].filter(Boolean);
68
+ return (next.angle - prev.angle) * Math.min.apply(Math, coefs) + prev.angle;
69
+ }
70
+ }
71
+ return undefined;
72
+ };
73
+ ConicGradient.prototype.isColorInRange = function (color) {
74
+ return Boolean(this.getAngleByColor(color));
75
+ };
76
+ ConicGradient.prototype.toCanvas = function (ctx, center) {
77
+ var gradient = ctx.createConicGradient.apply(ctx, __spreadArray([0], center, false));
78
+ for (var _i = 0, _a = this.colors; _i < _a.length; _i++) {
79
+ var color = _a[_i];
80
+ gradient.addColorStop(color.angle, color.color.toCSS());
81
+ }
82
+ return gradient;
83
+ };
84
+ ConicGradient.prototype.toCSS = function () {
85
+ var s = '';
86
+ for (var _i = 0, _a = this.colors; _i < _a.length; _i++) {
87
+ var color = _a[_i];
88
+ if (s)
89
+ s += ',';
90
+ s += "rgb(".concat(color.color.red, ",").concat(color.color.green, ",").concat(color.color.blue, ")");
91
+ }
92
+ s = "conic-gradient(in srgb from 0.25turn at 50% 50%, ".concat(s, ")");
93
+ return s;
94
+ };
95
+ return ConicGradient;
96
+ }());
97
+ exports.ConicGradient = ConicGradient;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./color"), exports);
18
+ __exportStar(require("./conic.gradient"), exports);
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Circle = void 0;
4
+ var matrix_1 = require("../matrix");
5
+ var Circle = (function () {
6
+ function Circle(center, r) {
7
+ this.center = center;
8
+ this.r = r;
9
+ }
10
+ Circle.prototype.transform = function (matrix) {
11
+ this.center = matrix_1.Matrix2d.apply(matrix, this.center);
12
+ };
13
+ return Circle;
14
+ }());
15
+ exports.Circle = Circle;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./point"), exports);
18
+ __exportStar(require("./circle"), exports);
19
+ __exportStar(require("./straight-line"), exports);
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Point2 = void 0;
4
+ var Point2 = (function () {
5
+ function Point2() {
6
+ }
7
+ Point2.sum = function (p1, p2) {
8
+ return [
9
+ p1[0] + p2[0],
10
+ p1[1] + p2[1],
11
+ ];
12
+ };
13
+ Point2.scale = function (v, factor) {
14
+ return [
15
+ v[0] * factor,
16
+ v[1] * factor,
17
+ ];
18
+ };
19
+ return Point2;
20
+ }());
21
+ exports.Point2 = Point2;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StraightLine = void 0;
4
+ var matrix_1 = require("../matrix");
5
+ var StraightLine = (function () {
6
+ function StraightLine(p1, p2) {
7
+ this.p1 = p1;
8
+ this.p2 = p2;
9
+ }
10
+ StraightLine.prototype.transform = function (matrix, transformThis) {
11
+ if (transformThis === void 0) { transformThis = false; }
12
+ if (transformThis) {
13
+ return this;
14
+ }
15
+ return new StraightLine(matrix_1.Matrix2d.apply(matrix, this.p1), matrix_1.Matrix2d.apply(matrix, this.p2));
16
+ };
17
+ return StraightLine;
18
+ }());
19
+ exports.StraightLine = StraightLine;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./angle"), exports);
18
+ __exportStar(require("./matrix"), exports);
19
+ __exportStar(require("./operator"), exports);
20
+ __exportStar(require("./utils"), exports);
21
+ __exportStar(require("./colors"), exports);
22
+ __exportStar(require("./figures"), exports);
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Matrix2d = exports.identityMatrix = void 0;
4
+ exports.identityMatrix = [1, 0, 0, 1, 0, 0];
5
+ var Matrix2d = (function () {
6
+ function Matrix2d() {
7
+ }
8
+ Matrix2d.multiply = function (matrix) {
9
+ var matrices = [];
10
+ for (var _i = 1; _i < arguments.length; _i++) {
11
+ matrices[_i - 1] = arguments[_i];
12
+ }
13
+ for (var _a = 0, matrices_1 = matrices; _a < matrices_1.length; _a++) {
14
+ var m = matrices_1[_a];
15
+ matrix = [
16
+ matrix[0] * m[0] + matrix[2] * m[1],
17
+ matrix[1] * m[0] + matrix[3] * m[1],
18
+ matrix[0] * m[2] + matrix[2] * m[3],
19
+ matrix[1] * m[2] + matrix[3] * m[3],
20
+ matrix[0] * m[4] + matrix[2] * m[5] + matrix[4],
21
+ matrix[1] * m[4] + matrix[3] * m[5] + matrix[5],
22
+ ];
23
+ }
24
+ return matrix;
25
+ };
26
+ Matrix2d.apply = function (matrix, point) {
27
+ return [
28
+ matrix[0] * point[0] + matrix[2] * point[1] + matrix[4],
29
+ matrix[1] * point[0] + matrix[3] * point[1] + matrix[5],
30
+ ];
31
+ };
32
+ return Matrix2d;
33
+ }());
34
+ exports.Matrix2d = Matrix2d;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Operator = void 0;
4
+ var angle_1 = require("./angle");
5
+ var Operator = (function () {
6
+ function Operator() {
7
+ }
8
+ Operator.rotateIdentity = function (angle, unit) {
9
+ if (unit === void 0) { unit = angle_1.AngleUnits.Deg; }
10
+ angle = angle_1.Angle.toRad(angle, unit);
11
+ this.temp1 = Math.cos(angle);
12
+ this.temp2 = Math.sin(angle);
13
+ return [
14
+ this.temp1,
15
+ this.temp2,
16
+ -this.temp2,
17
+ this.temp1,
18
+ 0, 0
19
+ ];
20
+ };
21
+ return Operator;
22
+ }());
23
+ exports.Operator = Operator;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.approximately = approximately;
4
+ exports.toPositive = toPositive;
5
+ exports.isCorrectNumber = isCorrectNumber;
6
+ function approximately(theValue, is, withPrecision) {
7
+ if (withPrecision === void 0) { withPrecision = 1e-8; }
8
+ return Math.abs(theValue - is) <= withPrecision;
9
+ }
10
+ function toPositive(value, range) {
11
+ if (value >= 0)
12
+ return Math.abs(value);
13
+ return Math.abs((range + value % range) % range);
14
+ }
15
+ function isCorrectNumber(value) {
16
+ var v = +value;
17
+ if (!isNaN(value) && isFinite(value)) {
18
+ v = parseFloat(value);
19
+ return !isNaN(v) && isFinite(v);
20
+ }
21
+ return false;
22
+ }
@@ -0,0 +1 @@
1
+ export * from './src';
@@ -0,0 +1,14 @@
1
+ export declare enum AngleUnits {
2
+ Deg = 0,
3
+ Rad = 1,
4
+ Turn = 2
5
+ }
6
+ export declare class Angle {
7
+ static toRad(angle: number, unit?: AngleUnits): number;
8
+ static toTurn(angle: number, unit?: AngleUnits): number;
9
+ static toDeg(angle: number, unit?: AngleUnits): number;
10
+ static toPositive(angle: number, unit: AngleUnits): number;
11
+ static normalize(angle: number, unit: AngleUnits): number;
12
+ static toCSS(angle: number, unit: AngleUnits): string;
13
+ static angleUnitCorrespondence: Record<AngleUnits, string>;
14
+ }
@@ -0,0 +1,7 @@
1
+ export declare class Color {
2
+ red: number;
3
+ green: number;
4
+ blue: number;
5
+ constructor(red: number, green: number, blue: number);
6
+ toCSS(): string;
7
+ }
@@ -0,0 +1,17 @@
1
+ import { Color } from "./color";
2
+ import { IPoint2 } from "../figures";
3
+ export declare class ConicGradient {
4
+ colors: {
5
+ angle: number;
6
+ color: Color;
7
+ }[];
8
+ constructor(...colors: {
9
+ angle: number;
10
+ color: Color;
11
+ }[]);
12
+ getColorAtAngle(angle: number): Color;
13
+ getAngleByColor(color: Color): number;
14
+ isColorInRange(color: Color): boolean;
15
+ toCanvas(ctx: CanvasRenderingContext2D, center: IPoint2): CanvasGradient;
16
+ toCSS(): string;
17
+ }
@@ -0,0 +1,2 @@
1
+ export * from './color';
2
+ export * from './conic.gradient';
@@ -0,0 +1,8 @@
1
+ import { IPoint2 } from "./point";
2
+ import { IMatrix2d } from "../matrix";
3
+ export declare class Circle {
4
+ center: IPoint2;
5
+ r: number;
6
+ constructor(center: IPoint2, r: number);
7
+ transform(matrix: IMatrix2d): void;
8
+ }
@@ -0,0 +1,3 @@
1
+ export * from './point';
2
+ export * from './circle';
3
+ export * from './straight-line';
@@ -0,0 +1,5 @@
1
+ export type IPoint2 = [number, number];
2
+ export declare class Point2 {
3
+ static sum(p1: IPoint2, p2: IPoint2): IPoint2;
4
+ static scale(v: IPoint2, factor: number): IPoint2;
5
+ }
@@ -0,0 +1,8 @@
1
+ import { IPoint2 } from "./point";
2
+ import { IMatrix2d } from "../matrix";
3
+ export declare class StraightLine {
4
+ p1: IPoint2;
5
+ p2: IPoint2;
6
+ constructor(p1: IPoint2, p2: IPoint2);
7
+ transform(matrix: IMatrix2d, transformThis?: boolean): StraightLine;
8
+ }
@@ -0,0 +1,6 @@
1
+ export * from './angle';
2
+ export * from './matrix';
3
+ export * from './operator';
4
+ export * from './utils';
5
+ export * from './colors';
6
+ export * from './figures';
@@ -0,0 +1,14 @@
1
+ import { IPoint2 } from "./figures";
2
+ export type IMatrix2d = [
3
+ number,
4
+ number,
5
+ number,
6
+ number,
7
+ number,
8
+ number
9
+ ];
10
+ export declare const identityMatrix: IMatrix2d;
11
+ export declare class Matrix2d {
12
+ static multiply(matrix: IMatrix2d, ...matrices: IMatrix2d[]): IMatrix2d;
13
+ static apply(matrix: IMatrix2d, point: IPoint2): IPoint2;
14
+ }
@@ -0,0 +1,7 @@
1
+ import { IMatrix2d } from "./matrix";
2
+ import { AngleUnits } from "./angle";
3
+ export declare class Operator {
4
+ private static temp1;
5
+ private static temp2;
6
+ static rotateIdentity(angle: number, unit?: AngleUnits): IMatrix2d;
7
+ }
@@ -0,0 +1,3 @@
1
+ export declare function approximately(theValue: number, is: number, withPrecision?: number): boolean;
2
+ export declare function toPositive(value: number, range: number): number;
3
+ export declare function isCorrectNumber(value: any): boolean;
package/package.json CHANGED
@@ -1,10 +1,16 @@
1
1
  {
2
2
  "name": "@fbltd/math",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "",
5
- "main": "index.ts",
5
+ "main": "dist/bin/index.js",
6
+ "types": "dist/types/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "README.ms"
10
+ ],
6
11
  "scripts": {
7
- "build": "node_modules/.bin/tsc",
12
+ "build": "rm -r dist || echo '' && node_modules/.bin/tsc",
13
+ "deploy": "npm run build && npm version patch && git push && npm publish",
8
14
  "test": "echo \"Error: no test specified\" && exit 1"
9
15
  },
10
16
  "repository": {
@@ -1,6 +0,0 @@
1
- {
2
- "mode": "development",
3
- "entry": "index.ts",
4
- "output": "dist/bundled-file.js",
5
- "library": "math"
6
- }
package/index.ts DELETED
@@ -1 +0,0 @@
1
- export * from './src'
package/src/angle.ts DELETED
@@ -1,87 +0,0 @@
1
- import {isCorrectNumber, toPositive} from "./utils";
2
-
3
- export enum AngleUnits {
4
- Deg = 0,
5
- Rad = 1,
6
- Turn = 2,
7
- }
8
-
9
-
10
- export class Angle {
11
-
12
- // region Converters
13
- static toRad(angle: number, unit: AngleUnits = AngleUnits.Deg) {
14
- switch (unit) {
15
- case AngleUnits.Rad:
16
- return angle
17
- case AngleUnits.Deg:
18
- return angle * Math.PI / 180
19
- case AngleUnits.Turn:
20
- return Math.PI * 2 * angle
21
- }
22
- }
23
-
24
- static toTurn(angle: number, unit: AngleUnits = AngleUnits.Deg) {
25
- switch (unit) {
26
- case AngleUnits.Turn:
27
- return angle
28
- case AngleUnits.Deg:
29
- return angle / 360
30
- case AngleUnits.Rad:
31
- return angle / (Math.PI * 2)
32
- }
33
- }
34
-
35
- static toDeg(angle: number, unit: AngleUnits = AngleUnits.Rad) {
36
- switch (unit) {
37
- case AngleUnits.Deg:
38
- return angle
39
- case AngleUnits.Turn:
40
- return angle * 360
41
- case AngleUnits.Rad:
42
- return angle * 180 / Math.PI
43
- }
44
- }
45
-
46
- // endregion Converters
47
-
48
- static toPositive(angle: number, unit: AngleUnits) {
49
- switch (unit) {
50
- case AngleUnits.Deg:
51
- return toPositive(angle, 360)
52
- case AngleUnits.Turn:
53
- return toPositive(angle, 1)
54
- case AngleUnits.Rad:
55
- return toPositive(angle, Math.PI * 2)
56
- }
57
- }
58
-
59
- static normalize(angle: number, unit: AngleUnits) {
60
- switch (unit) {
61
- // 0 - 359.9999
62
- case AngleUnits.Deg:
63
- return Angle.toPositive(angle, unit) % 360
64
- // 0 - Math.PI * 2
65
- case AngleUnits.Rad:
66
- return Angle.toPositive(angle, unit) % (Math.PI * 2)
67
- // 0 - 1
68
- case AngleUnits.Turn:
69
- return Angle.toPositive(angle, unit) % 1
70
- }
71
- }
72
-
73
- // region representation
74
- static toCSS(angle: number, unit: AngleUnits) {
75
- if (!isCorrectNumber(angle)) return ''
76
- return `rotate(${angle}${Angle.angleUnitCorrespondence[unit]})`
77
- }
78
-
79
- static angleUnitCorrespondence: Record<AngleUnits, string> = {
80
- [AngleUnits.Rad]: 'rad',
81
- [AngleUnits.Turn]: 'turn',
82
- [AngleUnits.Deg]: 'deg',
83
- }
84
- // endregion representation
85
-
86
- }
87
-
@@ -1,11 +0,0 @@
1
- export class Color {
2
- constructor(public red: number, public green: number, public blue: number) {
3
- this.red = Math.max(Math.min(red, 255), 0)
4
- this.green = Math.max(Math.min(green, 255), 0)
5
- this.blue = Math.max(Math.min(blue, 255), 0)
6
- }
7
-
8
- toCSS() {
9
- return `rgb(${this.red}, ${this.green}, ${this.blue})`
10
- }
11
- }
@@ -1,105 +0,0 @@
1
- import {Color} from "./color";
2
- import {IPoint2} from "../figures";
3
-
4
- export class ConicGradient {
5
- colors: { angle: number, color: Color }[]
6
-
7
- constructor(...colors: { angle: number, color: Color }[]) {
8
- this.colors = [...colors].sort((a, b) => a.angle - b.angle)
9
- this.colors.push({
10
- angle: 1,
11
- color: this.colors[0].color
12
- })
13
- }
14
-
15
- /**
16
- * Получить цвет по углу от оси X по часовой стрелке
17
- * @param angle единица измерения угла должна быть той же самой, что и углы всех передаваемых в констурктор цветов
18
- */
19
- getColorAtAngle(angle: number) {
20
- let prev = undefined
21
- let next = undefined
22
- for (let color of this.colors) {
23
- if (color.angle === angle) return color.color
24
- if (color.angle < angle) prev = color
25
- if (color.angle > angle) {
26
- next = color
27
- break
28
- }
29
- }
30
-
31
- if (!prev || !next) return undefined
32
-
33
- const coef = (angle - prev.angle) / (next.angle - prev.angle)
34
-
35
- return new Color(
36
- Math.floor((next.color.red - prev.color.red) * coef + prev.color.red),
37
- Math.floor((next.color.green - prev.color.green) * coef + prev.color.green),
38
- Math.floor((next.color.blue - prev.color.blue) * coef + prev.color.blue),
39
- )
40
- }
41
-
42
- getAngleByColor(color: Color) {
43
- let prev: typeof this.colors[number]
44
- let next = this.colors[0]
45
- if (color.red === next.color.red && color.green === next.color.green && color.blue === next.color.blue) return next.angle
46
- for (let i = 1; i < this.colors.length; i++) {
47
- next = this.colors[i]
48
- prev = this.colors[i - 1]
49
- if (color.red === next.color.red && color.green === next.color.green && color.blue === next.color.blue) return next.angle
50
-
51
- let redDif = next.color.red - prev.color.red
52
- let greenDif = next.color.green - prev.color.green
53
- let blueDif = next.color.blue - prev.color.blue
54
- let redDifColor = color.red - prev.color.red
55
- let greenDifColor = color.green - prev.color.green
56
- let blueDifColor = color.blue - prev.color.blue
57
-
58
- if (
59
- ((redDifColor >= 0 && redDifColor <= redDif) || (redDifColor <= 0 && redDifColor >= redDif)) &&
60
- ((greenDifColor >= 0 && greenDifColor <= greenDif) || (greenDifColor <= 0 && greenDifColor >= greenDif)) &&
61
- ((blueDifColor >= 0 && blueDifColor <= blueDif) || (blueDifColor <= 0 && blueDifColor >= blueDif))
62
- ) {
63
-
64
- const redCoef = ((color.red - prev.color.red) / (next.color.red - prev.color.red))
65
- const greenCoef = ((color.green - prev.color.green) / (next.color.green - prev.color.green))
66
- const blueCoef = ((color.blue - prev.color.blue) / (next.color.blue - prev.color.blue))
67
- const coefs = [redCoef, greenCoef, blueCoef].filter(Boolean)
68
- return (next.angle - prev.angle) * Math.min(...coefs) + prev.angle
69
- }
70
- }
71
- return undefined
72
- }
73
-
74
- isColorInRange(color: Color): boolean {
75
- return Boolean(this.getAngleByColor(color))
76
- }
77
-
78
- /**
79
- * Для использования метода, углы должны быть в Turn единицах измерения
80
- */
81
- toCanvas(ctx: CanvasRenderingContext2D, center: IPoint2) {
82
- const gradient = ctx.createConicGradient(0, ...center as [number, number])
83
- for (let color of this.colors) {
84
- gradient.addColorStop(color.angle, color.color.toCSS())
85
- }
86
-
87
- return gradient
88
- }
89
-
90
- /**
91
- * Для использования метода, углы должны быть в Turn единицах измерения
92
- */
93
- toCSS() {
94
- let s = ''
95
-
96
- for (let color of this.colors) {
97
- if (s) s += ','
98
- s += `rgb(${color.color.red},${color.color.green},${color.color.blue})`
99
- }
100
-
101
- s = `conic-gradient(in srgb from 0.25turn at 50% 50%, ${s})`
102
- return s
103
- }
104
-
105
- }
@@ -1,2 +0,0 @@
1
- export * from './color'
2
- export * from './conic.gradient'
@@ -1,12 +0,0 @@
1
- import {IPoint2} from "./point";
2
- import {IMatrix2d, Matrix2d} from "../matrix";
3
-
4
- export class Circle {
5
- constructor(public center: IPoint2, public r: number) {
6
-
7
- }
8
-
9
- transform(matrix: IMatrix2d) {
10
- this.center = Matrix2d.apply(matrix, this.center)
11
- }
12
- }
@@ -1,3 +0,0 @@
1
- export * from './point'
2
- export * from './circle'
3
- export * from './straight-line'
@@ -1,23 +0,0 @@
1
- /**
2
- * Точка/вектор
3
- */
4
- export type IPoint2 = [number, number]
5
-
6
- /**
7
- * Точка/вектор
8
- */
9
- export class Point2 {
10
- static sum(p1: IPoint2, p2: IPoint2): IPoint2 {
11
- return [
12
- p1[0] + p2[0],
13
- p1[1] + p2[1],
14
- ]
15
- }
16
-
17
- static scale(v: IPoint2, factor: number): IPoint2 {
18
- return [
19
- v[0] * factor,
20
- v[1] * factor,
21
- ]
22
- }
23
- }
@@ -1,15 +0,0 @@
1
- import {IPoint2} from "./point";
2
- import {IMatrix2d, Matrix2d} from "../matrix";
3
-
4
- export class StraightLine {
5
- constructor(public p1: IPoint2, public p2: IPoint2) {
6
-
7
- }
8
-
9
- transform(matrix: IMatrix2d, transformThis = false) {
10
- if (transformThis) {
11
- return this
12
- }
13
- return new StraightLine(Matrix2d.apply(matrix, this.p1), Matrix2d.apply(matrix, this.p2))
14
- }
15
- }
package/src/index.ts DELETED
@@ -1,6 +0,0 @@
1
- export * from './angle'
2
- export * from './matrix'
3
- export * from './operator'
4
- export * from './utils'
5
- export * from './colors'
6
- export * from './figures'
package/src/matrix.ts DELETED
@@ -1,32 +0,0 @@
1
- import {IPoint2} from "./figures";
2
-
3
- export type IMatrix2d = [
4
- number, number, number,
5
- number, number, number,
6
- ]
7
-
8
- export const identityMatrix: IMatrix2d = [1, 0, 0, 1, 0, 0]
9
-
10
- export class Matrix2d {
11
- static multiply(matrix: IMatrix2d, ...matrices: IMatrix2d[]) {
12
- for (let m of matrices) {
13
- matrix = [
14
- matrix[0] * m[0] + matrix[2] * m[1],
15
- matrix[1] * m[0] + matrix[3] * m[1],
16
- matrix[0] * m[2] + matrix[2] * m[3],
17
- matrix[1] * m[2] + matrix[3] * m[3],
18
- matrix[0] * m[4] + matrix[2] * m[5] + matrix[4],
19
- matrix[1] * m[4] + matrix[3] * m[5] + matrix[5],
20
- ]
21
- }
22
-
23
- return matrix
24
- }
25
-
26
- static apply(matrix: IMatrix2d, point: IPoint2): IPoint2 {
27
- return [
28
- matrix[0] * point[0] + matrix[2] * point[1] + matrix[4],
29
- matrix[1] * point[0] + matrix[3] * point[1] + matrix[5],
30
- ]
31
- }
32
- }
package/src/operator.ts DELETED
@@ -1,23 +0,0 @@
1
- import {IMatrix2d} from "./matrix";
2
- import {Angle, AngleUnits} from "./angle";
3
-
4
- export class Operator {
5
- private static temp1: number
6
- private static temp2: number
7
-
8
- /**
9
- * @param angle поворот в градусах
10
- */
11
- static rotateIdentity(angle: number, unit: AngleUnits = AngleUnits.Deg): IMatrix2d {
12
- angle = Angle.toRad(angle, unit)
13
- this.temp1 = Math.cos(angle)
14
- this.temp2 = Math.sin(angle)
15
- return [
16
- this.temp1,
17
- this.temp2,
18
- -this.temp2,
19
- this.temp1,
20
- 0, 0
21
- ]
22
- }
23
- }
package/src/utils.ts DELETED
@@ -1,17 +0,0 @@
1
- export function approximately(theValue: number, is: number, withPrecision: number = 1e-8) {
2
- return Math.abs(theValue - is) <= withPrecision
3
- }
4
-
5
- export function toPositive(value: number, range: number) {
6
- if (value >= 0) return Math.abs(value)
7
- return Math.abs((range + value % range) % range)
8
- }
9
-
10
- export function isCorrectNumber(value: any) {
11
- let v: number = +value
12
- if (!isNaN(value) && isFinite(value)) {
13
- v = parseFloat(value)
14
- return !isNaN(v) && isFinite(v)
15
- }
16
- return false
17
- }
package/tsconfig.json DELETED
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "./node_modules/@fbltd/bundler/tsconfig.json",
3
- "compilerOptions": {
4
- "moduleResolution": "Node",
5
- "outFile": "dist/math.js",
6
- "module": "AMD",
7
- "sourceMap": true,
8
- "declaration": true
9
- }
10
- }