math-exercises 2.2.70 → 2.2.71
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/lib/exercises/math/calcul/fractions/fractionsOperations.d.ts.map +1 -1
- package/lib/exercises/math/calcul/fractions/fractionsOperations.js +6 -2
- package/lib/exercises/math/calculLitteral/distributivity/doubleDistributivitySubstract.d.ts +12 -0
- package/lib/exercises/math/calculLitteral/distributivity/doubleDistributivitySubstract.d.ts.map +1 -0
- package/lib/exercises/math/calculLitteral/distributivity/doubleDistributivitySubstract.js +128 -0
- package/lib/exercises/math/calculLitteral/distributivity/index.d.ts +1 -0
- package/lib/exercises/math/calculLitteral/distributivity/index.d.ts.map +1 -1
- package/lib/exercises/math/calculLitteral/distributivity/index.js +1 -0
- package/lib/exercises/math/geometry/angles/index.d.ts +2 -0
- package/lib/exercises/math/geometry/angles/index.d.ts.map +1 -0
- package/lib/exercises/math/geometry/angles/index.js +17 -0
- package/lib/exercises/math/geometry/angles/recognizeAngleType.d.ts +11 -0
- package/lib/exercises/math/geometry/angles/recognizeAngleType.d.ts.map +1 -0
- package/lib/exercises/math/geometry/angles/recognizeAngleType.js +272 -0
- package/lib/exercises/math/geometry/euclidianConstructions/pointImageFromTranslation.js +1 -1
- package/lib/exercises/math/geometry/index.d.ts +1 -0
- package/lib/exercises/math/geometry/index.d.ts.map +1 -1
- package/lib/exercises/math/geometry/index.js +1 -0
- package/lib/exercises/math/geometry/volumes/parallelepipedVolume.d.ts.map +1 -1
- package/lib/exercises/math/geometry/volumes/parallelepipedVolume.js +0 -1
- package/lib/index.d.ts +11 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/math/geometry/angle.d.ts +22 -1
- package/lib/math/geometry/angle.d.ts.map +1 -1
- package/lib/math/geometry/angle.js +138 -1
- package/lib/math/geometry/line.d.ts +2 -0
- package/lib/math/geometry/line.d.ts.map +1 -1
- package/lib/math/geometry/line.js +16 -0
- package/lib/math/geometry/point.d.ts +1 -0
- package/lib/math/geometry/point.d.ts.map +1 -1
- package/lib/math/geometry/point.js +4 -0
- package/lib/math/geometry/vector.d.ts +3 -0
- package/lib/math/geometry/vector.d.ts.map +1 -1
- package/lib/math/geometry/vector.js +9 -0
- package/lib/math/polynomials/generalAffine.d.ts +3 -0
- package/lib/math/polynomials/generalAffine.d.ts.map +1 -1
- package/lib/math/polynomials/generalAffine.js +4 -0
- package/lib/playground.d.ts.map +1 -1
- package/lib/tree/nodes/node.d.ts +4 -2
- package/lib/tree/nodes/node.d.ts.map +1 -1
- package/lib/tree/nodes/node.js +2 -0
- package/lib/tree/nodes/nodeConstructor.d.ts.map +1 -1
- package/lib/tree/nodes/nodeConstructor.js +4 -0
- package/lib/tree/nodes/operators/addNode.d.ts.map +1 -1
- package/lib/tree/nodes/operators/addNode.js +123 -90
- package/lib/tree/nodes/polynomials/monomNode.d.ts +47 -0
- package/lib/tree/nodes/polynomials/monomNode.d.ts.map +1 -0
- package/lib/tree/nodes/polynomials/monomNode.js +214 -0
- package/lib/tree/parsers/affineParser.js +1 -1
- package/lib/tree/parsers/monomParser.d.ts +2 -2
- package/lib/tree/parsers/monomParser.d.ts.map +1 -1
- package/lib/tree/parsers/monomParser.js +59 -6
- package/lib/tree/parsers/powerParser.d.ts +1 -1
- package/lib/tree/parsers/trinomParser.js +1 -1
- package/package.json +1 -1
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Angle = void 0;
|
|
3
|
+
exports.Angle = exports.AngleConstructor = void 0;
|
|
4
4
|
const piNode_1 = require("../../tree/nodes/numbers/piNode");
|
|
5
5
|
const fractionNode_1 = require("../../tree/nodes/operators/fractionNode");
|
|
6
6
|
const multiplyNode_1 = require("../../tree/nodes/operators/multiplyNode");
|
|
7
7
|
const round_1 = require("../utils/round");
|
|
8
|
+
const point_1 = require("./point");
|
|
9
|
+
const nodeConstructor_1 = require("../../tree/nodes/nodeConstructor");
|
|
10
|
+
const vector_1 = require("./vector");
|
|
11
|
+
const line_1 = require("./line");
|
|
12
|
+
class AngleConstructor {
|
|
13
|
+
static fromIdentifiers(identifiers) {
|
|
14
|
+
return new Angle(identifiers.points.map(point_1.PointConstructor.fromIdentifiers), {
|
|
15
|
+
degreeValueNode: identifiers.props?.degreeValueNode
|
|
16
|
+
? (0, nodeConstructor_1.reifyAlgebraic)(identifiers.props.degreeValueNode)
|
|
17
|
+
: undefined,
|
|
18
|
+
radianValueNode: identifiers.props?.radianValueNode
|
|
19
|
+
? (0, nodeConstructor_1.reifyAlgebraic)(identifiers.props.radianValueNode)
|
|
20
|
+
: undefined,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.AngleConstructor = AngleConstructor;
|
|
8
25
|
class Angle {
|
|
9
26
|
/**
|
|
10
27
|
*
|
|
@@ -12,6 +29,7 @@ class Angle {
|
|
|
12
29
|
*/
|
|
13
30
|
constructor(points, props) {
|
|
14
31
|
this.points = points;
|
|
32
|
+
this.props = props;
|
|
15
33
|
this.radianValueNode = props?.radianValueNode;
|
|
16
34
|
this.degreeValueNode = props?.degreeValueNode;
|
|
17
35
|
if (props?.radianValueNode && !props.degreeValueNode) {
|
|
@@ -21,6 +39,125 @@ class Angle {
|
|
|
21
39
|
this.radianValueNode = (0, fractionNode_1.frac)((0, multiplyNode_1.multiply)(props.degreeValueNode, piNode_1.PiNode), (180).toTree());
|
|
22
40
|
}
|
|
23
41
|
}
|
|
42
|
+
toIdentifiers() {
|
|
43
|
+
return {
|
|
44
|
+
points: this.points.map((p) => p.toIdentifiers()),
|
|
45
|
+
props: {
|
|
46
|
+
degreeValueNode: this.degreeValueNode?.toIdentifiers(),
|
|
47
|
+
radianValueNode: this.radianValueNode?.toIdentifiers(),
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
hasSameApex(a) {
|
|
52
|
+
return this.points[1].equals(a.points[1]);
|
|
53
|
+
}
|
|
54
|
+
equals(a) {
|
|
55
|
+
if (!this.hasSameApex(a))
|
|
56
|
+
return false;
|
|
57
|
+
const vecs = [
|
|
58
|
+
[
|
|
59
|
+
vector_1.VectorConstructor.fromPoints(this.points[1], this.points[0]),
|
|
60
|
+
vector_1.VectorConstructor.fromPoints(this.points[1], this.points[2]),
|
|
61
|
+
],
|
|
62
|
+
[
|
|
63
|
+
vector_1.VectorConstructor.fromPoints(a.points[1], a.points[0]),
|
|
64
|
+
vector_1.VectorConstructor.fromPoints(a.points[1], a.points[2]),
|
|
65
|
+
],
|
|
66
|
+
];
|
|
67
|
+
if (vecs[0][0].hasSameOrientation(vecs[1][0])) {
|
|
68
|
+
return vecs[0][1].hasSameOrientation(vecs[1][1]);
|
|
69
|
+
}
|
|
70
|
+
if (vecs[0][0].hasSameOrientation(vecs[1][1])) {
|
|
71
|
+
return vecs[0][1].hasSameOrientation(vecs[1][0]);
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
isAlterne(a) {
|
|
76
|
+
if (this.hasSameApex(a))
|
|
77
|
+
return false;
|
|
78
|
+
const symetric = new Angle([
|
|
79
|
+
a.points[0].centralSymetric(a.points[1]),
|
|
80
|
+
a.points[1],
|
|
81
|
+
a.points[2].centralSymetric(a.points[1]),
|
|
82
|
+
]);
|
|
83
|
+
return symetric.isCorrespondant(this);
|
|
84
|
+
}
|
|
85
|
+
isAlterneInterne(a) {
|
|
86
|
+
if (this.hasSameApex(a))
|
|
87
|
+
return false;
|
|
88
|
+
if (this.isFlat() || a.isFlat())
|
|
89
|
+
return false;
|
|
90
|
+
const apexesVec = vector_1.VectorConstructor.fromPoints(this.points[1], a.points[1]);
|
|
91
|
+
const line = new line_1.Line(this.points[1], a.points[1]);
|
|
92
|
+
const aPointIndexOnLine = a.points.findIndex((p, i) => i !== 1 && line.includes(p, true));
|
|
93
|
+
const thisPointIndexOnLine = this.points.findIndex((p, i) => i !== 1 && line.includes(p, true));
|
|
94
|
+
if (aPointIndexOnLine < 0 || thisPointIndexOnLine < 0)
|
|
95
|
+
return false;
|
|
96
|
+
const vecs = [
|
|
97
|
+
[
|
|
98
|
+
vector_1.VectorConstructor.fromPoints(this.points[1], this.points[thisPointIndexOnLine]),
|
|
99
|
+
vector_1.VectorConstructor.fromPoints(this.points[1], this.points[2 - thisPointIndexOnLine]),
|
|
100
|
+
],
|
|
101
|
+
[
|
|
102
|
+
vector_1.VectorConstructor.fromPoints(a.points[1], a.points[aPointIndexOnLine]),
|
|
103
|
+
vector_1.VectorConstructor.fromPoints(a.points[1], a.points[2 - aPointIndexOnLine]),
|
|
104
|
+
],
|
|
105
|
+
];
|
|
106
|
+
return (vecs[0][0].hasSameOrientation(apexesVec) &&
|
|
107
|
+
vecs[1][0].hasOppositeOrientation(apexesVec) &&
|
|
108
|
+
vecs[0][1].scalarProduct(vecs[1][1]).evaluate() < 0);
|
|
109
|
+
}
|
|
110
|
+
isFlat() {
|
|
111
|
+
return vector_1.VectorConstructor.fromPoints(this.points[1], this.points[2]).isColinear(vector_1.VectorConstructor.fromPoints(this.points[1], this.points[0]));
|
|
112
|
+
}
|
|
113
|
+
isCorrespondant(a) {
|
|
114
|
+
if (this.hasSameApex(a))
|
|
115
|
+
return false;
|
|
116
|
+
//angles plats ne sont pas créés par intersections de droites donc ne peuvent pas etre correspondants
|
|
117
|
+
if (this.isFlat() || a.isFlat())
|
|
118
|
+
return false;
|
|
119
|
+
const line = new line_1.Line(this.points[1], a.points[1]);
|
|
120
|
+
const aPointIndexOnLine = a.points.findIndex((p, i) => i !== 1 && line.includes(p, true));
|
|
121
|
+
const thisPointIndexOnLine = this.points.findIndex((p, i) => i !== 1 && line.includes(p, true));
|
|
122
|
+
if (aPointIndexOnLine < 0 || thisPointIndexOnLine < 0)
|
|
123
|
+
return false;
|
|
124
|
+
//angle non plat
|
|
125
|
+
if (line.includes(a.points[2 - aPointIndexOnLine], true))
|
|
126
|
+
return false;
|
|
127
|
+
const vecs = [
|
|
128
|
+
[
|
|
129
|
+
vector_1.VectorConstructor.fromPoints(this.points[1], this.points[thisPointIndexOnLine]),
|
|
130
|
+
vector_1.VectorConstructor.fromPoints(this.points[1], this.points[2 - thisPointIndexOnLine]),
|
|
131
|
+
],
|
|
132
|
+
[
|
|
133
|
+
vector_1.VectorConstructor.fromPoints(a.points[1], a.points[aPointIndexOnLine]),
|
|
134
|
+
vector_1.VectorConstructor.fromPoints(a.points[1], a.points[2 - aPointIndexOnLine]),
|
|
135
|
+
],
|
|
136
|
+
];
|
|
137
|
+
return (vecs[0][0].hasSameOrientation(vecs[1][0]) &&
|
|
138
|
+
vecs[0][1].scalarProduct(vecs[1][1]).evaluate() > 0);
|
|
139
|
+
}
|
|
140
|
+
isSummitOpposite(a) {
|
|
141
|
+
if (!this.hasSameApex(a))
|
|
142
|
+
return false;
|
|
143
|
+
const vecs = [
|
|
144
|
+
[
|
|
145
|
+
vector_1.VectorConstructor.fromPoints(this.points[1], this.points[0]),
|
|
146
|
+
vector_1.VectorConstructor.fromPoints(this.points[1], this.points[2]),
|
|
147
|
+
],
|
|
148
|
+
[
|
|
149
|
+
vector_1.VectorConstructor.fromPoints(a.points[1], a.points[0]),
|
|
150
|
+
vector_1.VectorConstructor.fromPoints(a.points[1], a.points[2]),
|
|
151
|
+
],
|
|
152
|
+
];
|
|
153
|
+
if (vecs[0][0].hasOppositeOrientation(vecs[1][0])) {
|
|
154
|
+
return vecs[0][1].hasOppositeOrientation(vecs[1][1]);
|
|
155
|
+
}
|
|
156
|
+
if (vecs[0][0].hasOppositeOrientation(vecs[1][1])) {
|
|
157
|
+
return vecs[0][1].hasOppositeOrientation(vecs[1][0]);
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
24
161
|
evaluate(inRadian = false) {
|
|
25
162
|
if (this.degreeValueNode || this.radianValueNode) {
|
|
26
163
|
if (inRadian)
|
|
@@ -36,6 +36,8 @@ export declare class Line {
|
|
|
36
36
|
getParallele(point: Point): Line;
|
|
37
37
|
getPerpendicular(point: Point): Line;
|
|
38
38
|
includes(point: Point, allowApprox?: boolean): boolean;
|
|
39
|
+
getPointWithX(x: AlgebraicNode, name?: string): Point;
|
|
40
|
+
getPointWithY(y: AlgebraicNode, name?: string): Point;
|
|
39
41
|
getRandomPoint(name?: string): Point;
|
|
40
42
|
getEquation: (u: Vector, a: Point) => EqualNode;
|
|
41
43
|
getCartesianEquation(): EqualNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"line.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/line.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAO,MAAM,oCAAoC,CAAC;AAMlE,OAAO,EACL,aAAa,EAEd,MAAM,0CAA0C,CAAC;AAKlD,OAAO,EAAE,KAAK,EAAoB,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAqB,MAAM,UAAU,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AACF,8BAAsB,eAAe;IACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM;IAK3B,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,eAAe;IAOnD,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO;CAGpC;AACD,qBAAa,IAAI;IACf,MAAM,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,KAAK,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7B,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;gBACJ,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM;IAsBvD,aAAa;;;;;IAOb,WAAW,CAAC,IAAI,EAAE,IAAI;IAYtB,iBAAiB;IAIjB,YAAY,CAAC,KAAK,EAAE,KAAK;IAYzB,gBAAgB,CAAC,KAAK,EAAE,KAAK;IAW7B,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,GAAE,OAAe;
|
|
1
|
+
{"version":3,"file":"line.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/line.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAO,MAAM,oCAAoC,CAAC;AAMlE,OAAO,EACL,aAAa,EAEd,MAAM,0CAA0C,CAAC;AAKlD,OAAO,EAAE,KAAK,EAAoB,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAqB,MAAM,UAAU,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AACF,8BAAsB,eAAe;IACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM;IAK3B,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,eAAe;IAOnD,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO;CAGpC;AACD,qBAAa,IAAI;IACf,MAAM,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,KAAK,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7B,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;gBACJ,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM;IAsBvD,aAAa;;;;;IAOb,WAAW,CAAC,IAAI,EAAE,IAAI;IAYtB,iBAAiB;IAIjB,YAAY,CAAC,KAAK,EAAE,KAAK;IAYzB,gBAAgB,CAAC,KAAK,EAAE,KAAK;IAW7B,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,GAAE,OAAe;IAgBnD,aAAa,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM;IAK7C,aAAa,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM;IAW7C,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM;IAa5B,WAAW,MAAO,MAAM,KAAK,KAAK,KAAG,SAAS,CAmB5C;IAEF,oBAAoB,IAAI,SAAS;IAuBjC,WAAW;IAMX,iBAAiB;;;;;IAcjB,KAAK;IAGL,gBAAgB;IAIhB,aAAa,CACX,iBAAiB,EAAE,OAAO,EAC1B,EACE,OAAc,EACd,SAAiB,EACjB,yBAAgC,GACjC,GAAE,kBAAuB;IAqB5B,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,MAAM;CAW7C"}
|
|
@@ -104,6 +104,7 @@ class Line {
|
|
|
104
104
|
includes(point, allowApprox = false) {
|
|
105
105
|
if (this.isVertical) {
|
|
106
106
|
if (allowApprox) {
|
|
107
|
+
return (Math.abs(point.x.evaluate() - this.pointA.x.evaluate()) < 0.0000001);
|
|
107
108
|
}
|
|
108
109
|
else
|
|
109
110
|
return point.x.equals(this.pointA.x);
|
|
@@ -115,6 +116,21 @@ class Line {
|
|
|
115
116
|
else
|
|
116
117
|
return evaluation === 0;
|
|
117
118
|
}
|
|
119
|
+
getPointWithX(x, name) {
|
|
120
|
+
if (this.isVertical)
|
|
121
|
+
return this.pointA.midpoint(this.pointB, name);
|
|
122
|
+
const y = (0, addNode_1.add)((0, multiplyNode_1.multiply)(this.a, x), this.b).simplify();
|
|
123
|
+
return new point_1.Point(name ?? "P", x, y);
|
|
124
|
+
}
|
|
125
|
+
getPointWithY(y, name) {
|
|
126
|
+
if (this.a?.evaluate() === 0)
|
|
127
|
+
return this.pointA.midpoint(this.pointB, name);
|
|
128
|
+
if (this.isVertical) {
|
|
129
|
+
return new point_1.Point(name ?? "P", this.pointA.x, y);
|
|
130
|
+
}
|
|
131
|
+
const x = (0, fractionNode_1.frac)((0, substractNode_1.substract)(y, this.b), this.a).simplify();
|
|
132
|
+
return new point_1.Point(name ?? "P", x, y);
|
|
133
|
+
}
|
|
118
134
|
//! caution: simplify ne gère pas bien ici
|
|
119
135
|
getRandomPoint(name) {
|
|
120
136
|
if (this.isVertical) {
|
|
@@ -36,5 +36,6 @@ export declare class Point {
|
|
|
36
36
|
toMathString(): string;
|
|
37
37
|
toGGBCommand({ isFixed, showLabel, style, size, color, }?: ToGGBCommandsProps): string[];
|
|
38
38
|
rotate(angle: number, center: Point): Point;
|
|
39
|
+
centralSymetric(center: Point, name?: string): Point;
|
|
39
40
|
}
|
|
40
41
|
//# sourceMappingURL=point.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/point.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAEL,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAM1C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,eAAe,CAAC;IACnB,CAAC,EAAE,eAAe,CAAC;CACpB,CAAC;AACF,8BAAsB,gBAAgB;IACpC,MAAM,CAAC,MAAM,CAAC,IAAI,SAAM;IAGxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAM,EAAE,GAAG,SAAK,GAAG,KAAK;IAMvD,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,gBAAgB;IAQpD,MAAM,CAAC,SAAS,CACd,CAAC,EAAE,KAAK,EACR,CAAC,EAAE,KAAK,EACR,IAAI,EAAE,MAAM,EACZ,EACE,OAAa,EACb,WAAW,GACZ,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAQpD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE;IAetC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM;CAclC;AAED,qBAAa,KAAK;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,aAAa,CAAC;IACjB,CAAC,EAAE,aAAa,CAAC;gBACL,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa;IAM5D,KAAK,IAAI,MAAM;IAGf,aAAa,IAAI,gBAAgB;IAQjC,eAAe,IAAI,MAAM;IAGzB,QAAQ,IAAI,MAAM;IAIlB,UAAU,IAAI,MAAM;IAIpB,UAAU,IAAI,MAAM;IAIpB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,SAAM,GAAG,KAAK;IAiBrC,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM;IAM5B,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO;IAGzB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK;IAK5B,YAAY;IAGZ,YAAY,CAAC,EACX,OAAc,EACd,SAAgB,EAChB,KAAK,EACL,IAAI,EACJ,KAAK,GACN,GAAE,kBAAuB;IAiB1B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/point.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAEL,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAM1C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,eAAe,CAAC;IACnB,CAAC,EAAE,eAAe,CAAC;CACpB,CAAC;AACF,8BAAsB,gBAAgB;IACpC,MAAM,CAAC,MAAM,CAAC,IAAI,SAAM;IAGxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAM,EAAE,GAAG,SAAK,GAAG,KAAK;IAMvD,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,gBAAgB;IAQpD,MAAM,CAAC,SAAS,CACd,CAAC,EAAE,KAAK,EACR,CAAC,EAAE,KAAK,EACR,IAAI,EAAE,MAAM,EACZ,EACE,OAAa,EACb,WAAW,GACZ,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAQpD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE;IAetC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM;CAclC;AAED,qBAAa,KAAK;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,aAAa,CAAC;IACjB,CAAC,EAAE,aAAa,CAAC;gBACL,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa;IAM5D,KAAK,IAAI,MAAM;IAGf,aAAa,IAAI,gBAAgB;IAQjC,eAAe,IAAI,MAAM;IAGzB,QAAQ,IAAI,MAAM;IAIlB,UAAU,IAAI,MAAM;IAIpB,UAAU,IAAI,MAAM;IAIpB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,SAAM,GAAG,KAAK;IAiBrC,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM;IAM5B,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO;IAGzB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK;IAK5B,YAAY;IAGZ,YAAY,CAAC,EACX,OAAc,EACd,SAAgB,EAChB,KAAK,EACL,IAAI,EACJ,KAAK,GACN,GAAE,kBAAuB;IAiB1B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;IAiBnC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,SAAkB;CAItD"}
|
|
@@ -136,5 +136,9 @@ class Point {
|
|
|
136
136
|
const sin = Math.sin(angle);
|
|
137
137
|
return new Point(this.name, (0, substractNode_1.substract)((0, multiplyNode_1.multiply)(cos, this.x).simplify(), (0, multiplyNode_1.multiply)(sin, this.y).simplify()).simplify(), (0, addNode_1.add)((0, multiplyNode_1.multiply)(sin, this.x).simplify(), (0, multiplyNode_1.multiply)(cos, this.y).simplify()).simplify());
|
|
138
138
|
}
|
|
139
|
+
centralSymetric(center, name = this.name + "'") {
|
|
140
|
+
const vec = vector_1.VectorConstructor.fromPoints(this, center).opposite();
|
|
141
|
+
return vec.getEndPoint(center, name);
|
|
142
|
+
}
|
|
139
143
|
}
|
|
140
144
|
exports.Point = Point;
|
|
@@ -14,8 +14,11 @@ export declare class Vector {
|
|
|
14
14
|
toTexWithCoords(): string;
|
|
15
15
|
toInlineCoordsTex(): string;
|
|
16
16
|
isColinear(v: Vector): boolean;
|
|
17
|
+
hasOppositeOrientation(v: Vector): boolean;
|
|
18
|
+
hasSameOrientation(v: Vector): boolean;
|
|
17
19
|
determinant(v: Vector): AlgebraicNode;
|
|
18
20
|
times(k: AlgebraicNode, name?: string): Vector;
|
|
21
|
+
opposite(): Vector;
|
|
19
22
|
scalarProduct(v: Vector): AlgebraicNode;
|
|
20
23
|
add(v: Vector): Vector;
|
|
21
24
|
getNorm(): AlgebraicNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vector.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/vector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAgB/D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,8BAAsB,iBAAiB;IACrC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,MAAM;IAOpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,UAAO,GAAG,MAAM;CAOtD;AAED,qBAAa,MAAM;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,aAAa,CAAC;IACjB,CAAC,EAAE,aAAa,CAAC;gBACL,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa;IAO5D,KAAK,IAAI,MAAM;IAIf,eAAe,IAAI,MAAM;IAMzB,iBAAiB,IAAI,MAAM;IAM3B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAK9B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa;IAIrC,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM;IAOrC,aAAa,CAAC,CAAC,EAAE,MAAM;IAgBvB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAYtB,OAAO,IAAI,aAAa;IAUxB,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM;IAO5C,MAAM,CAAC,CAAC,EAAE,MAAM;IAIhB,YAAY;IAMZ,YAAY;IAOZ,aAAa;CAGd"}
|
|
1
|
+
{"version":3,"file":"vector.d.ts","sourceRoot":"","sources":["../../../src/math/geometry/vector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAgB/D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,8BAAsB,iBAAiB;IACrC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,MAAM;IAOpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,UAAO,GAAG,MAAM;CAOtD;AAED,qBAAa,MAAM;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,aAAa,CAAC;IACjB,CAAC,EAAE,aAAa,CAAC;gBACL,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa;IAO5D,KAAK,IAAI,MAAM;IAIf,eAAe,IAAI,MAAM;IAMzB,iBAAiB,IAAI,MAAM;IAM3B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAK9B,sBAAsB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAI1C,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAItC,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa;IAIrC,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM;IAOrC,QAAQ;IAGR,aAAa,CAAC,CAAC,EAAE,MAAM;IAgBvB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAYtB,OAAO,IAAI,aAAa;IAUxB,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM;IAO5C,MAAM,CAAC,CAAC,EAAE,MAAM;IAIhB,YAAY;IAMZ,YAAY;IAOZ,aAAa;CAGd"}
|
|
@@ -44,12 +44,21 @@ class Vector {
|
|
|
44
44
|
const ev = det.evaluate();
|
|
45
45
|
return Math.abs(ev) < 0.000001;
|
|
46
46
|
}
|
|
47
|
+
hasOppositeOrientation(v) {
|
|
48
|
+
return this.isColinear(v) && this.scalarProduct(v).evaluate() < 0;
|
|
49
|
+
}
|
|
50
|
+
hasSameOrientation(v) {
|
|
51
|
+
return this.isColinear(v) && this.scalarProduct(v).evaluate() > 0;
|
|
52
|
+
}
|
|
47
53
|
determinant(v) {
|
|
48
54
|
return (0, substractNode_1.substract)((0, multiplyNode_1.multiply)(this.x, v.y), (0, multiplyNode_1.multiply)(this.y, v.x)).simplify();
|
|
49
55
|
}
|
|
50
56
|
times(k, name) {
|
|
51
57
|
return new Vector(name ?? "v", new multiplyNode_1.MultiplyNode(this.x, k).simplify(), new multiplyNode_1.MultiplyNode(this.y, k).simplify());
|
|
52
58
|
}
|
|
59
|
+
opposite() {
|
|
60
|
+
return this.times((-1).toTree());
|
|
61
|
+
}
|
|
53
62
|
scalarProduct(v) {
|
|
54
63
|
// if (
|
|
55
64
|
// [this.x.type, this.y.type, v.x.type, v.y.type].some(
|
|
@@ -2,6 +2,9 @@ import { AlgebraicNode } from "../../tree/nodes/algebraicNode";
|
|
|
2
2
|
import { NodeIdentifiers } from "../../tree/nodes/nodeConstructor";
|
|
3
3
|
export declare abstract class GeneralAffineConstructor {
|
|
4
4
|
static fromIdentifiers(identifiers: GeneralAffineIdentifiers): GeneralAffine;
|
|
5
|
+
static randomInts({ allowBNull }: {
|
|
6
|
+
allowBNull?: boolean | undefined;
|
|
7
|
+
}, variable?: string): GeneralAffine;
|
|
5
8
|
}
|
|
6
9
|
export type GeneralAffineIdentifiers = {
|
|
7
10
|
id: "affine";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generalAffine.d.ts","sourceRoot":"","sources":["../../../src/math/polynomials/generalAffine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,EAEL,eAAe,EAEhB,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"generalAffine.d.ts","sourceRoot":"","sources":["../../../src/math/polynomials/generalAffine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,OAAO,EAEL,eAAe,EAEhB,MAAM,kCAAkC,CAAC;AAS1C,8BAAsB,wBAAwB;IAC5C,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,wBAAwB;IAM5D,MAAM,CAAC,UAAU,CAAC,EAAE,UAAiB,EAAE;;KAAA,EAAE,QAAQ,SAAM;CAOxD;AACD,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,QAAQ,CAAC;IACb,CAAC,EAAE,eAAe,CAAC;IACnB,CAAC,EAAE,eAAe,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AACF,qBAAa,aAAa;IACxB,CAAC,EAAE,aAAa,CAAC;IACjB,CAAC,EAAE,aAAa,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;gBAGf,CAAC,EAAE,MAAM,GAAG,aAAa,EACzB,CAAC,EAAE,MAAM,GAAG,aAAa,EACzB,QAAQ,GAAE,MAAY;IAUxB,aAAa,IAAI,wBAAwB;IAQzC,OAAO,IAAI,aAAa;IAIxB,MAAM;IAMN,UAAU,CAAC,GAAG,EAAE,aAAa;IAI7B,QAAQ;CAMT"}
|
|
@@ -7,10 +7,14 @@ const addNode_1 = require("../../tree/nodes/operators/addNode");
|
|
|
7
7
|
const fractionNode_1 = require("../../tree/nodes/operators/fractionNode");
|
|
8
8
|
const multiplyNode_1 = require("../../tree/nodes/operators/multiplyNode");
|
|
9
9
|
const substractNode_1 = require("../../tree/nodes/operators/substractNode");
|
|
10
|
+
const randint_1 = require("../utils/random/randint");
|
|
10
11
|
class GeneralAffineConstructor {
|
|
11
12
|
static fromIdentifiers(identifiers) {
|
|
12
13
|
return new GeneralAffine((0, nodeConstructor_1.reifyAlgebraic)(identifiers.a), (0, nodeConstructor_1.reifyAlgebraic)(identifiers.b));
|
|
13
14
|
}
|
|
15
|
+
static randomInts({ allowBNull = true }, variable = "x") {
|
|
16
|
+
return new GeneralAffine((0, randint_1.randint)(-10, 11, [0]), (0, randint_1.randint)(-10, 11, allowBNull ? [] : [0]), variable);
|
|
17
|
+
}
|
|
14
18
|
}
|
|
15
19
|
exports.GeneralAffineConstructor = GeneralAffineConstructor;
|
|
16
20
|
class GeneralAffine {
|
package/lib/playground.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playground.d.ts","sourceRoot":"","sources":["../src/playground.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"playground.d.ts","sourceRoot":"","sources":["../src/playground.ts"],"names":[],"mappings":"AAoDA,eAAO,MAAM,UAAU,YAAW,CAAC"}
|
package/lib/tree/nodes/node.d.ts
CHANGED
|
@@ -11,7 +11,8 @@ export declare enum NodeType {
|
|
|
11
11
|
belongs = 9,
|
|
12
12
|
vector = 10,
|
|
13
13
|
set = 11,
|
|
14
|
-
trinom = 12
|
|
14
|
+
trinom = 12,
|
|
15
|
+
monom = 13
|
|
15
16
|
}
|
|
16
17
|
export type NodeOptions = {
|
|
17
18
|
forceTimesSign?: boolean;
|
|
@@ -80,7 +81,8 @@ export declare enum NodeIds {
|
|
|
80
81
|
inequation = 36,
|
|
81
82
|
inequationSolution = 37,
|
|
82
83
|
binomialCoefficient = 38,
|
|
83
|
-
trinom = 39
|
|
84
|
+
trinom = 39,
|
|
85
|
+
monom = 40
|
|
84
86
|
}
|
|
85
87
|
export interface Node {
|
|
86
88
|
type: NodeType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/node.ts"],"names":[],"mappings":"AAEA,oBAAY,QAAQ;IAClB,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,UAAU,IAAA;IACV,KAAK,IAAA;IACL,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,OAAO,IAAA;IACP,MAAM,KAAA;IACN,GAAG,KAAA;IACH,MAAM,KAAA;
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/node.ts"],"names":[],"mappings":"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"}
|
package/lib/tree/nodes/node.js
CHANGED
|
@@ -16,6 +16,7 @@ var NodeType;
|
|
|
16
16
|
NodeType[NodeType["vector"] = 10] = "vector";
|
|
17
17
|
NodeType[NodeType["set"] = 11] = "set";
|
|
18
18
|
NodeType[NodeType["trinom"] = 12] = "trinom";
|
|
19
|
+
NodeType[NodeType["monom"] = 13] = "monom";
|
|
19
20
|
})(NodeType || (exports.NodeType = NodeType = {}));
|
|
20
21
|
var NodeIds;
|
|
21
22
|
(function (NodeIds) {
|
|
@@ -59,4 +60,5 @@ var NodeIds;
|
|
|
59
60
|
NodeIds[NodeIds["inequationSolution"] = 37] = "inequationSolution";
|
|
60
61
|
NodeIds[NodeIds["binomialCoefficient"] = 38] = "binomialCoefficient";
|
|
61
62
|
NodeIds[NodeIds["trinom"] = 39] = "trinom";
|
|
63
|
+
NodeIds[NodeIds["monom"] = 40] = "monom";
|
|
62
64
|
})(NodeIds || (exports.NodeIds = NodeIds = {}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeConstructor.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/nodeConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAwBhD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"nodeConstructor.d.ts","sourceRoot":"","sources":["../../../src/tree/nodes/nodeConstructor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAwBhD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAoBvC,eAAO,MAAM,cAAc,gBAAiB,eAAe,kBACI,CAAC;AAChE,eAAO,MAAM,SAAS,gBAAiB,eAAe,SACR,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACpE,8BAAsB,eAAe;IACnC,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI;CAoS3D"}
|
|
@@ -38,6 +38,7 @@ const limitNode_1 = require("./operators/limitNode");
|
|
|
38
38
|
const multiplyNode_1 = require("./operators/multiplyNode");
|
|
39
39
|
const powerNode_1 = require("./operators/powerNode");
|
|
40
40
|
const substractNode_1 = require("./operators/substractNode");
|
|
41
|
+
const monomNode_1 = require("./polynomials/monomNode");
|
|
41
42
|
const belongsNode_1 = require("./sets/belongsNode");
|
|
42
43
|
const discreteSetNode_1 = require("./sets/discreteSetNode");
|
|
43
44
|
const intervalNode_1 = require("./sets/intervalNode");
|
|
@@ -173,6 +174,9 @@ class NodeConstructor {
|
|
|
173
174
|
case node_1.NodeIds.trinom: {
|
|
174
175
|
return new trinomNode_1.TrinomNode(NodeConstructor.fromIdentifiers(identifiers.a), NodeConstructor.fromIdentifiers(identifiers.b), NodeConstructor.fromIdentifiers(identifiers.c));
|
|
175
176
|
}
|
|
177
|
+
case node_1.NodeIds.monom: {
|
|
178
|
+
return new monomNode_1.MonomNode(NodeConstructor.fromIdentifiers(identifiers.a), identifiers.degree, identifiers.opts);
|
|
179
|
+
}
|
|
176
180
|
case node_1.NodeIds.binomialCoefficient: {
|
|
177
181
|
return new binomialCoefficientNode_1.BinomialCoefficientNode(NodeConstructor.fromIdentifiers(identifiers.leftChild), NodeConstructor.fromIdentifiers(identifiers.rightChild));
|
|
178
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/addNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EACL,uBAAuB,EACvB,WAAW,EAGZ,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"addNode.d.ts","sourceRoot":"","sources":["../../../../src/tree/nodes/operators/addNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EACL,uBAAuB,EACvB,WAAW,EAGZ,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAYlE,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,OAAO,CAE/C;AAED,eAAO,MAAM,GAAG,MACX,aAAa,GAAG,MAAM,GAAG,MAAM,KAC/B,aAAa,GAAG,MAAM,GAAG,MAAM,YAOnC,CAAC;AAEF,qBAAa,OAAQ,YAAW,uBAAuB;IACrD,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;gBAEjB,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,aAAa,EACzB,IAAI,CAAC,EAAE,WAAW;IASpB,OAAO,aAGL;IAEF,YAAY,IAAI,MAAM;IAItB,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,EAAE;IAoCtD,SAAS,IAAI,MAAM,EAAE;IAIrB,cAAc,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE;IAK5C,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM;IAerC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMtC,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,aAAa;IAmI/C,aAAa;;;;;;;;;IAOb,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;IAUpC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAMxD,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa;CAMxD"}
|
|
@@ -15,6 +15,7 @@ const multiplyNode_1 = require("./multiplyNode");
|
|
|
15
15
|
const fractionNode_1 = require("./fractionNode");
|
|
16
16
|
const colorize_1 = require("../../../utils/latex/colorize");
|
|
17
17
|
const round_1 = require("../../../math/utils/round");
|
|
18
|
+
const monomNode_1 = require("../polynomials/monomNode");
|
|
18
19
|
function isAddNode(a) {
|
|
19
20
|
return (0, operatorNode_1.isOperatorNode)(a) && a.id === operatorNode_1.OperatorIds.add;
|
|
20
21
|
}
|
|
@@ -130,96 +131,17 @@ class AddNode {
|
|
|
130
131
|
if (externals.length === 1)
|
|
131
132
|
return externals[0];
|
|
132
133
|
const simplifyExternalNodes = (a, b) => {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
(0, fractionNode_1.isFractionNode)(b)) {
|
|
145
|
-
//-(c/d) + e/f = -cf+ed / df
|
|
146
|
-
const c = a.child.leftChild;
|
|
147
|
-
const d = a.child.rightChild;
|
|
148
|
-
const e = b.leftChild;
|
|
149
|
-
const f = b.rightChild;
|
|
150
|
-
return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(c), f), new multiplyNode_1.MultiplyNode(e, d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
|
|
151
|
-
}
|
|
152
|
-
if (!opts?.towardsDistribute &&
|
|
153
|
-
(0, oppositeNode_1.isOppositeNode)(b) &&
|
|
154
|
-
(0, fractionNode_1.isFractionNode)(b.child) &&
|
|
155
|
-
(0, fractionNode_1.isFractionNode)(a)) {
|
|
156
|
-
//(c/d) + (-e/f) = cf-ed / df
|
|
157
|
-
const c = a.leftChild;
|
|
158
|
-
const d = a.rightChild;
|
|
159
|
-
const e = b.child.leftChild;
|
|
160
|
-
const f = b.child.rightChild;
|
|
161
|
-
return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(c, f), new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(e), d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
|
|
162
|
-
}
|
|
163
|
-
if (!opts?.towardsDistribute &&
|
|
164
|
-
(0, oppositeNode_1.isOppositeNode)(b) &&
|
|
165
|
-
(0, fractionNode_1.isFractionNode)(b.child) &&
|
|
166
|
-
(0, oppositeNode_1.isOppositeNode)(a) &&
|
|
167
|
-
(0, fractionNode_1.isFractionNode)(a.child)) {
|
|
168
|
-
//-(c/d) + (-e/f) = -cf-ed / df
|
|
169
|
-
const c = a.child.leftChild;
|
|
170
|
-
const d = a.child.rightChild;
|
|
171
|
-
const e = b.child.leftChild;
|
|
172
|
-
const f = b.child.rightChild;
|
|
173
|
-
return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(c), f), new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(e), d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
|
|
174
|
-
}
|
|
175
|
-
if (!opts?.towardsDistribute && (0, fractionNode_1.isFractionNode)(a)) {
|
|
176
|
-
//c/d + b
|
|
177
|
-
const c = a.leftChild;
|
|
178
|
-
const d = a.rightChild;
|
|
179
|
-
return new fractionNode_1.FractionNode(new AddNode(c, new multiplyNode_1.MultiplyNode(d, b)), d).simplify(opts);
|
|
180
|
-
}
|
|
181
|
-
if (!opts?.towardsDistribute &&
|
|
182
|
-
(0, oppositeNode_1.isOppositeNode)(a) &&
|
|
183
|
-
(0, fractionNode_1.isFractionNode)(a.child)) {
|
|
184
|
-
//-(c/d) + b = (-c+bd)/d
|
|
185
|
-
const c = a.child.leftChild;
|
|
186
|
-
const d = a.child.rightChild;
|
|
187
|
-
return new fractionNode_1.FractionNode(new AddNode(new oppositeNode_1.OppositeNode(c), new multiplyNode_1.MultiplyNode(d, b)), d).simplify(opts);
|
|
188
|
-
}
|
|
189
|
-
if (!opts?.towardsDistribute &&
|
|
190
|
-
(0, fractionNode_1.isFractionNode)(b) &&
|
|
191
|
-
!opts?.forceDistributeFractions) {
|
|
192
|
-
//a+c/d
|
|
193
|
-
const c = b.leftChild;
|
|
194
|
-
const d = b.rightChild;
|
|
195
|
-
return new fractionNode_1.FractionNode(new AddNode(c, new multiplyNode_1.MultiplyNode(d, a)), d).simplify(opts);
|
|
196
|
-
}
|
|
197
|
-
if (!opts?.towardsDistribute &&
|
|
198
|
-
(0, oppositeNode_1.isOppositeNode)(b) &&
|
|
199
|
-
(0, fractionNode_1.isFractionNode)(b.child) &&
|
|
200
|
-
!opts?.forceDistributeFractions) {
|
|
201
|
-
//a+-(c/d) = (da-c)/d
|
|
202
|
-
const c = b.child.leftChild;
|
|
203
|
-
const d = b.child.rightChild;
|
|
204
|
-
return new fractionNode_1.FractionNode(new AddNode(new oppositeNode_1.OppositeNode(c), new multiplyNode_1.MultiplyNode(d, a)), d).simplify(opts);
|
|
205
|
-
}
|
|
206
|
-
if ((0, numberNode_1.isNumberNode)(a) && (0, numberNode_1.isNumberNode)(b)) {
|
|
207
|
-
//geogebra rounds to 12, il faut mettre <12
|
|
208
|
-
return new numberNode_1.NumberNode((0, round_1.round)(a.value + b.value, 10));
|
|
209
|
-
}
|
|
210
|
-
if ((0, oppositeNode_1.isOppositeNode)(a) && (0, numberNode_1.isNumberNode)(a.child) && (0, numberNode_1.isNumberNode)(b)) {
|
|
211
|
-
return new numberNode_1.NumberNode(-a.child.value + b.value);
|
|
212
|
-
}
|
|
213
|
-
if ((0, oppositeNode_1.isOppositeNode)(b) && (0, numberNode_1.isNumberNode)(b.child) && (0, numberNode_1.isNumberNode)(a)) {
|
|
214
|
-
return new numberNode_1.NumberNode(-b.child.value + a.value);
|
|
215
|
-
}
|
|
216
|
-
if ((0, oppositeNode_1.isOppositeNode)(a) &&
|
|
217
|
-
(0, numberNode_1.isNumberNode)(a.child) &&
|
|
218
|
-
(0, oppositeNode_1.isOppositeNode)(b) &&
|
|
219
|
-
(0, numberNode_1.isNumberNode)(b.child)) {
|
|
220
|
-
return new numberNode_1.NumberNode(a.child.value + b.child.value);
|
|
221
|
-
}
|
|
222
|
-
//gérer opposites, fractions
|
|
134
|
+
const fracSimplify = addSimplifyFrac(a, b, opts);
|
|
135
|
+
if (fracSimplify)
|
|
136
|
+
return fracSimplify;
|
|
137
|
+
const nbSimplify = addSimplifyNumbers(a, b, opts);
|
|
138
|
+
if (nbSimplify)
|
|
139
|
+
return nbSimplify;
|
|
140
|
+
const monomSimplify = addSimplifyMonoms(a, b, opts);
|
|
141
|
+
if (monomSimplify)
|
|
142
|
+
return monomSimplify;
|
|
143
|
+
//TODO gérer le reste
|
|
144
|
+
//la suite s'occupe des factorisations
|
|
223
145
|
if (opts?.forbidFactorize)
|
|
224
146
|
return null;
|
|
225
147
|
const aSubExternals = [];
|
|
@@ -338,3 +260,114 @@ class AddNode {
|
|
|
338
260
|
}
|
|
339
261
|
}
|
|
340
262
|
exports.AddNode = AddNode;
|
|
263
|
+
const addSimplifyFrac = (a, b, opts) => {
|
|
264
|
+
if (!opts?.towardsDistribute && (0, fractionNode_1.isFractionNode)(a) && (0, fractionNode_1.isFractionNode)(b)) {
|
|
265
|
+
//c/d + e/f = cf+ed / df
|
|
266
|
+
const c = a.leftChild;
|
|
267
|
+
const d = a.rightChild;
|
|
268
|
+
const e = b.leftChild;
|
|
269
|
+
const f = b.rightChild;
|
|
270
|
+
return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(c, f), new multiplyNode_1.MultiplyNode(e, d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
|
|
271
|
+
}
|
|
272
|
+
if (!opts?.towardsDistribute &&
|
|
273
|
+
(0, oppositeNode_1.isOppositeNode)(a) &&
|
|
274
|
+
(0, fractionNode_1.isFractionNode)(a.child) &&
|
|
275
|
+
(0, fractionNode_1.isFractionNode)(b)) {
|
|
276
|
+
//-(c/d) + e/f = -cf+ed / df
|
|
277
|
+
const c = a.child.leftChild;
|
|
278
|
+
const d = a.child.rightChild;
|
|
279
|
+
const e = b.leftChild;
|
|
280
|
+
const f = b.rightChild;
|
|
281
|
+
return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(c), f), new multiplyNode_1.MultiplyNode(e, d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
|
|
282
|
+
}
|
|
283
|
+
if (!opts?.towardsDistribute &&
|
|
284
|
+
(0, oppositeNode_1.isOppositeNode)(b) &&
|
|
285
|
+
(0, fractionNode_1.isFractionNode)(b.child) &&
|
|
286
|
+
(0, fractionNode_1.isFractionNode)(a)) {
|
|
287
|
+
//(c/d) + (-e/f) = cf-ed / df
|
|
288
|
+
const c = a.leftChild;
|
|
289
|
+
const d = a.rightChild;
|
|
290
|
+
const e = b.child.leftChild;
|
|
291
|
+
const f = b.child.rightChild;
|
|
292
|
+
return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(c, f), new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(e), d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
|
|
293
|
+
}
|
|
294
|
+
if (!opts?.towardsDistribute &&
|
|
295
|
+
(0, oppositeNode_1.isOppositeNode)(b) &&
|
|
296
|
+
(0, fractionNode_1.isFractionNode)(b.child) &&
|
|
297
|
+
(0, oppositeNode_1.isOppositeNode)(a) &&
|
|
298
|
+
(0, fractionNode_1.isFractionNode)(a.child)) {
|
|
299
|
+
//-(c/d) + (-e/f) = -cf-ed / df
|
|
300
|
+
const c = a.child.leftChild;
|
|
301
|
+
const d = a.child.rightChild;
|
|
302
|
+
const e = b.child.leftChild;
|
|
303
|
+
const f = b.child.rightChild;
|
|
304
|
+
return new fractionNode_1.FractionNode(new AddNode(new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(c), f), new multiplyNode_1.MultiplyNode(new oppositeNode_1.OppositeNode(e), d)), new multiplyNode_1.MultiplyNode(d, f)).simplify(opts);
|
|
305
|
+
}
|
|
306
|
+
if (!opts?.towardsDistribute && (0, fractionNode_1.isFractionNode)(a)) {
|
|
307
|
+
//c/d + b
|
|
308
|
+
const c = a.leftChild;
|
|
309
|
+
const d = a.rightChild;
|
|
310
|
+
return new fractionNode_1.FractionNode(new AddNode(c, new multiplyNode_1.MultiplyNode(d, b)), d).simplify(opts);
|
|
311
|
+
}
|
|
312
|
+
if (!opts?.towardsDistribute &&
|
|
313
|
+
(0, oppositeNode_1.isOppositeNode)(a) &&
|
|
314
|
+
(0, fractionNode_1.isFractionNode)(a.child)) {
|
|
315
|
+
//-(c/d) + b = (-c+bd)/d
|
|
316
|
+
const c = a.child.leftChild;
|
|
317
|
+
const d = a.child.rightChild;
|
|
318
|
+
return new fractionNode_1.FractionNode(new AddNode(new oppositeNode_1.OppositeNode(c), new multiplyNode_1.MultiplyNode(d, b)), d).simplify(opts);
|
|
319
|
+
}
|
|
320
|
+
if (!opts?.towardsDistribute &&
|
|
321
|
+
(0, fractionNode_1.isFractionNode)(b) &&
|
|
322
|
+
!opts?.forceDistributeFractions) {
|
|
323
|
+
//a+c/d
|
|
324
|
+
const c = b.leftChild;
|
|
325
|
+
const d = b.rightChild;
|
|
326
|
+
return new fractionNode_1.FractionNode(new AddNode(c, new multiplyNode_1.MultiplyNode(d, a)), d).simplify(opts);
|
|
327
|
+
}
|
|
328
|
+
if (!opts?.towardsDistribute &&
|
|
329
|
+
(0, oppositeNode_1.isOppositeNode)(b) &&
|
|
330
|
+
(0, fractionNode_1.isFractionNode)(b.child) &&
|
|
331
|
+
!opts?.forceDistributeFractions) {
|
|
332
|
+
//a+-(c/d) = (da-c)/d
|
|
333
|
+
const c = b.child.leftChild;
|
|
334
|
+
const d = b.child.rightChild;
|
|
335
|
+
return new fractionNode_1.FractionNode(new AddNode(new oppositeNode_1.OppositeNode(c), new multiplyNode_1.MultiplyNode(d, a)), d).simplify(opts);
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
const addSimplifyNumbers = (a, b, opts) => {
|
|
339
|
+
if ((0, numberNode_1.isNumberNode)(a) && (0, numberNode_1.isNumberNode)(b)) {
|
|
340
|
+
//geogebra rounds to 12, il faut mettre <12
|
|
341
|
+
return new numberNode_1.NumberNode((0, round_1.round)(a.value + b.value, 10));
|
|
342
|
+
}
|
|
343
|
+
if ((0, oppositeNode_1.isOppositeNode)(a) && (0, numberNode_1.isNumberNode)(a.child) && (0, numberNode_1.isNumberNode)(b)) {
|
|
344
|
+
return new numberNode_1.NumberNode(-a.child.value + b.value);
|
|
345
|
+
}
|
|
346
|
+
if ((0, oppositeNode_1.isOppositeNode)(b) && (0, numberNode_1.isNumberNode)(b.child) && (0, numberNode_1.isNumberNode)(a)) {
|
|
347
|
+
return new numberNode_1.NumberNode(-b.child.value + a.value);
|
|
348
|
+
}
|
|
349
|
+
if ((0, oppositeNode_1.isOppositeNode)(a) &&
|
|
350
|
+
(0, numberNode_1.isNumberNode)(a.child) &&
|
|
351
|
+
(0, oppositeNode_1.isOppositeNode)(b) &&
|
|
352
|
+
(0, numberNode_1.isNumberNode)(b.child)) {
|
|
353
|
+
return new numberNode_1.NumberNode(a.child.value + b.child.value);
|
|
354
|
+
}
|
|
355
|
+
};
|
|
356
|
+
const addSimplifyMonoms = (a, b, opts) => {
|
|
357
|
+
const aMonom = (0, monomNode_1.parseToMonomNode)(a);
|
|
358
|
+
if (!aMonom)
|
|
359
|
+
return;
|
|
360
|
+
const bMonom = (0, monomNode_1.parseToMonomNode)(b);
|
|
361
|
+
if (!bMonom)
|
|
362
|
+
return;
|
|
363
|
+
if (aMonom.degree === bMonom.degree) {
|
|
364
|
+
if (aMonom.variable !== bMonom.variable)
|
|
365
|
+
return;
|
|
366
|
+
const sum = (0, exports.add)(aMonom.a, bMonom.a).simplify(opts);
|
|
367
|
+
if (sum.evaluate() === 0)
|
|
368
|
+
return new numberNode_1.NumberNode(0);
|
|
369
|
+
return new monomNode_1.MonomNode(sum, aMonom.degree, {
|
|
370
|
+
variable: aMonom.variable,
|
|
371
|
+
}).toTree();
|
|
372
|
+
}
|
|
373
|
+
};
|