dgeoutils 2.4.41 → 2.4.44
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.
- package/package.json +1 -4
- package/dist/cjs/DCircle.d.ts +0 -18
- package/dist/cjs/DCircle.js +0 -102
- package/dist/cjs/DLine.d.ts +0 -39
- package/dist/cjs/DLine.js +0 -343
- package/dist/cjs/DNumbers.d.ts +0 -8
- package/dist/cjs/DNumbers.js +0 -30
- package/dist/cjs/DPlane.d.ts +0 -25
- package/dist/cjs/DPlane.js +0 -132
- package/dist/cjs/DPoint.d.ts +0 -138
- package/dist/cjs/DPoint.js +0 -803
- package/dist/cjs/DPolygon.d.ts +0 -137
- package/dist/cjs/DPolygon.js +0 -1745
- package/dist/cjs/DPolygonLoop.d.ts +0 -60
- package/dist/cjs/DPolygonLoop.js +0 -439
- package/dist/cjs/FastSearch.d.ts +0 -6
- package/dist/cjs/FastSearch.js +0 -53
- package/dist/cjs/InterpolationMatrix.d.ts +0 -24
- package/dist/cjs/InterpolationMatrix.js +0 -173
- package/dist/cjs/TraceMatrix.d.ts +0 -22
- package/dist/cjs/TraceMatrix.js +0 -285
- package/dist/cjs/index.d.ts +0 -11
- package/dist/cjs/index.js +0 -37
- package/dist/cjs/utils.d.ts +0 -49
- package/dist/cjs/utils.js +0 -280
- package/dist/es2015/DCircle.js +0 -87
- package/dist/es2015/DLine.js +0 -290
- package/dist/es2015/DNumbers.js +0 -22
- package/dist/es2015/DPlane.js +0 -105
- package/dist/es2015/DPoint.js +0 -676
- package/dist/es2015/DPolygon.js +0 -1193
- package/dist/es2015/DPolygonLoop.js +0 -430
- package/dist/es2015/FastSearch.js +0 -25
- package/dist/es2015/InterpolationMatrix.js +0 -128
- package/dist/es2015/TraceMatrix.js +0 -229
- package/dist/es2015/index.js +0 -11
- package/dist/es2015/utils.js +0 -207
- package/dist/esm/DCircle.js +0 -99
- package/dist/esm/DLine.js +0 -340
- package/dist/esm/DNumbers.js +0 -27
- package/dist/esm/DPlane.js +0 -129
- package/dist/esm/DPoint.js +0 -800
- package/dist/esm/DPolygon.js +0 -1742
- package/dist/esm/DPolygonLoop.js +0 -436
- package/dist/esm/FastSearch.js +0 -50
- package/dist/esm/InterpolationMatrix.js +0 -170
- package/dist/esm/TraceMatrix.js +0 -282
- package/dist/esm/index.js +0 -11
- package/dist/esm/utils.js +0 -265
- package/dist/umd/dgeoutils.js +0 -4347
- package/dist/umd/dgeoutils.min.js +0 -1
- package/dist/umd/dgeoutils.min.js.map +0 -1
package/dist/cjs/utils.js
DELETED
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
-
if (!m) return o;
|
|
5
|
-
var i = m.call(o), r, ar = [], e;
|
|
6
|
-
try {
|
|
7
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
-
}
|
|
9
|
-
catch (error) { e = { error: error }; }
|
|
10
|
-
finally {
|
|
11
|
-
try {
|
|
12
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
-
}
|
|
14
|
-
finally { if (e) throw e.error; }
|
|
15
|
-
}
|
|
16
|
-
return ar;
|
|
17
|
-
};
|
|
18
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
19
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
20
|
-
if (ar || !(i in from)) {
|
|
21
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
22
|
-
ar[i] = from[i];
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
26
|
-
};
|
|
27
|
-
var __values = (this && this.__values) || function(o) {
|
|
28
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
29
|
-
if (m) return m.call(o);
|
|
30
|
-
if (o && typeof o.length === "number") return {
|
|
31
|
-
next: function () {
|
|
32
|
-
if (o && i >= o.length) o = void 0;
|
|
33
|
-
return { value: o && o[i++], done: !o };
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.parseDegreesMinutesSeconds = exports.toDegreesMinutesSeconds = exports.div = exports.getCombinations = exports.cartesianProduct = exports.createCanvas = exports.gaussianElimination = exports.createMatrix = exports.createArray = exports.checkFunction = exports.isDefAndNotNull = exports.warn = exports.DGeo = void 0;
|
|
40
|
-
var DPoint_1 = require("./DPoint");
|
|
41
|
-
exports.DGeo = {
|
|
42
|
-
DEBUG: false,
|
|
43
|
-
parseFormat: 'xyz'
|
|
44
|
-
};
|
|
45
|
-
var warn = function () {
|
|
46
|
-
var args = [];
|
|
47
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
48
|
-
args[_i] = arguments[_i];
|
|
49
|
-
}
|
|
50
|
-
if (exports.DGeo.DEBUG) {
|
|
51
|
-
console.warn.apply(console, __spreadArray([], __read(args), false));
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
exports.warn = warn;
|
|
55
|
-
var isDefAndNotNull = function (a) { return a != undefined; };
|
|
56
|
-
exports.isDefAndNotNull = isDefAndNotNull;
|
|
57
|
-
var hook = function (scope) { return function () { return scope; }; };
|
|
58
|
-
var shouldBeInt = function (scope, funcName, argName) { return function (p) {
|
|
59
|
-
if (!p.clone().round()
|
|
60
|
-
.equal(p)) {
|
|
61
|
-
(0, exports.warn)("\"".concat(funcName, "\" -> \"").concat(argName, "\" should be Int!"));
|
|
62
|
-
}
|
|
63
|
-
return scope;
|
|
64
|
-
}; };
|
|
65
|
-
var shouldBeUInt = function (scope, funcName, argName) { return function (p) {
|
|
66
|
-
if (!p.clone().round()
|
|
67
|
-
.equal(p) || !p.gtOrEqual(DPoint_1.DPoint.zero())) {
|
|
68
|
-
(0, exports.warn)("\"".concat(funcName, "\" -> \"").concat(argName, "\" should be UInt!"));
|
|
69
|
-
}
|
|
70
|
-
return scope;
|
|
71
|
-
}; };
|
|
72
|
-
var shouldBeDegree = function (scope, funcName, argName) { return function (p) {
|
|
73
|
-
if (!p.likeWorldGeodeticSystem) {
|
|
74
|
-
(0, exports.warn)("\"".concat(funcName, "\" -> \"").concat(argName, "\" should be degree!"));
|
|
75
|
-
}
|
|
76
|
-
return scope;
|
|
77
|
-
}; };
|
|
78
|
-
var shouldBeRadians = function (scope, funcName, argName) { return function (p) {
|
|
79
|
-
if (!p.likeRadians) {
|
|
80
|
-
(0, exports.warn)("\"".concat(funcName, "\" -> \"").concat(argName, "\" should be radians!"));
|
|
81
|
-
}
|
|
82
|
-
return scope;
|
|
83
|
-
}; };
|
|
84
|
-
var shouldExist = function (scope, funcName, argName) { return function (p) {
|
|
85
|
-
if (!(0, exports.isDefAndNotNull)(p)) {
|
|
86
|
-
(0, exports.warn)("\"".concat(funcName, "\" -> \"").concat(argName, "\" should exist!"));
|
|
87
|
-
}
|
|
88
|
-
return scope;
|
|
89
|
-
}; };
|
|
90
|
-
var shouldBeMeters = function (scope, funcName, argName) { return function (p) {
|
|
91
|
-
if (!p.likePseudoMercator) {
|
|
92
|
-
(0, exports.warn)("\"".concat(funcName, "\" -> \"").concat(argName, "\" should be meters!"));
|
|
93
|
-
}
|
|
94
|
-
return scope;
|
|
95
|
-
}; };
|
|
96
|
-
var checkFunction = function (funcName) { return ({
|
|
97
|
-
checkArgument: function (argName) {
|
|
98
|
-
if (!exports.DGeo.DEBUG) {
|
|
99
|
-
return {
|
|
100
|
-
shouldBeDegree: hook(this),
|
|
101
|
-
shouldBeMeters: hook(this),
|
|
102
|
-
shouldBeInt: hook(this),
|
|
103
|
-
shouldBeUInt: hook(this),
|
|
104
|
-
shouldBeRadians: hook(this),
|
|
105
|
-
shouldExist: hook(this)
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
return {
|
|
109
|
-
shouldBeDegree: shouldBeDegree(this, funcName, argName),
|
|
110
|
-
shouldBeMeters: shouldBeMeters(this, funcName, argName),
|
|
111
|
-
shouldBeInt: shouldBeInt(this, funcName, argName),
|
|
112
|
-
shouldBeUInt: shouldBeUInt(this, funcName, argName),
|
|
113
|
-
shouldBeRadians: shouldBeRadians(this, funcName, argName),
|
|
114
|
-
shouldExist: shouldExist(this, funcName, argName)
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
}); };
|
|
118
|
-
exports.checkFunction = checkFunction;
|
|
119
|
-
var createArray = function (v, fillSymbol) {
|
|
120
|
-
if (typeof fillSymbol === 'function') {
|
|
121
|
-
return new Array(v).fill(false)
|
|
122
|
-
.map(function (_, i) { return fillSymbol(i); });
|
|
123
|
-
}
|
|
124
|
-
return new Array(v).fill(fillSymbol !== null && fillSymbol !== void 0 ? fillSymbol : 0);
|
|
125
|
-
};
|
|
126
|
-
exports.createArray = createArray;
|
|
127
|
-
var createMatrix = function (_a, fillSymbol) {
|
|
128
|
-
var h = _a.h, w = _a.w;
|
|
129
|
-
if (typeof fillSymbol === 'function') {
|
|
130
|
-
return (0, exports.createArray)(h)
|
|
131
|
-
.map(function (_, y) { return (0, exports.createArray)(w, function (x) { return fillSymbol(x, y); }); });
|
|
132
|
-
}
|
|
133
|
-
return (0, exports.createArray)(h)
|
|
134
|
-
.map(function () { return (0, exports.createArray)(w, fillSymbol); });
|
|
135
|
-
};
|
|
136
|
-
exports.createMatrix = createMatrix;
|
|
137
|
-
var gaussianElimination = function (matrix) {
|
|
138
|
-
var n = matrix.length;
|
|
139
|
-
var matrixClone = (0, exports.createMatrix)(new DPoint_1.DPoint(n + 1, n));
|
|
140
|
-
for (var i = 0; i < n; i++) {
|
|
141
|
-
for (var j = 0; j < n + 1; j++) {
|
|
142
|
-
matrix[i][j] = matrix[i][j] === 0 ? exports.gaussianElimination.MIN : matrix[i][j];
|
|
143
|
-
matrixClone[i][j] = matrix[i][j];
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
for (var k = 0; k < n; k++) {
|
|
147
|
-
for (var i = 0; i < n + 1; i++) {
|
|
148
|
-
matrixClone[k][i] /= matrix[k][k];
|
|
149
|
-
}
|
|
150
|
-
for (var i = k + 1; i < n; i++) {
|
|
151
|
-
var K = matrixClone[i][k] / matrixClone[k][k];
|
|
152
|
-
for (var j = 0; j < n + 1; j++) {
|
|
153
|
-
matrixClone[i][j] -= matrixClone[k][j] * K;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
for (var i = 0; i < n; i++) {
|
|
157
|
-
for (var j = 0; j < n + 1; j++) {
|
|
158
|
-
matrix[i][j] = matrixClone[i][j];
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
for (var k = n - 1; k > -1; k--) {
|
|
163
|
-
for (var i = n; i > -1; i--) {
|
|
164
|
-
matrixClone[k][i] /= matrix[k][k];
|
|
165
|
-
}
|
|
166
|
-
for (var i = k - 1; i > -1; i--) {
|
|
167
|
-
var K = matrixClone[i][k] / matrixClone[k][k];
|
|
168
|
-
for (var j = n; j > -1; j--) {
|
|
169
|
-
matrixClone[i][j] -= matrixClone[k][j] * K;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
var answer = (0, exports.createArray)(n);
|
|
174
|
-
for (var i = 0; i < n; i++) {
|
|
175
|
-
answer[i] = matrixClone[i][n];
|
|
176
|
-
}
|
|
177
|
-
return answer;
|
|
178
|
-
};
|
|
179
|
-
exports.gaussianElimination = gaussianElimination;
|
|
180
|
-
exports.gaussianElimination.MIN = 1e-10;
|
|
181
|
-
var createCanvas = function (a, b, c) {
|
|
182
|
-
var _a;
|
|
183
|
-
var w = 0;
|
|
184
|
-
var h = 0;
|
|
185
|
-
var offscreen = false;
|
|
186
|
-
if (a instanceof DPoint_1.DPoint) {
|
|
187
|
-
var x = a.x, y = a.y;
|
|
188
|
-
w = x;
|
|
189
|
-
h = y;
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
w = a;
|
|
193
|
-
h = a;
|
|
194
|
-
}
|
|
195
|
-
if (typeof b === 'boolean') {
|
|
196
|
-
offscreen = b;
|
|
197
|
-
}
|
|
198
|
-
else if (typeof b === 'number') {
|
|
199
|
-
h = b;
|
|
200
|
-
}
|
|
201
|
-
if (typeof c === 'boolean') {
|
|
202
|
-
offscreen = c;
|
|
203
|
-
}
|
|
204
|
-
var canvas = offscreen ? new OffscreenCanvas(w, h) : ((_a = exports.createCanvas.document) !== null && _a !== void 0 ? _a : document).createElement('canvas');
|
|
205
|
-
if (!offscreen) {
|
|
206
|
-
canvas.width = w;
|
|
207
|
-
canvas.height = h;
|
|
208
|
-
}
|
|
209
|
-
return [canvas, canvas.getContext('2d')];
|
|
210
|
-
};
|
|
211
|
-
exports.createCanvas = createCanvas;
|
|
212
|
-
var f = function (a, b) { return [].concat.apply([], __spreadArray([], __read(a.map(function (c) { return b.map(function (d) { return [].concat(c, d); }); })), false)); };
|
|
213
|
-
var cartesianProduct = function (a, b) {
|
|
214
|
-
var c = [];
|
|
215
|
-
for (var _i = 2; _i < arguments.length; _i++) {
|
|
216
|
-
c[_i - 2] = arguments[_i];
|
|
217
|
-
}
|
|
218
|
-
return b ? exports.cartesianProduct.apply(void 0, __spreadArray([f(a, b)], __read(c), false)) : a;
|
|
219
|
-
};
|
|
220
|
-
exports.cartesianProduct = cartesianProduct;
|
|
221
|
-
var getCombinations = function (arr) {
|
|
222
|
-
if (arr.length === 1) {
|
|
223
|
-
return arr[0];
|
|
224
|
-
}
|
|
225
|
-
var ans = [];
|
|
226
|
-
var otherCases = (0, exports.getCombinations)(arr.slice(1));
|
|
227
|
-
for (var i = 0; i < otherCases.length; i++) {
|
|
228
|
-
for (var j = 0; j < arr[0].length; j++) {
|
|
229
|
-
ans.push(__spreadArray([arr[0][j]], __read(otherCases[i]), false));
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
return ans;
|
|
233
|
-
};
|
|
234
|
-
exports.getCombinations = getCombinations;
|
|
235
|
-
var div = function (a, b) { return Math.floor(a / b); };
|
|
236
|
-
exports.div = div;
|
|
237
|
-
var toDegreesMinutesSeconds = function (v) {
|
|
238
|
-
var degrees = Math.floor(v);
|
|
239
|
-
var t = (v % 1) * 60;
|
|
240
|
-
var minutes = Math.floor(t);
|
|
241
|
-
var t2 = (t % 1) * 60;
|
|
242
|
-
var seconds = t2.toFixed(2);
|
|
243
|
-
return "".concat(degrees, "\u00B0 ").concat(minutes, "' ").concat(seconds, "\"");
|
|
244
|
-
};
|
|
245
|
-
exports.toDegreesMinutesSeconds = toDegreesMinutesSeconds;
|
|
246
|
-
var parseDegreesMinutesSeconds = function (i) {
|
|
247
|
-
var e_1, _a;
|
|
248
|
-
var _b, _c, _d, _e, _f, _g, _h;
|
|
249
|
-
var parts = i.matchAll(/(?<value>-?\d+(?<tail>\.\d{1,})?)(?<type>°|'|")/gmiu);
|
|
250
|
-
var d = 0;
|
|
251
|
-
var m = 0;
|
|
252
|
-
var s = 0;
|
|
253
|
-
try {
|
|
254
|
-
for (var parts_1 = __values(parts), parts_1_1 = parts_1.next(); !parts_1_1.done; parts_1_1 = parts_1.next()) {
|
|
255
|
-
var part = parts_1_1.value;
|
|
256
|
-
switch ((_b = part === null || part === void 0 ? void 0 : part.groups) === null || _b === void 0 ? void 0 : _b.type) {
|
|
257
|
-
case '°':
|
|
258
|
-
d = Number((_d = (_c = part === null || part === void 0 ? void 0 : part.groups) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '0');
|
|
259
|
-
break;
|
|
260
|
-
case '\'':
|
|
261
|
-
m = Number((_f = (_e = part === null || part === void 0 ? void 0 : part.groups) === null || _e === void 0 ? void 0 : _e.value) !== null && _f !== void 0 ? _f : '0');
|
|
262
|
-
break;
|
|
263
|
-
case '"':
|
|
264
|
-
s = Number((_h = (_g = part === null || part === void 0 ? void 0 : part.groups) === null || _g === void 0 ? void 0 : _g.value) !== null && _h !== void 0 ? _h : '0');
|
|
265
|
-
break;
|
|
266
|
-
default:
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
271
|
-
finally {
|
|
272
|
-
try {
|
|
273
|
-
if (parts_1_1 && !parts_1_1.done && (_a = parts_1.return)) _a.call(parts_1);
|
|
274
|
-
}
|
|
275
|
-
finally { if (e_1) throw e_1.error; }
|
|
276
|
-
}
|
|
277
|
-
var h = d < 0 ? -1 : 1;
|
|
278
|
-
return d + h * m / 60 + h * s / 3600;
|
|
279
|
-
};
|
|
280
|
-
exports.parseDegreesMinutesSeconds = parseDegreesMinutesSeconds;
|
package/dist/es2015/DCircle.js
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { DPoint, EARTH_RADIUS_IN_METERS } from './DPoint';
|
|
2
|
-
import { DPolygon } from './DPolygon';
|
|
3
|
-
import { checkFunction } from './utils';
|
|
4
|
-
export class DCircle {
|
|
5
|
-
constructor(center = DPoint.zero(), r = 0) {
|
|
6
|
-
this.center = center;
|
|
7
|
-
this.r = r;
|
|
8
|
-
}
|
|
9
|
-
toString() {
|
|
10
|
-
return `(${this.center.toString()}, ${this.r})`;
|
|
11
|
-
}
|
|
12
|
-
getValue() {
|
|
13
|
-
return { center: this.center, r: this.r };
|
|
14
|
-
}
|
|
15
|
-
clone() {
|
|
16
|
-
return new DCircle(this.center, this.r);
|
|
17
|
-
}
|
|
18
|
-
findPoints(c) {
|
|
19
|
-
if (this.equal(c)) {
|
|
20
|
-
return Infinity;
|
|
21
|
-
}
|
|
22
|
-
const { center: { x: x0, y: y0 }, r: r0 } = this;
|
|
23
|
-
const { center: { x: x1, y: y1 }, r: r1 } = c;
|
|
24
|
-
const r02 = r0 * r0;
|
|
25
|
-
const d = this.center.distance(c.center);
|
|
26
|
-
const a = (r02 - r1 * r1 + d * d) / (2 * d);
|
|
27
|
-
const h = Math.sqrt(r02 - a * a);
|
|
28
|
-
const ad = a / d;
|
|
29
|
-
const dy = y1 - y0;
|
|
30
|
-
const dx = x1 - x0;
|
|
31
|
-
const hd = h / d;
|
|
32
|
-
const x2 = x0 + ad * (x1 - x0);
|
|
33
|
-
const y2 = y0 + ad * (y1 - y0);
|
|
34
|
-
const x31 = x2 + hd * dy;
|
|
35
|
-
const y31 = y2 - hd * dx;
|
|
36
|
-
const x32 = x2 - hd * dy;
|
|
37
|
-
const y32 = y2 + hd * dx;
|
|
38
|
-
const res = [];
|
|
39
|
-
if (!isNaN(x31) && !isNaN(y31)) {
|
|
40
|
-
res.push(new DPoint(x31, y31));
|
|
41
|
-
}
|
|
42
|
-
if (!isNaN(x32) && !isNaN(y32) && !(x31 === x32 && y31 === y32)) {
|
|
43
|
-
res.push(new DPoint(x32, y32));
|
|
44
|
-
}
|
|
45
|
-
return res;
|
|
46
|
-
}
|
|
47
|
-
equal({ center, r }) {
|
|
48
|
-
return this.center.equal(center) && this.r === r;
|
|
49
|
-
}
|
|
50
|
-
findPolygonInside(pointCount = 64, startAngle = 0, stopAngle = 2 * Math.PI) {
|
|
51
|
-
const step = 2 * Math.PI / pointCount;
|
|
52
|
-
const points = [];
|
|
53
|
-
let angle = startAngle;
|
|
54
|
-
while (angle < stopAngle - step) {
|
|
55
|
-
points.push(new DPoint(this.r).scale(Math.cos(angle), Math.sin(angle))
|
|
56
|
-
.move(this.center));
|
|
57
|
-
angle += step;
|
|
58
|
-
}
|
|
59
|
-
const x = this.r * Math.cos(stopAngle) + this.center.x;
|
|
60
|
-
const y = this.r * Math.sin(stopAngle) + this.center.y;
|
|
61
|
-
points.push(new DPoint(x, y));
|
|
62
|
-
return new DPolygon(points);
|
|
63
|
-
}
|
|
64
|
-
findPolygonInsideOnSphere(pointCount = 64, startAngle = 0, stopAngle = 2 * Math.PI) {
|
|
65
|
-
checkFunction('findPolygonInsideOnSphere')
|
|
66
|
-
.checkArgument('center')
|
|
67
|
-
.shouldBeDegree(this.center);
|
|
68
|
-
const step = 2 * Math.PI / pointCount;
|
|
69
|
-
const points = [];
|
|
70
|
-
let angle = startAngle;
|
|
71
|
-
while (angle < stopAngle - step) {
|
|
72
|
-
points.push(this.sphereOffset(angle));
|
|
73
|
-
angle += step;
|
|
74
|
-
}
|
|
75
|
-
points.push(this.sphereOffset(stopAngle));
|
|
76
|
-
return new DPolygon(points);
|
|
77
|
-
}
|
|
78
|
-
sphereOffset(bearing, earthRadius = EARTH_RADIUS_IN_METERS) {
|
|
79
|
-
const { x: lon1, y: lat1 } = this.center.clone().degreeToRadians();
|
|
80
|
-
const dByR = this.r / earthRadius;
|
|
81
|
-
const lat = Math.asin(Math.sin(lat1) * Math.cos(dByR) +
|
|
82
|
-
Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing));
|
|
83
|
-
const lon = lon1 +
|
|
84
|
-
Math.atan2(Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1), Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat));
|
|
85
|
-
return new DPoint(lon, lat).radiansToDegrees();
|
|
86
|
-
}
|
|
87
|
-
}
|
package/dist/es2015/DLine.js
DELETED
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
import { DPoint } from './DPoint';
|
|
2
|
-
import { checkFunction } from './utils';
|
|
3
|
-
import { DNumbers } from './DNumbers';
|
|
4
|
-
import { DPolygon } from './DPolygon';
|
|
5
|
-
export class DLine {
|
|
6
|
-
constructor(a, b, c, begin = DPoint.zero(), end = DPoint.zero()) {
|
|
7
|
-
this.a = a;
|
|
8
|
-
this.b = b;
|
|
9
|
-
this.c = c;
|
|
10
|
-
this.begin = begin;
|
|
11
|
-
this.end = end;
|
|
12
|
-
}
|
|
13
|
-
clone() {
|
|
14
|
-
return new DLine(this.a, this.b, this.c, this.begin.clone(), this.end.clone());
|
|
15
|
-
}
|
|
16
|
-
findPerpendicular(p) {
|
|
17
|
-
checkFunction('findPerpendicular')
|
|
18
|
-
.checkArgument('this.begin')
|
|
19
|
-
.shouldBeMeters(this.begin)
|
|
20
|
-
.checkArgument('this.end')
|
|
21
|
-
.shouldBeMeters(this.end)
|
|
22
|
-
.checkArgument('p')
|
|
23
|
-
.shouldBeMeters(p);
|
|
24
|
-
return new DLine(-this.b, this.a, this.b * p.x - this.a * p.y);
|
|
25
|
-
}
|
|
26
|
-
perpendicularDistance(p) {
|
|
27
|
-
checkFunction('perpendicularDistance')
|
|
28
|
-
.checkArgument('this.begin')
|
|
29
|
-
.shouldBeMeters(this.begin)
|
|
30
|
-
.checkArgument('this.end')
|
|
31
|
-
.shouldBeMeters(this.end)
|
|
32
|
-
.checkArgument('p')
|
|
33
|
-
.shouldBeMeters(p);
|
|
34
|
-
const perpendicularLine = this.findPerpendicular(p);
|
|
35
|
-
const targetPoint = perpendicularLine.findPoint(this);
|
|
36
|
-
return targetPoint.distance(p);
|
|
37
|
-
}
|
|
38
|
-
intersection(l, d = 0, includeOnly = false) {
|
|
39
|
-
const p = this.findPoint(l);
|
|
40
|
-
if (p) {
|
|
41
|
-
if (includeOnly) {
|
|
42
|
-
return this.insideRange(p, d) && l.insideRange(p, d) ? p : null;
|
|
43
|
-
}
|
|
44
|
-
return this.inRange(p, d) && l.inRange(p, d) ? p : null;
|
|
45
|
-
}
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
intersectionWithCircle(circle) {
|
|
49
|
-
const { center, r } = circle;
|
|
50
|
-
const per = this.findPerpendicular(center);
|
|
51
|
-
const t = this.findPoint(per);
|
|
52
|
-
let distance = t.distance(center);
|
|
53
|
-
if (this.begin.equal(center)) {
|
|
54
|
-
distance = 0;
|
|
55
|
-
}
|
|
56
|
-
if (this.end.equal(center)) {
|
|
57
|
-
distance = 0;
|
|
58
|
-
}
|
|
59
|
-
if (distance < r) {
|
|
60
|
-
const { a, b, c } = this;
|
|
61
|
-
if (this.isParallel) {
|
|
62
|
-
const ct = center.distance(t);
|
|
63
|
-
const move = Math.sqrt(r * r - ct * ct);
|
|
64
|
-
if (this.isParallelY) {
|
|
65
|
-
t.x = this.begin.x;
|
|
66
|
-
const r1 = t.clone().move(0, -move);
|
|
67
|
-
const r2 = t.clone().move(0, move);
|
|
68
|
-
return [r1, r2];
|
|
69
|
-
}
|
|
70
|
-
if (this.isParallelX) {
|
|
71
|
-
t.y = this.begin.y;
|
|
72
|
-
const r1 = t.clone().move(move, 0);
|
|
73
|
-
const r2 = t.clone().move(-move, 0);
|
|
74
|
-
return [r1, r2];
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (this.begin.like(center)) {
|
|
78
|
-
const p = this.begin.clone();
|
|
79
|
-
return [this.movePoint(p, r), this.movePoint(p, -r)];
|
|
80
|
-
}
|
|
81
|
-
if (this.end.like(center)) {
|
|
82
|
-
const p = this.end.clone();
|
|
83
|
-
return [this.movePoint(p, r), this.movePoint(p, -r)];
|
|
84
|
-
}
|
|
85
|
-
const s = a * a + b * b;
|
|
86
|
-
const d = r * r - c * c / s;
|
|
87
|
-
const mult = Math.sqrt(d / s);
|
|
88
|
-
const r1 = t.clone().move(b * mult, -a * mult);
|
|
89
|
-
const r2 = t.clone().move(-b * mult, a * mult);
|
|
90
|
-
return [r1, r2];
|
|
91
|
-
}
|
|
92
|
-
if (distance === r) {
|
|
93
|
-
return t;
|
|
94
|
-
}
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
inRange(p, d = 0) {
|
|
98
|
-
const { minX, minY, maxX, maxY } = this;
|
|
99
|
-
const { x, y } = p;
|
|
100
|
-
const isInX = x >= minX - d && x <= maxX + d;
|
|
101
|
-
const isInY = y >= minY - d && y <= maxY + d;
|
|
102
|
-
return isInX && isInY;
|
|
103
|
-
}
|
|
104
|
-
insideRange(p, d = 0) {
|
|
105
|
-
const { begin, end } = this;
|
|
106
|
-
return this.inRange(p, d) && !begin.like(p, 0.00001) && !end.like(p, 0.00001);
|
|
107
|
-
}
|
|
108
|
-
get center() {
|
|
109
|
-
return this.begin
|
|
110
|
-
.clone()
|
|
111
|
-
.setIfLessThan(this.end)
|
|
112
|
-
.move(this.end
|
|
113
|
-
.clone()
|
|
114
|
-
.move(this.begin
|
|
115
|
-
.clone()
|
|
116
|
-
.minus())
|
|
117
|
-
.abs()
|
|
118
|
-
.minus()
|
|
119
|
-
.divide(2));
|
|
120
|
-
}
|
|
121
|
-
get minX() {
|
|
122
|
-
return Math.min(this.begin.x, this.end.x);
|
|
123
|
-
}
|
|
124
|
-
get minY() {
|
|
125
|
-
return Math.min(this.begin.y, this.end.y);
|
|
126
|
-
}
|
|
127
|
-
get maxX() {
|
|
128
|
-
return Math.max(this.begin.x, this.end.x);
|
|
129
|
-
}
|
|
130
|
-
get maxY() {
|
|
131
|
-
return Math.max(this.begin.y, this.end.y);
|
|
132
|
-
}
|
|
133
|
-
toString() {
|
|
134
|
-
return `(${this.a}, ${this.b}, ${this.c})`;
|
|
135
|
-
}
|
|
136
|
-
getValue() {
|
|
137
|
-
return [this.a, this.b, this.c];
|
|
138
|
-
}
|
|
139
|
-
x(p) {
|
|
140
|
-
if (this.isParallelY) {
|
|
141
|
-
return new DPoint(-this.c / this.a, p.y);
|
|
142
|
-
}
|
|
143
|
-
if (this.isParallelX) {
|
|
144
|
-
return new DPoint(p.x, -this.c / this.b);
|
|
145
|
-
}
|
|
146
|
-
return new DPoint(-this.b / this.a * p.y - this.c / this.a, p.y);
|
|
147
|
-
}
|
|
148
|
-
y(p) {
|
|
149
|
-
if (this.isParallelY) {
|
|
150
|
-
return new DPoint(-this.c / this.a, p.y);
|
|
151
|
-
}
|
|
152
|
-
if (this.isParallelX) {
|
|
153
|
-
return new DPoint(p.x, -this.c / this.b);
|
|
154
|
-
}
|
|
155
|
-
return new DPoint(p.x, -this.a / this.b * p.x - this.c / this.b);
|
|
156
|
-
}
|
|
157
|
-
findPoint(l) {
|
|
158
|
-
if (this.isParallelY && l.isParallelY) {
|
|
159
|
-
return null;
|
|
160
|
-
}
|
|
161
|
-
if (this.isParallelX && l.isParallelX) {
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
if (this.isParallelX && l.isParallelY) {
|
|
165
|
-
return new DPoint(-l.c / l.a, -this.c / this.b);
|
|
166
|
-
}
|
|
167
|
-
if (this.isParallelY && l.isParallelX) {
|
|
168
|
-
return new DPoint(-this.c / this.a, -l.c / l.b);
|
|
169
|
-
}
|
|
170
|
-
if (this.isParallelY) {
|
|
171
|
-
const x = -this.c / this.a;
|
|
172
|
-
return l.y(new DPoint(x));
|
|
173
|
-
}
|
|
174
|
-
if (this.isParallelX) {
|
|
175
|
-
const y = -this.c / this.b;
|
|
176
|
-
return l.x(new DPoint(0, y));
|
|
177
|
-
}
|
|
178
|
-
if (l.isParallelY) {
|
|
179
|
-
const x = -l.c / l.a;
|
|
180
|
-
return this.y(new DPoint(x));
|
|
181
|
-
}
|
|
182
|
-
if (l.isParallelX) {
|
|
183
|
-
const y = -l.c / l.b;
|
|
184
|
-
return this.x(new DPoint(0, y));
|
|
185
|
-
}
|
|
186
|
-
const res = this.y(new DPoint((l.c / l.b - this.c / this.b) / (this.a / this.b - l.a / l.b)));
|
|
187
|
-
if (!isFinite(res.x) && !isFinite(res.y)) {
|
|
188
|
-
return null;
|
|
189
|
-
}
|
|
190
|
-
return res;
|
|
191
|
-
}
|
|
192
|
-
get isParallel() {
|
|
193
|
-
return this.isParallelX || this.isParallelY;
|
|
194
|
-
}
|
|
195
|
-
get isParallelY() {
|
|
196
|
-
return Math.abs(this.b) < 0.001;
|
|
197
|
-
}
|
|
198
|
-
get isParallelX() {
|
|
199
|
-
return Math.abs(this.a) < 0.001;
|
|
200
|
-
}
|
|
201
|
-
get points() {
|
|
202
|
-
return [this.begin, this.end];
|
|
203
|
-
}
|
|
204
|
-
getFi() {
|
|
205
|
-
checkFunction('getFi')
|
|
206
|
-
.checkArgument('this.begin')
|
|
207
|
-
.shouldBeMeters(this.begin)
|
|
208
|
-
.checkArgument('this.end')
|
|
209
|
-
.shouldBeMeters(this.end);
|
|
210
|
-
const { x, y } = this.end.clone().move(this.begin.clone().minus());
|
|
211
|
-
let v = Math.atan2(y, x) - Math.PI;
|
|
212
|
-
if (v > 0) {
|
|
213
|
-
v = Math.PI - v;
|
|
214
|
-
}
|
|
215
|
-
return (Math.PI - v) % (Math.PI * 2);
|
|
216
|
-
}
|
|
217
|
-
toWKT() {
|
|
218
|
-
const { begin: { x: x1, y: y1 }, end: { x: x2, y: y2 } } = this;
|
|
219
|
-
return `LINESTRING (${x1} ${y1}, ${x2} ${y2})`;
|
|
220
|
-
}
|
|
221
|
-
movePoint(i, k) {
|
|
222
|
-
const isArray = Array.isArray(i);
|
|
223
|
-
const p = isArray ? i : [i];
|
|
224
|
-
const d = (isArray ? k : [k]);
|
|
225
|
-
const fi = this.findFi(new DLine(1, 0, 0));
|
|
226
|
-
const td = this.x(new DPoint(1, 1)).distance(this.x(new DPoint(2, 2))) / 2;
|
|
227
|
-
const sinCos = new DPoint(Math.sin(fi), Math.cos(fi));
|
|
228
|
-
const dt = sinCos.clone().scale(td);
|
|
229
|
-
const p1T = p[0].clone().move(dt.clone().minus());
|
|
230
|
-
const p2T = p[0].clone().move(dt);
|
|
231
|
-
let res = [];
|
|
232
|
-
if (DNumbers.like(this.y(p1T).y, p1T.y) || DNumbers.like(this.y(p2T).y, p2T.y)) {
|
|
233
|
-
res = p.map((t, index) => t.clone()
|
|
234
|
-
.move(sinCos.clone().scale(d[index])));
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
res = p.map((t, index) => t.clone()
|
|
238
|
-
.move(sinCos.clone().scale(d[index])
|
|
239
|
-
.setX(({ x }) => -x)));
|
|
240
|
-
}
|
|
241
|
-
return isArray ? res : res[0];
|
|
242
|
-
}
|
|
243
|
-
findFi({ a, b }, delta = 1.0001) {
|
|
244
|
-
const { a: q, b: w } = this;
|
|
245
|
-
let val = (q * a + w * b) / (Math.sqrt(q * q + w * w) * Math.sqrt(a * a + b * b));
|
|
246
|
-
if (val > 1 && val < delta) {
|
|
247
|
-
val = 1;
|
|
248
|
-
}
|
|
249
|
-
else if (val < -1 && val > -delta) {
|
|
250
|
-
val = -1;
|
|
251
|
-
}
|
|
252
|
-
return Math.acos(val);
|
|
253
|
-
}
|
|
254
|
-
vectorProduct({ a, b, c }) {
|
|
255
|
-
const { a: q, b: w, c: e } = this;
|
|
256
|
-
return new DLine(w * c - e * b, e * a - q * c, q * b - w * a);
|
|
257
|
-
}
|
|
258
|
-
bresenhamsLine() {
|
|
259
|
-
let { x: x0, y: y0 } = this.begin;
|
|
260
|
-
const { x: x1, y: y1 } = this.end;
|
|
261
|
-
const dx = Math.abs(x1 - x0);
|
|
262
|
-
const sx = x0 < x1 ? 1 : -1;
|
|
263
|
-
const dy = -Math.abs(y1 - y0);
|
|
264
|
-
const sy = y0 < y1 ? 1 : -1;
|
|
265
|
-
let error = dx + dy;
|
|
266
|
-
const res = new DPolygon();
|
|
267
|
-
while (true) {
|
|
268
|
-
res.push(new DPoint(x0, y0));
|
|
269
|
-
if (x0 === x1 && y0 === y1) {
|
|
270
|
-
break;
|
|
271
|
-
}
|
|
272
|
-
const e2 = 2 * error;
|
|
273
|
-
if (e2 >= dy) {
|
|
274
|
-
if (x0 === x1) {
|
|
275
|
-
break;
|
|
276
|
-
}
|
|
277
|
-
error += dy;
|
|
278
|
-
x0 += sx;
|
|
279
|
-
}
|
|
280
|
-
if (e2 <= dx) {
|
|
281
|
-
if (y0 === y1) {
|
|
282
|
-
break;
|
|
283
|
-
}
|
|
284
|
-
error += dx;
|
|
285
|
-
y0 += sy;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
return res;
|
|
289
|
-
}
|
|
290
|
-
}
|
package/dist/es2015/DNumbers.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { DEGREE_TO_PI, DOUBLE_PI_IN_DEGREE, PI_IN_DEGREE, PI_TO_DEGREE } from './DPoint';
|
|
2
|
-
const delta = 0.001;
|
|
3
|
-
export class DNumbers {
|
|
4
|
-
static like(v, s, d = delta) {
|
|
5
|
-
return Math.abs(v - s) < d;
|
|
6
|
-
}
|
|
7
|
-
static likeZero(v) {
|
|
8
|
-
return DNumbers.like(v, 0);
|
|
9
|
-
}
|
|
10
|
-
static like2PI(v) {
|
|
11
|
-
return DNumbers.like(DNumbers.rad2Deg(v), DOUBLE_PI_IN_DEGREE);
|
|
12
|
-
}
|
|
13
|
-
static likePI(v) {
|
|
14
|
-
return DNumbers.like(DNumbers.rad2Deg(v), PI_IN_DEGREE);
|
|
15
|
-
}
|
|
16
|
-
static rad2Deg(v) {
|
|
17
|
-
return v * DEGREE_TO_PI;
|
|
18
|
-
}
|
|
19
|
-
static deg2Rad(v) {
|
|
20
|
-
return v * PI_TO_DEGREE;
|
|
21
|
-
}
|
|
22
|
-
}
|