@pie-element/graphing 4.16.6-next.2 → 4.17.0-beta

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.
@@ -1,371 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.sortedAnswers = exports.removeInvalidSegments = exports.removeInvalidAnswers = exports.removeDuplicateSegments = exports.equalVector = exports.equalSine = exports.equalSegment = exports.equalRay = exports.equalPolygon = exports.equalPoint = exports.equalParabola = exports.equalMarks = exports.equalLine = exports.equalCircle = exports.constructSegmentsFromPoints = void 0;
9
-
10
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
-
12
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
-
14
- var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
15
-
16
- var _lodash = _interopRequireDefault(require("lodash"));
17
-
18
- var _uniqWith = _interopRequireDefault(require("lodash/uniqWith"));
19
-
20
- var _differenceWith = _interopRequireDefault(require("lodash/differenceWith"));
21
-
22
- var _graphingUtils = require("@pie-lib/graphing-utils");
23
-
24
- var _excluded = ["type"];
25
-
26
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
27
-
28
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
29
-
30
- var equalPoint = function equalPoint(A, B) {
31
- // x1 = x2 & y1 = y2
32
- var equalLabel = true;
33
-
34
- if (A.label || B.label) {
35
- equalLabel = (0, _isEqual["default"])(A.label, B.label);
36
- }
37
-
38
- return (0, _isEqual["default"])(A.x, B.x) && (0, _isEqual["default"])(A.y, B.y) && equalLabel;
39
- };
40
-
41
- exports.equalPoint = equalPoint;
42
-
43
- var equalSegment = function equalSegment(segment1, segment2) {
44
- // A.from = B.from, A.to = B.to OR A.from = B.to, A.to = B.from
45
- // x1 = x3 & y1 = y3 & x2 = x4 & y2 = y4
46
- return (0, _isEqual["default"])(segment1.from, segment2.from) && (0, _isEqual["default"])(segment1.to, segment2.to) || (0, _isEqual["default"])(segment1.to, segment2.from) && (0, _isEqual["default"])(segment1.from, segment2.to);
47
- };
48
-
49
- exports.equalSegment = equalSegment;
50
-
51
- var equalVector = function equalVector(vector1, vector2) {
52
- // A.from = B.from, A.to = B.to;
53
- // x1 = x3 & y1 = y3 & x2 = x4 & y2 = y4
54
- return (0, _isEqual["default"])(vector1.from, vector2.from) && (0, _isEqual["default"])(vector1.to, vector2.to);
55
- }; // this function is implemented in configure as well
56
-
57
-
58
- exports.equalVector = equalVector;
59
-
60
- var sortedAnswers = function sortedAnswers(answers) {
61
- return Object.keys(answers || {}).sort().reduce(function (result, key) {
62
- if (key !== 'correctAnswer') {
63
- result[key] = answers[key];
64
- }
65
-
66
- return result;
67
- }, {});
68
- };
69
-
70
- exports.sortedAnswers = sortedAnswers;
71
-
72
- var returnLineEquationCoefficients = function returnLineEquationCoefficients(line) {
73
- var xA = line.from.x;
74
- var yA = line.from.y;
75
- var xB = line.to.x;
76
- var yB = line.to.y;
77
- return {
78
- a: yB - yA,
79
- b: xA - xB,
80
- c: xB * yA - xA * yB
81
- };
82
- };
83
-
84
- var getSignificantDecimals = function getSignificantDecimals(number) {
85
- return Math.round(number * 10000) / 10000;
86
- };
87
-
88
- var equalLine = function equalLine(line1, line2) {
89
- // line equation: ax + by + c = 0
90
- // 2 lines are equal if a1/a2 = b1/b2 = c1/c2, where a, b, c are the coefficients in line equation
91
- // line equation knowing 2 points: (y - yA) / (yB - yA) = (x - xA) / (xB - xA)
92
- // extending this equation, we get: x * (yB - yA) + y * (xA - xB) + (xB * yA - xA * yB) = 0
93
- // where a = yB - yA; b = xA - xB; c = xB * yA - xA * yB
94
- var _returnLineEquationCo = returnLineEquationCoefficients(line1),
95
- a1 = _returnLineEquationCo.a,
96
- b1 = _returnLineEquationCo.b,
97
- c1 = _returnLineEquationCo.c;
98
-
99
- var _returnLineEquationCo2 = returnLineEquationCoefficients(line2),
100
- a2 = _returnLineEquationCo2.a,
101
- b2 = _returnLineEquationCo2.b,
102
- c2 = _returnLineEquationCo2.c;
103
-
104
- var proportions = [];
105
-
106
- if (a2 !== 0) {
107
- proportions.push(getSignificantDecimals(a1 / a2));
108
- } else if (a1 !== a2) {
109
- return false;
110
- }
111
-
112
- if (b2 !== 0) {
113
- proportions.push(getSignificantDecimals(b1 / b2));
114
- } else if (b1 !== b2) {
115
- return false;
116
- }
117
-
118
- if (c2 !== 0) {
119
- proportions.push(getSignificantDecimals(c1 / c2));
120
- } else if (c1 !== c2) {
121
- return false;
122
- }
123
-
124
- return _lodash["default"].uniq(proportions).length === 1; // (y2 - y1)/(x2 - x1) = (y4 - y3)/(x4 - x3);
125
- // return ((Math.abs((line1.to.y - line1.from.y) / (line1.to.x - line1.from.x))) === (Math.abs((line2.to.y - line2.from.y) / (line2.to.x - line2.from.x))));
126
- };
127
-
128
- exports.equalLine = equalLine;
129
-
130
- var equalRay = function equalRay(ray1, ray2) {
131
- // slope: m = (y2-y1)/(x2-x1)
132
- // slope & x1 = x3 & y1 = y3 & angle between (x1, y1) (x2, y2) is same as angle between (x3, y3) (x4, y4)
133
- var mRay1 = (ray1.to.y - ray1.from.y) / (ray1.to.x - ray1.from.x);
134
- var mRay2 = (ray2.to.y - ray2.from.y) / (ray2.to.x - ray2.from.x);
135
- var angleRay1 = Math.atan2(ray1.to.y - ray1.from.y, ray1.to.x - ray1.from.x) * 180 / Math.PI;
136
- var angleRay2 = Math.atan2(ray2.to.y - ray2.from.y, ray2.to.x - ray2.from.x) * 180 / Math.PI;
137
- return mRay1 === mRay2 && ray1.from.x === ray2.from.x && ray1.from.y === ray2.from.y && angleRay1 === angleRay2;
138
- };
139
-
140
- exports.equalRay = equalRay;
141
-
142
- var constructSegmentsFromPoints = function constructSegmentsFromPoints(points) {
143
- // takes the list of points that represent a polygon and transforms it into a list of segments; eg.:
144
- // points: A, B, C, D => segments: AB, BC, CD, DA
145
- return (points || []).map(function (point, index) {
146
- return {
147
- from: point,
148
- to: points[(index + 1) % points.length]
149
- };
150
- });
151
- };
152
-
153
- exports.constructSegmentsFromPoints = constructSegmentsFromPoints;
154
-
155
- var removeDuplicateSegments = function removeDuplicateSegments(segments) {
156
- segments = segments || []; // removes segments that are duplicates; eg. These segments are the same, so one will be removed:
157
- // segment1: from: { x: 1, y: 1 }, to: { x: 2, y: 1 }
158
- // segment2: from: { x: 2, y: 1 }, to: { x: 1, y: 1 }
159
-
160
- return (0, _uniqWith["default"])(segments, function (s1, s2) {
161
- return equalSegment(s1, s2);
162
- });
163
- };
164
-
165
- exports.removeDuplicateSegments = removeDuplicateSegments;
166
-
167
- var removeInvalidSegments = function removeInvalidSegments(segments) {
168
- segments = segments || []; // removes segments that start in a point and end in the same point (eg.: from: { x: 1, y: 1 }, to: { x: 1, y: 1 })
169
-
170
- return segments.filter(function (segment) {
171
- return !(0, _isEqual["default"])(segment.from, segment.to);
172
- });
173
- };
174
-
175
- exports.removeInvalidSegments = removeInvalidSegments;
176
-
177
- var equalPolygon = function equalPolygon(poly1, poly2) {
178
- var points1 = poly1.points;
179
- var points2 = poly2.points; // generate segments
180
-
181
- var segments1 = constructSegmentsFromPoints(points1);
182
- var segments2 = constructSegmentsFromPoints(points2);
183
- var segments1NoDuplicates = removeDuplicateSegments(removeInvalidSegments(segments1));
184
- var segments2NoDuplicates = removeDuplicateSegments(removeInvalidSegments(segments2));
185
- var differentSegments1 = (0, _differenceWith["default"])(segments1NoDuplicates, segments2NoDuplicates, equalSegment);
186
- var differentSegments2 = (0, _differenceWith["default"])(segments2NoDuplicates, segments1NoDuplicates, equalSegment);
187
- return (!differentSegments1 || !differentSegments1.length) && (!differentSegments2 || !differentSegments2.length);
188
- };
189
-
190
- exports.equalPolygon = equalPolygon;
191
-
192
- var equalCircle = function equalCircle(c1, c2) {
193
- var equalRootAndEdge = (0, _isEqual["default"])(c2.edge, c1.edge) && (0, _isEqual["default"])(c2.root, c1.root); // if both edge and root are the same, it means the shapes are exactly the same
194
-
195
- if (equalRootAndEdge) return true;
196
- var rC1 = Math.sqrt(Math.pow(c1.edge.x - c1.root.x, 2) + Math.pow(c1.edge.y - c1.root.y, 2));
197
- var rC2 = Math.sqrt(Math.pow(c2.edge.x - c2.root.x, 2) + Math.pow(c2.edge.y - c2.root.y, 2)); // if both root and radius are the same, it means the shapes are equal
198
-
199
- return (0, _isEqual["default"])(c2.root, c1.root) && (0, _isEqual["default"])(rC1, rC2);
200
- };
201
-
202
- exports.equalCircle = equalCircle;
203
-
204
- var equalSine = function equalSine(sine1, sine2) {
205
- var getPoints = function getPoints(_ref) {
206
- var root = _ref.root,
207
- edge = _ref.edge;
208
-
209
- var _getAmplitudeAndFreq = (0, _graphingUtils.getAmplitudeAndFreq)(root, edge),
210
- amplitude = _getAmplitudeAndFreq.amplitude,
211
- freq = _getAmplitudeAndFreq.freq; // the height of the sine wave
212
-
213
-
214
- var tY = Math.abs(root.y - edge.y) * 2; // the distance on x axis between edge and root
215
-
216
- var tXRoot = Math.abs(root.x - edge.x); // the distance on x axis between 2 edges for sine wave (min & max)
217
-
218
- var tX = tXRoot * 2; // the first edge placed east side of root
219
-
220
- var edgeAboveZeroX = edge.x;
221
- var edgeAboveZeroY = edge.y; // if edge less then 0, find out the appropriate edge placed east side of zero (0)
222
-
223
- while (edgeAboveZeroX < 0 && tX !== 0) {
224
- edgeAboveZeroX = edgeAboveZeroX + tX;
225
- edgeAboveZeroY = edgeAboveZeroY < root.y ? edgeAboveZeroY + tY : edgeAboveZeroY - tY;
226
- } // if edge more then 0, find out the appropriate edge placed east side of zero (0)
227
-
228
-
229
- while (edgeAboveZeroX - tX > 0 && tX !== 0) {
230
- edgeAboveZeroX = edgeAboveZeroX - tX;
231
- edgeAboveZeroY = edgeAboveZeroY < root.y ? edgeAboveZeroY + tY : edgeAboveZeroY - tY;
232
- }
233
-
234
- return {
235
- amplitude: getSignificantDecimals(amplitude),
236
- freq: getSignificantDecimals(freq),
237
- min: getSignificantDecimals(edge.y < root.y ? edge.y : edge.y - tY),
238
- max: getSignificantDecimals(edge.y < root.y ? edge.y + tY : edge.y),
239
- edgeAboveZeroX: getSignificantDecimals(edgeAboveZeroX),
240
- edgeAboveZeroY: getSignificantDecimals(edgeAboveZeroY)
241
- };
242
- };
243
-
244
- var studentAnswerBpY = getPoints(sine1);
245
- var correctAnswerBpY = getPoints(sine2);
246
- var amplitude1 = studentAnswerBpY.amplitude,
247
- freq1 = studentAnswerBpY.freq,
248
- min1 = studentAnswerBpY.min,
249
- max1 = studentAnswerBpY.max,
250
- edgeAboveZeroX1 = studentAnswerBpY.edgeAboveZeroX,
251
- edgeAboveZeroY1 = studentAnswerBpY.edgeAboveZeroY;
252
- var amplitude2 = correctAnswerBpY.amplitude,
253
- freq2 = correctAnswerBpY.freq,
254
- min2 = correctAnswerBpY.min,
255
- max2 = correctAnswerBpY.max,
256
- edgeAboveZeroX2 = correctAnswerBpY.edgeAboveZeroX,
257
- edgeAboveZeroY2 = correctAnswerBpY.edgeAboveZeroY;
258
- return Math.abs(amplitude1) === Math.abs(amplitude2) && Math.abs(freq1) === Math.abs(freq2) && min1 === min2 && max1 === max2 && edgeAboveZeroX1 === edgeAboveZeroX2 && edgeAboveZeroY1 === edgeAboveZeroY2; // rootDiff1 === rootDiff2);
259
- };
260
-
261
- exports.equalSine = equalSine;
262
-
263
- var equalParabola = function equalParabola(p1, p2) {
264
- var edgeP1 = p1.edge,
265
- rootP1 = p1.root;
266
- var edgeP2 = p2.edge,
267
- rootP2 = p2.root;
268
-
269
- var p1edge = edgeP1 || _objectSpread({}, rootP1);
270
-
271
- var p2edge = edgeP2 || _objectSpread({}, rootP2);
272
-
273
- var p1mirrorEdge = {
274
- x: rootP1.x - (p1edge.x - rootP1.x),
275
- y: p1edge.y
276
- };
277
- var p2mirrorEdge = {
278
- x: rootP2.x - (p2edge.x - rootP2.x),
279
- y: p2edge.y
280
- };
281
-
282
- var _pointsToABC = (0, _graphingUtils.pointsToABC)(rootP1, edgeP1, p1mirrorEdge),
283
- a1 = _pointsToABC.a,
284
- b1 = _pointsToABC.b,
285
- c1 = _pointsToABC.c;
286
-
287
- var _pointsToABC2 = (0, _graphingUtils.pointsToABC)(rootP2, edgeP2, p2mirrorEdge),
288
- a2 = _pointsToABC2.a,
289
- b2 = _pointsToABC2.b,
290
- c2 = _pointsToABC2.c; // sometimes numbers have this form: 1.00000000002 because of calculations, we have to round them
291
-
292
-
293
- var round = function round(number) {
294
- return Math.round(number * 10000) / 10000;
295
- };
296
-
297
- return round(a1) === round(a2) && round(b1) === round(b2) && round(c1) === round(c2);
298
- };
299
-
300
- exports.equalParabola = equalParabola;
301
- var equalMarks = {
302
- circle: function circle(sessAnswer, mark) {
303
- return equalCircle(sessAnswer, mark);
304
- },
305
- line: function line(sessAnswer, mark) {
306
- return equalLine(sessAnswer, mark);
307
- },
308
- parabola: function parabola(sessAnswer, mark) {
309
- return equalParabola(sessAnswer, mark);
310
- },
311
- point: function point(sessAnswer, mark) {
312
- return equalPoint(sessAnswer, mark);
313
- },
314
- polygon: function polygon(sessAnswer, poly) {
315
- return equalPolygon(sessAnswer, poly);
316
- },
317
- ray: function ray(sessAnswer, mark) {
318
- return equalRay(sessAnswer, mark);
319
- },
320
- segment: function segment(sessAnswer, mark) {
321
- return equalSegment(sessAnswer, mark);
322
- },
323
- sine: function sine(sessAnswer, mark) {
324
- return equalSine(sessAnswer, mark);
325
- },
326
- vector: function vector(sessAnswer, mark) {
327
- return equalVector(sessAnswer, mark);
328
- }
329
- };
330
- exports.equalMarks = equalMarks;
331
-
332
- var completePoint = function completePoint(point) {
333
- return point && Number.isFinite(point.x) && Number.isFinite(point.y);
334
- };
335
-
336
- var completeFromTo = function completeFromTo(item) {
337
- return item && completeMark.point(item.from) && completeMark.point(item.to);
338
- };
339
-
340
- var completeRootEdge = function completeRootEdge(item) {
341
- return item && completeMark.point(item.edge) && completeMark.point(item.root);
342
- };
343
-
344
- var completePoints = function completePoints(item) {
345
- return item && item.points && item.points.length && (item.points.filter(function (point) {
346
- return completePoint(point);
347
- }) || []).length === item.points.length;
348
- };
349
-
350
- var completeMark = {
351
- point: completePoint,
352
- line: completeFromTo,
353
- ray: completeFromTo,
354
- segment: completeFromTo,
355
- vector: completeFromTo,
356
- circle: completeRootEdge,
357
- parabola: completeRootEdge,
358
- sine: completeRootEdge,
359
- polygon: completePoints
360
- };
361
-
362
- var removeInvalidAnswers = function removeInvalidAnswers(answers) {
363
- return answers ? (answers || []).filter(function (_ref2) {
364
- var type = _ref2.type,
365
- answer = (0, _objectWithoutProperties2["default"])(_ref2, _excluded);
366
- return completeMark[type] ? completeMark[type](answer) : false;
367
- }) : [];
368
- };
369
-
370
- exports.removeInvalidAnswers = removeInvalidAnswers;
371
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils.js"],"names":["equalPoint","A","B","equalLabel","label","x","y","equalSegment","segment1","segment2","from","to","equalVector","vector1","vector2","sortedAnswers","answers","Object","keys","sort","reduce","result","key","returnLineEquationCoefficients","line","xA","yA","xB","yB","a","b","c","getSignificantDecimals","number","Math","round","equalLine","line1","line2","a1","b1","c1","a2","b2","c2","proportions","push","lodash","uniq","length","equalRay","ray1","ray2","mRay1","mRay2","angleRay1","atan2","PI","angleRay2","constructSegmentsFromPoints","points","map","point","index","removeDuplicateSegments","segments","s1","s2","removeInvalidSegments","filter","segment","equalPolygon","poly1","poly2","points1","points2","segments1","segments2","segments1NoDuplicates","segments2NoDuplicates","differentSegments1","differentSegments2","equalCircle","equalRootAndEdge","edge","root","rC1","sqrt","rC2","equalSine","sine1","sine2","getPoints","amplitude","freq","tY","abs","tXRoot","tX","edgeAboveZeroX","edgeAboveZeroY","min","max","studentAnswerBpY","correctAnswerBpY","amplitude1","freq1","min1","max1","edgeAboveZeroX1","edgeAboveZeroY1","amplitude2","freq2","min2","max2","edgeAboveZeroX2","edgeAboveZeroY2","equalParabola","p1","p2","edgeP1","rootP1","edgeP2","rootP2","p1edge","p2edge","p1mirrorEdge","p2mirrorEdge","equalMarks","circle","sessAnswer","mark","parabola","polygon","poly","ray","sine","vector","completePoint","Number","isFinite","completeFromTo","item","completeMark","completeRootEdge","completePoints","removeInvalidAnswers","type","answer"],"mappings":"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","sourcesContent":["import isEqual from 'lodash/isEqual';\nimport lodash from 'lodash';\nimport uniqWith from 'lodash/uniqWith';\nimport differenceWith from 'lodash/differenceWith';\nimport { getAmplitudeAndFreq, pointsToABC } from '@pie-lib/graphing-utils';\n\nexport const equalPoint = (A, B) => {\n // x1 = x2 & y1 = y2\n let equalLabel = true;\n\n if (A.label || B.label) {\n equalLabel = isEqual(A.label, B.label);\n }\n\n return isEqual(A.x, B.x) && isEqual(A.y, B.y) && equalLabel;\n};\n\nexport const equalSegment = (segment1, segment2) => {\n // A.from = B.from, A.to = B.to OR A.from = B.to, A.to = B.from\n // x1 = x3 & y1 = y3 & x2 = x4 & y2 = y4\n return (\n (isEqual(segment1.from, segment2.from) && isEqual(segment1.to, segment2.to)) ||\n (isEqual(segment1.to, segment2.from) && isEqual(segment1.from, segment2.to))\n );\n};\n\nexport const equalVector = (vector1, vector2) => {\n // A.from = B.from, A.to = B.to;\n // x1 = x3 & y1 = y3 & x2 = x4 & y2 = y4\n return isEqual(vector1.from, vector2.from) && isEqual(vector1.to, vector2.to);\n};\n\n// this function is implemented in configure as well\nexport const sortedAnswers = (answers) =>\n Object.keys(answers || {})\n .sort()\n .reduce((result, key) => {\n if (key !== 'correctAnswer') {\n result[key] = answers[key];\n }\n\n return result;\n }, {});\n\nconst returnLineEquationCoefficients = (line) => {\n const xA = line.from.x;\n const yA = line.from.y;\n const xB = line.to.x;\n const yB = line.to.y;\n\n return {\n a: yB - yA,\n b: xA - xB,\n c: xB * yA - xA * yB,\n };\n};\n\nconst getSignificantDecimals = (number) => Math.round(number * 10000) / 10000;\n\nexport const equalLine = (line1, line2) => {\n // line equation: ax + by + c = 0\n // 2 lines are equal if a1/a2 = b1/b2 = c1/c2, where a, b, c are the coefficients in line equation\n\n // line equation knowing 2 points: (y - yA) / (yB - yA) = (x - xA) / (xB - xA)\n // extending this equation, we get: x * (yB - yA) + y * (xA - xB) + (xB * yA - xA * yB) = 0\n // where a = yB - yA; b = xA - xB; c = xB * yA - xA * yB\n\n const { a: a1, b: b1, c: c1 } = returnLineEquationCoefficients(line1);\n const { a: a2, b: b2, c: c2 } = returnLineEquationCoefficients(line2);\n\n const proportions = [];\n\n if (a2 !== 0) {\n proportions.push(getSignificantDecimals(a1 / a2));\n } else if (a1 !== a2) {\n return false;\n }\n\n if (b2 !== 0) {\n proportions.push(getSignificantDecimals(b1 / b2));\n } else if (b1 !== b2) {\n return false;\n }\n\n if (c2 !== 0) {\n proportions.push(getSignificantDecimals(c1 / c2));\n } else if (c1 !== c2) {\n return false;\n }\n\n return lodash.uniq(proportions).length === 1;\n\n // (y2 - y1)/(x2 - x1) = (y4 - y3)/(x4 - x3);\n // return ((Math.abs((line1.to.y - line1.from.y) / (line1.to.x - line1.from.x))) === (Math.abs((line2.to.y - line2.from.y) / (line2.to.x - line2.from.x))));\n};\n\nexport const equalRay = (ray1, ray2) => {\n // slope: m = (y2-y1)/(x2-x1)\n // slope & x1 = x3 & y1 = y3 & angle between (x1, y1) (x2, y2) is same as angle between (x3, y3) (x4, y4)\n const mRay1 = (ray1.to.y - ray1.from.y) / (ray1.to.x - ray1.from.x);\n const mRay2 = (ray2.to.y - ray2.from.y) / (ray2.to.x - ray2.from.x);\n const angleRay1 = (Math.atan2(ray1.to.y - ray1.from.y, ray1.to.x - ray1.from.x) * 180) / Math.PI;\n const angleRay2 = (Math.atan2(ray2.to.y - ray2.from.y, ray2.to.x - ray2.from.x) * 180) / Math.PI;\n\n return mRay1 === mRay2 && ray1.from.x === ray2.from.x && ray1.from.y === ray2.from.y && angleRay1 === angleRay2;\n};\n\nexport const constructSegmentsFromPoints = (points) => {\n // takes the list of points that represent a polygon and transforms it into a list of segments; eg.:\n // points: A, B, C, D => segments: AB, BC, CD, DA\n return (points || []).map((point, index) => ({ from: point, to: points[(index + 1) % points.length] }));\n};\n\nexport const removeDuplicateSegments = (segments) => {\n segments = segments || [];\n // removes segments that are duplicates; eg. These segments are the same, so one will be removed:\n // segment1: from: { x: 1, y: 1 }, to: { x: 2, y: 1 }\n // segment2: from: { x: 2, y: 1 }, to: { x: 1, y: 1 }\n return uniqWith(segments, (s1, s2) => equalSegment(s1, s2));\n};\n\nexport const removeInvalidSegments = (segments) => {\n segments = segments || [];\n // removes segments that start in a point and end in the same point (eg.: from: { x: 1, y: 1 }, to: { x: 1, y: 1 })\n\n return segments.filter((segment) => !isEqual(segment.from, segment.to));\n};\n\nexport const equalPolygon = (poly1, poly2) => {\n const { points: points1 } = poly1;\n const { points: points2 } = poly2;\n\n // generate segments\n const segments1 = constructSegmentsFromPoints(points1);\n const segments2 = constructSegmentsFromPoints(points2);\n\n const segments1NoDuplicates = removeDuplicateSegments(removeInvalidSegments(segments1));\n const segments2NoDuplicates = removeDuplicateSegments(removeInvalidSegments(segments2));\n\n const differentSegments1 = differenceWith(segments1NoDuplicates, segments2NoDuplicates, equalSegment);\n const differentSegments2 = differenceWith(segments2NoDuplicates, segments1NoDuplicates, equalSegment);\n\n return (!differentSegments1 || !differentSegments1.length) && (!differentSegments2 || !differentSegments2.length);\n};\n\nexport const equalCircle = (c1, c2) => {\n const equalRootAndEdge = isEqual(c2.edge, c1.edge) && isEqual(c2.root, c1.root);\n\n // if both edge and root are the same, it means the shapes are exactly the same\n if (equalRootAndEdge) return true;\n\n const rC1 = Math.sqrt((c1.edge.x - c1.root.x) ** 2 + (c1.edge.y - c1.root.y) ** 2);\n const rC2 = Math.sqrt((c2.edge.x - c2.root.x) ** 2 + (c2.edge.y - c2.root.y) ** 2);\n\n // if both root and radius are the same, it means the shapes are equal\n return isEqual(c2.root, c1.root) && isEqual(rC1, rC2);\n};\n\nexport const equalSine = (sine1, sine2) => {\n const getPoints = ({ root, edge }) => {\n const { amplitude, freq } = getAmplitudeAndFreq(root, edge);\n // the height of the sine wave\n const tY = Math.abs(root.y - edge.y) * 2;\n // the distance on x axis between edge and root\n const tXRoot = Math.abs(root.x - edge.x);\n // the distance on x axis between 2 edges for sine wave (min & max)\n const tX = tXRoot * 2;\n // the first edge placed east side of root\n let edgeAboveZeroX = edge.x;\n let edgeAboveZeroY = edge.y;\n\n // if edge less then 0, find out the appropriate edge placed east side of zero (0)\n while (edgeAboveZeroX < 0 && tX !== 0) {\n edgeAboveZeroX = edgeAboveZeroX + tX;\n edgeAboveZeroY = edgeAboveZeroY < root.y ? edgeAboveZeroY + tY : edgeAboveZeroY - tY;\n }\n\n // if edge more then 0, find out the appropriate edge placed east side of zero (0)\n while (edgeAboveZeroX - tX > 0 && tX !== 0) {\n edgeAboveZeroX = edgeAboveZeroX - tX;\n edgeAboveZeroY = edgeAboveZeroY < root.y ? edgeAboveZeroY + tY : edgeAboveZeroY - tY;\n }\n\n return {\n amplitude: getSignificantDecimals(amplitude),\n freq: getSignificantDecimals(freq),\n min: getSignificantDecimals(edge.y < root.y ? edge.y : edge.y - tY),\n max: getSignificantDecimals(edge.y < root.y ? edge.y + tY : edge.y),\n edgeAboveZeroX: getSignificantDecimals(edgeAboveZeroX),\n edgeAboveZeroY: getSignificantDecimals(edgeAboveZeroY),\n };\n };\n\n const studentAnswerBpY = getPoints(sine1);\n const correctAnswerBpY = getPoints(sine2);\n\n const {\n amplitude: amplitude1,\n freq: freq1,\n min: min1,\n max: max1,\n edgeAboveZeroX: edgeAboveZeroX1,\n edgeAboveZeroY: edgeAboveZeroY1,\n } = studentAnswerBpY;\n const {\n amplitude: amplitude2,\n freq: freq2,\n min: min2,\n max: max2,\n edgeAboveZeroX: edgeAboveZeroX2,\n edgeAboveZeroY: edgeAboveZeroY2,\n } = correctAnswerBpY;\n\n return (\n Math.abs(amplitude1) === Math.abs(amplitude2) &&\n Math.abs(freq1) === Math.abs(freq2) &&\n min1 === min2 &&\n max1 === max2 &&\n edgeAboveZeroX1 === edgeAboveZeroX2 &&\n edgeAboveZeroY1 === edgeAboveZeroY2\n );\n // rootDiff1 === rootDiff2);\n};\n\nexport const equalParabola = (p1, p2) => {\n const { edge: edgeP1, root: rootP1 } = p1;\n const { edge: edgeP2, root: rootP2 } = p2;\n const p1edge = edgeP1 || { ...rootP1 };\n const p2edge = edgeP2 || { ...rootP2 };\n\n const p1mirrorEdge = { x: rootP1.x - (p1edge.x - rootP1.x), y: p1edge.y };\n const p2mirrorEdge = { x: rootP2.x - (p2edge.x - rootP2.x), y: p2edge.y };\n\n const { a: a1, b: b1, c: c1 } = pointsToABC(rootP1, edgeP1, p1mirrorEdge);\n const { a: a2, b: b2, c: c2 } = pointsToABC(rootP2, edgeP2, p2mirrorEdge);\n\n // sometimes numbers have this form: 1.00000000002 because of calculations, we have to round them\n const round = (number) => Math.round(number * 10000) / 10000;\n\n return round(a1) === round(a2) && round(b1) === round(b2) && round(c1) === round(c2);\n};\n\nexport const equalMarks = {\n circle: (sessAnswer, mark) => equalCircle(sessAnswer, mark),\n line: (sessAnswer, mark) => equalLine(sessAnswer, mark),\n parabola: (sessAnswer, mark) => equalParabola(sessAnswer, mark),\n point: (sessAnswer, mark) => equalPoint(sessAnswer, mark),\n polygon: (sessAnswer, poly) => equalPolygon(sessAnswer, poly),\n ray: (sessAnswer, mark) => equalRay(sessAnswer, mark),\n segment: (sessAnswer, mark) => equalSegment(sessAnswer, mark),\n sine: (sessAnswer, mark) => equalSine(sessAnswer, mark),\n vector: (sessAnswer, mark) => equalVector(sessAnswer, mark),\n};\n\nconst completePoint = (point) => point && Number.isFinite(point.x) && Number.isFinite(point.y);\nconst completeFromTo = (item) => item && completeMark.point(item.from) && completeMark.point(item.to);\nconst completeRootEdge = (item) => item && completeMark.point(item.edge) && completeMark.point(item.root);\nconst completePoints = (item) =>\n item &&\n item.points &&\n item.points.length &&\n (item.points.filter((point) => completePoint(point)) || []).length === item.points.length;\n\nconst completeMark = {\n point: completePoint,\n line: completeFromTo,\n ray: completeFromTo,\n segment: completeFromTo,\n vector: completeFromTo,\n circle: completeRootEdge,\n parabola: completeRootEdge,\n sine: completeRootEdge,\n polygon: completePoints,\n};\n\nexport const removeInvalidAnswers = (answers) =>\n answers\n ? (answers || []).filter(({ type, ...answer }) => (completeMark[type] ? completeMark[type](answer) : false))\n : [];\n"],"file":"utils.js"}