@ue-too/curve 0.5.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +5 -0
  2. package/{.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/b-curve.d.ts → b-curve.d.ts} +42 -5
  3. package/curve.tsbuildinfo +1 -0
  4. package/{dist/index.js → index.js} +412 -18
  5. package/index.js.map +1 -0
  6. package/package.json +11 -11
  7. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/b-curve.js +0 -878
  8. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/b-curve.js.map +0 -1
  9. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/composite-curve.js +0 -215
  10. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/composite-curve.js.map +0 -1
  11. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/curve.tsbuildinfo +0 -1
  12. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/index.js +0 -5
  13. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/index.js.map +0 -1
  14. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/line.js +0 -74
  15. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/line.js.map +0 -1
  16. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/path.js +0 -65
  17. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/path.js.map +0 -1
  18. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/utils.js +0 -43
  19. package/.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/utils.js.map +0 -1
  20. package/dist/b-curve.d.ts +0 -151
  21. package/dist/composite-curve.d.ts +0 -33
  22. package/dist/curve.tsbuildinfo +0 -1
  23. package/dist/index.d.ts +0 -4
  24. package/dist/index.js.map +0 -1
  25. package/dist/line.d.ts +0 -35
  26. package/dist/package.json +0 -26
  27. package/dist/path.d.ts +0 -16
  28. package/dist/utils.d.ts +0 -3
  29. package/jest.config.js +0 -18
  30. package/project.json +0 -33
  31. package/rollup.config.js +0 -20
  32. package/src/b-curve.ts +0 -1006
  33. package/src/composite-curve.ts +0 -243
  34. package/src/index.ts +0 -4
  35. package/src/line.ts +0 -98
  36. package/src/path.ts +0 -75
  37. package/src/utils.ts +0 -47
  38. package/test/b-curve.test.ts +0 -715
  39. package/test/line.test.ts +0 -38
  40. package/tsconfig.json +0 -21
  41. package/tsconfig.spec.json +0 -12
  42. /package/{.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/composite-curve.d.ts → composite-curve.d.ts} +0 -0
  43. /package/{.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/index.d.ts → index.d.ts} +0 -0
  44. /package/{.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/line.d.ts → line.d.ts} +0 -0
  45. /package/{.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/path.d.ts → path.d.ts} +0 -0
  46. /package/{.rollup.cache/home/runner/work/ue-too/ue-too/packages/curve/dist/utils.d.ts → utils.d.ts} +0 -0
@@ -1,243 +0,0 @@
1
- import { Point, PointCal } from "@ue-too/math";
2
-
3
- export type HandleType = "ALIGNED" | "VECTOR" | "FREE";
4
-
5
- export type HandlePoint = {
6
- position: Point;
7
- type: HandleType;
8
- }
9
-
10
- export class ControlPoint {
11
-
12
- private position: Point;
13
- private leftHandle: HandlePoint;
14
- private rightHandle: HandlePoint;
15
-
16
- constructor(position: Point, leftHandle: HandlePoint, rightHandle: HandlePoint){
17
- this.position = position;
18
- this.leftHandle = leftHandle;
19
- this.rightHandle = rightHandle;
20
- }
21
-
22
- setPosition(destinationPosition: Point, prevControlPoint: ControlPoint | undefined, nextControlPoint: ControlPoint | undefined){
23
- let diff = PointCal.subVector(destinationPosition, this.position);
24
- this.position = destinationPosition;
25
- this.leftHandle.position = PointCal.addVector(this.leftHandle.position, diff);
26
- this.rightHandle.position = PointCal.addVector(this.rightHandle.position, diff);
27
- if(this.leftHandle.type == "VECTOR" && prevControlPoint){
28
- let relativeVector = PointCal.subVector(prevControlPoint.getPosition(), this.position);
29
- relativeVector = PointCal.multiplyVectorByScalar(relativeVector, 1 / 3);
30
- this.leftHandle.position = PointCal.addVector(this.position, relativeVector);
31
- if(this.rightHandle.type == "ALIGNED"){
32
- let relativeVector = PointCal.subVector(this.rightHandle.position, this.position);
33
- let mag = PointCal.magnitude(relativeVector);
34
- let direction = PointCal.unitVectorFromA2B(this.leftHandle.position, this.position);
35
- this.rightHandle.position = PointCal.addVector(this.position, PointCal.multiplyVectorByScalar(direction, mag));
36
- }
37
- }
38
- if(this.rightHandle.type == "VECTOR" && nextControlPoint){
39
- let relativeVector = PointCal.subVector(nextControlPoint.getPosition(), this.position);
40
- relativeVector = PointCal.multiplyVectorByScalar(relativeVector, 1 / 3);
41
- this.rightHandle.position = PointCal.addVector(this.position, relativeVector);
42
- if(this.leftHandle.type == "ALIGNED"){
43
- let mag = PointCal.distanceBetweenPoints(this.leftHandle.position, this.position);
44
- let direction = PointCal.subVector(this.position, this.rightHandle.position);
45
- this.leftHandle.position = PointCal.addVector(this.position, PointCal.multiplyVectorByScalar(direction, mag));
46
- }
47
- }
48
- if(prevControlPoint !== undefined && prevControlPoint.getRightHandle().type == "VECTOR"){
49
- let relativeVector = PointCal.subVector(this.position, prevControlPoint.getPosition());
50
- relativeVector = PointCal.multiplyVectorByScalar(relativeVector, 1 / 3);
51
- prevControlPoint.setRightHandlePosition(PointCal.addVector(prevControlPoint.getPosition(), relativeVector));
52
- }
53
- if(nextControlPoint !== undefined && nextControlPoint.getLeftHandle().type == "VECTOR"){
54
- let relativeVector = PointCal.subVector(this.position, nextControlPoint.getPosition());
55
- relativeVector = PointCal.multiplyVectorByScalar(relativeVector, 1 / 3);
56
- nextControlPoint.setLeftHandlePosition(PointCal.addVector(nextControlPoint.getPosition(), relativeVector));
57
- }
58
- }
59
-
60
- getPosition(): Point{
61
- return this.position;
62
- }
63
-
64
- setLeftHandleTypeVector(prevControlPoint: ControlPoint | undefined){
65
- if(this.rightHandle.type != "VECTOR"){
66
- this.rightHandle.type = "FREE";
67
- }
68
- let relativeVector: Point;
69
- if(prevControlPoint == undefined){
70
- relativeVector = PointCal.subVector(this.leftHandle.position, this.position);
71
- } else {
72
- relativeVector = PointCal.subVector(prevControlPoint.getPosition(), this.position);
73
- relativeVector = PointCal.multiplyVectorByScalar(relativeVector, 1 / 3);
74
- }
75
- this.leftHandle.position = PointCal.addVector(this.position, relativeVector);
76
- }
77
-
78
- setLeftHandleTypeAligned(){
79
- this.leftHandle.type = "ALIGNED";
80
- if(this.rightHandle.type == "VECTOR"){
81
- let direction = PointCal.unitVectorFromA2B(this.rightHandle.position, this.position);
82
- let mag = PointCal.distanceBetweenPoints(this.position, this.leftHandle.position);
83
- this.leftHandle.position = PointCal.addVector(this.position, PointCal.multiplyVectorByScalar(direction, mag));
84
- }
85
- }
86
-
87
- setLeftHandleTypeFree(){
88
- this.leftHandle.type = "FREE";
89
- }
90
-
91
- setRightHandleTypeVector(nextControlPoint: ControlPoint | undefined) {
92
- if(this.leftHandle.type != "VECTOR"){
93
- this.leftHandle.type = "FREE";
94
- }
95
- let relativeVector: Point;
96
- if(nextControlPoint == undefined){
97
- relativeVector = PointCal.subVector(this.rightHandle.position, this.position);
98
- } else {
99
- relativeVector = PointCal.subVector(nextControlPoint.getPosition(), this.position);
100
- relativeVector = PointCal.multiplyVectorByScalar(relativeVector, 1 / 3);
101
- }
102
- this.rightHandle.position = PointCal.addVector(this.position, relativeVector);
103
- }
104
-
105
- setRightHandleTypeAligned(){
106
- this.rightHandle.type = "ALIGNED";
107
- if(this.leftHandle.type == "VECTOR") {
108
- let direciton = PointCal.unitVectorFromA2B(this.leftHandle.position, this.position);
109
- let mag = PointCal.distanceBetweenPoints(this.position, this.rightHandle.position);
110
- this.rightHandle.position = PointCal.addVector(this.position, PointCal.multiplyVectorByScalar(direciton, mag));
111
- }
112
- }
113
-
114
- setRightHandleTypeFree(){
115
- this.rightHandle.type = "FREE";
116
- }
117
-
118
- setLeftHandlePosition(destPos: Point){
119
- let leftHandleType = this.leftHandle.type;
120
- switch(leftHandleType){
121
- case "ALIGNED":
122
- if(this.rightHandle.type == "VECTOR"){
123
- let diff = PointCal.subVector(destPos, this.position);
124
- let rightHandleDiff = PointCal.unitVectorFromA2B(this.rightHandle.position, this.position);
125
- let resMag = PointCal.dotProduct(diff, rightHandleDiff);
126
- let res = PointCal.multiplyVectorByScalar(rightHandleDiff, resMag);
127
- this.leftHandle.position = PointCal.addVector(this.position, res);
128
- } else if (this.rightHandle.type == "ALIGNED"){
129
- this.leftHandle.position = destPos;
130
- let mag = PointCal.distanceBetweenPoints(this.rightHandle.position, this.position);
131
- let direction = PointCal.unitVectorFromA2B(this.leftHandle.position, this.position);
132
- let res = PointCal.multiplyVectorByScalar(direction, mag);
133
- this.rightHandle.position = PointCal.addVector(res, this.position);
134
- } else {
135
- this.leftHandle.position = destPos;
136
- }
137
- break;
138
- case "FREE":
139
- this.leftHandle.position = destPos;
140
- break;
141
- case "VECTOR":
142
- break;
143
- default:
144
- throw new Error(`Unknown left handle type for control point`);
145
- }
146
- }
147
-
148
- setRightHandlePosition(destPos: Point){
149
- let rightHandleType = this.rightHandle.type;
150
- switch(rightHandleType){
151
- case "ALIGNED":
152
- if(this.leftHandle.type == "VECTOR"){
153
- let diff = PointCal.subVector(destPos, this.position);
154
- let leftHandleDiff = PointCal.unitVectorFromA2B(this.leftHandle.position, this.position);
155
- let resMag = PointCal.dotProduct(diff, leftHandleDiff);
156
- let res = PointCal.multiplyVectorByScalar(leftHandleDiff, resMag);
157
- this.rightHandle.position = PointCal.addVector(this.position, res);
158
- } else if (this.rightHandle.type == "ALIGNED"){
159
- this.rightHandle.position = destPos;
160
- let mag = PointCal.distanceBetweenPoints(this.leftHandle.position, this.position);
161
- let direction = PointCal.unitVectorFromA2B(this.rightHandle.position, this.position);
162
- let res = PointCal.multiplyVectorByScalar(direction, mag);
163
- this.leftHandle.position = PointCal.addVector(res, this.position);
164
- } else {
165
- this.rightHandle.position = destPos;
166
- }
167
- break;
168
- case "FREE":
169
- this.rightHandle.position = destPos;
170
- break;
171
- case "VECTOR":
172
- break;
173
- default:
174
- throw new Error(`Unknown left handle type for control point`);
175
- }
176
- }
177
-
178
- getLeftHandle(): HandlePoint{
179
- return this.leftHandle;
180
- }
181
-
182
- getRightHandle(): HandlePoint{
183
- return this.rightHandle;
184
- }
185
- }
186
-
187
- export class CompositeBCurve{
188
-
189
- private controlPoints: ControlPoint[];
190
-
191
- constructor(controlPoints: ControlPoint[] = []){
192
- this.controlPoints = controlPoints;
193
- }
194
-
195
- getControlPoints(): ControlPoint[]{
196
- return this.controlPoints;
197
- }
198
-
199
- appendControlPoint(position: Point){
200
- let leftHandlePosition = PointCal.addVector(position, {x: -100, y: 0});
201
- let rightHandlePosition = PointCal.addVector(position, {x: 100, y: 0});
202
- let leftHandlePoint: HandlePoint = {
203
- position: leftHandlePosition,
204
- type: "FREE"
205
- }
206
- let rightHandlePoint: HandlePoint = {
207
- position: rightHandlePosition,
208
- type: "FREE"
209
- }
210
-
211
- let newControlPoint = new ControlPoint(position, leftHandlePoint, rightHandlePoint);
212
- this.controlPoints.push(newControlPoint);
213
- }
214
-
215
- setLeftHandlePositionOfControlPoint(controlPointIndex: number, destPos: Point){
216
- if(controlPointIndex >= this.controlPoints.length || controlPointIndex < 0){
217
- return;
218
- }
219
- this.controlPoints[controlPointIndex].setLeftHandlePosition(destPos);
220
- }
221
-
222
- setRightHandlePositionOfControlPoint(controlPointIndex: number, destPos: Point){
223
- if(controlPointIndex >= this.controlPoints.length || controlPointIndex < 0){
224
- return;
225
- }
226
- this.controlPoints[controlPointIndex].setRightHandlePosition(destPos);
227
- }
228
-
229
- setPositionOfControlPoint(controlPointIndex: number, destPos: Point){
230
- if(controlPointIndex >= this.controlPoints.length || controlPointIndex < 0){
231
- return;
232
- }
233
- let prevControlPoint = undefined;
234
- let nextControlPoint = undefined;
235
- if(controlPointIndex + 1 < this.controlPoints.length){
236
- nextControlPoint = this.controlPoints[controlPointIndex + 1];
237
- }
238
- if(controlPointIndex - 1 >= 0){
239
- prevControlPoint = this.controlPoints[controlPointIndex - 1];
240
- }
241
- this.controlPoints[controlPointIndex].setPosition(destPos, prevControlPoint, nextControlPoint);
242
- }
243
- }
package/src/index.ts DELETED
@@ -1,4 +0,0 @@
1
- export * from "./b-curve";
2
- export * from "./line";
3
- export * from "./composite-curve";
4
- export * from "./path";
package/src/line.ts DELETED
@@ -1,98 +0,0 @@
1
- import { PointCal, Point } from "@ue-too/math";
2
-
3
- export class Line {
4
- private startPoint: Point;
5
- private endPoint: Point;
6
-
7
- constructor(startPoint: Point, endPoint: Point){
8
- this.startPoint = startPoint;
9
- this.endPoint = endPoint;
10
- }
11
-
12
- getStartPoint(): Point{
13
- return this.startPoint;
14
- }
15
-
16
- getEndPoint(): Point{
17
- return this.endPoint;
18
- }
19
-
20
- intersectionWithAnotherLine(lineToIntersect: Line){
21
- return getLineIntersection(this.startPoint, this.endPoint, lineToIntersect.getStartPoint(), lineToIntersect.getEndPoint());
22
- }
23
-
24
- projectPoint(point: Point){
25
- return projectPointOntoLine(point, this.getStartPoint(), this.getEndPoint());
26
- }
27
-
28
- length(): number{
29
- return PointCal.distanceBetweenPoints(this.startPoint, this.endPoint);
30
- }
31
-
32
- getTranslationRotationToAlginXAxis(){
33
- const translation = PointCal.subVector({x: 0, y: 0}, this.startPoint);
34
- const rotationAngle = PointCal.angleFromA2B(PointCal.subVector(this.endPoint, this.startPoint), {x: 1, y: 0});
35
-
36
- return {translation, rotationAngle};
37
- }
38
-
39
- pointInLine(point: Point): boolean{
40
- const baseVector = PointCal.unitVectorFromA2B(this.startPoint, this.endPoint);
41
- const start2PointVector = PointCal.subVector(point, this.startPoint);
42
- const length = PointCal.dotProduct(start2PointVector, baseVector);
43
- const start2PointUnitVector = PointCal.unitVector(start2PointVector);
44
- const errorThreshold = PointCal.distanceBetweenPoints(this.startPoint, this.endPoint) * 0.0001;
45
- return length <= PointCal.distanceBetweenPoints(this.startPoint, this.endPoint) && length >= 0 && Math.abs(start2PointUnitVector.x - baseVector.x) < 0.0001 && Math.abs(start2PointUnitVector.y - baseVector.y) < 0.0001;
46
- }
47
-
48
- lerp(ratio: number): Point {
49
- return PointCal.linearInterpolation(this.startPoint, this.endPoint, ratio);
50
- }
51
- }
52
-
53
- export function getLineIntersection(startPoint: Point, endPoint: Point, startPoint2: Point, endPoint2: Point):{
54
- intersects: boolean,
55
- intersection?: Point,
56
- offset?: number
57
- }{
58
- const numerator = (endPoint2.x - startPoint2.x) * (startPoint.y - startPoint2.y) - (endPoint2.y - startPoint2.y) * (startPoint.x - startPoint2.x);
59
- const denominator = (endPoint2.y - startPoint2.y) * (endPoint.x - startPoint.x) - (endPoint2.x - startPoint2.x) * (endPoint.y - startPoint.y);
60
-
61
- if (denominator === 0){
62
- return {intersects: false};
63
- }
64
- const t = numerator / denominator;
65
- if (t >= 0 && t <= 1){
66
- return {
67
- intersects: true,
68
- intersection: PointCal.linearInterpolation(startPoint, endPoint, t),
69
- offset: t
70
- }
71
- } else {
72
- return {
73
- intersects: false,
74
- }
75
- }
76
-
77
- }
78
-
79
- export function projectPointOntoLine(point: Point, lineStartPoint: Point, lineEndPoint: Point): {
80
- within: boolean,
81
- projectionPoint?: Point,
82
- offset?: number
83
- }{
84
- const baseVector = PointCal.unitVector(PointCal.subVector(lineEndPoint, lineStartPoint));
85
- const vectorToPoint = PointCal.subVector(point, lineStartPoint);
86
- const res = PointCal.dotProduct(vectorToPoint, baseVector);
87
- if (res < 0 || res > PointCal.magnitude(PointCal.subVector(lineEndPoint, lineStartPoint))){
88
- return {
89
- within: false,
90
- };
91
- }
92
- return {
93
- within: true,
94
- projectionPoint: PointCal.addVector(lineStartPoint, PointCal.multiplyVectorByScalar(baseVector, res)),
95
- offset: res / PointCal.magnitude(PointCal.subVector(lineEndPoint, lineStartPoint))
96
- };
97
-
98
- }
package/src/path.ts DELETED
@@ -1,75 +0,0 @@
1
- import { Line } from "./line";
2
- import { Point } from "@ue-too/math";
3
-
4
- export class Path {
5
-
6
- private lines: Line[];
7
-
8
- constructor(lines: Line[]){
9
- this.lines = lines;
10
- }
11
-
12
- append(line: Line): void{
13
- this.lines.push(line);
14
- }
15
-
16
- clear(): void{
17
- this.lines = [];
18
- }
19
-
20
- prepend(line: Line): void{
21
- this.lines.unshift(line);
22
- }
23
-
24
- getLines(): Line[]{
25
- return this.lines;
26
- }
27
-
28
- getLength(): number{
29
- let res = 0;
30
- this.lines.forEach((line)=>{
31
- res += line.length();
32
- });
33
- return res;
34
- }
35
-
36
- getPercentages(): {start: number, end: number}[]{
37
- const length = this.getLength();
38
- let currentCurvePercentage = 0;
39
- const res: {start: number, end: number}[] = [];
40
- this.lines.forEach((line)=>{
41
- const lineLength = line.length();
42
- const linePercentage = lineLength / length;
43
- let start = currentCurvePercentage;
44
- currentCurvePercentage += linePercentage;
45
- let end = currentCurvePercentage;
46
- res.push({start, end});
47
- });
48
- res[res.length - 1].end = 1;
49
- return res;
50
- }
51
-
52
- getPointByPercentage(percentage: number): Point | never{
53
- if (percentage < 0 || percentage > 1){
54
- throw new Error("Percentage must be between 0 and 1");
55
- }
56
- const percentages = this.getPercentages();
57
- let left = 0;
58
- let right = percentages.length - 1;
59
- while (left <= right){
60
- const mid = Math.floor((left + right) / 2);
61
- if (percentage < percentages[mid].end){
62
- right = mid - 1;
63
- } else if (percentage > percentages[mid].end){
64
- left = mid + 1;
65
- } else {
66
- left = mid;
67
- break;
68
- }
69
- }
70
- const line = this.lines[left];
71
- const linePercentage = percentages[left];
72
- const ratio = (percentage - linePercentage.start) / (linePercentage.end - linePercentage.start);
73
- return line.lerp(ratio);
74
- }
75
- }
package/src/utils.ts DELETED
@@ -1,47 +0,0 @@
1
- import { Point, PointCal } from '@ue-too/math';
2
-
3
- //JavaScript implementation of winding number algorithm to determine whether a point is inside a polygon
4
- //Based on C++ implementation of wn_PnPoly() published on http://geomalgorithms.com/a03-_inclusion.html
5
- // Original is vlasky's implementation on https://gist.github.com/vlasky/d0d1d97af30af3191fc214beaf379acc
6
- // TypeScript by gmac Greg MacWilliam https://gist.github.com/gmac
7
-
8
- function isLeft(x: Point, y: Point, z: Point): number {
9
- return (y.x - x.x) * (z.y - x.y) - (z.x - x.x) * (y.y - x.y);
10
- }
11
-
12
- export function pointInPolygonWN(p: Point, points: Array<Point>): boolean {
13
- let wn = 0; // winding number
14
-
15
- points.forEach((a, i) => {
16
- const b = points[(i+1) % points.length];
17
- if (a.y <= p.y) {
18
- if (b.y > p.y && isLeft(a, b, p) > 0) {
19
- wn += 1;
20
- }
21
- } else if (b.y <= p.y && isLeft(a, b, p) < 0) {
22
- wn -= 1;
23
- }
24
- });
25
-
26
- return wn !== 0;
27
- }
28
-
29
- export function pointInPolygon(polygonVertices: Point[], interestedPoint: Point){
30
- let angleCheck = polygonVertices.map((point, index, array)=>{
31
- let endPoint: Point;
32
- if (index == polygonVertices.length - 1) {
33
- // last one need to wrap to the first point
34
- endPoint = array[0];
35
- }else {
36
- endPoint = array[index + 1];
37
- }
38
- let baseVector = PointCal.subVector(endPoint, point);
39
- let checkVector = PointCal.subVector(interestedPoint, point);
40
- return PointCal.angleFromA2B(baseVector, checkVector);
41
- });
42
- let outOfPolygon = angleCheck.filter((angle)=>{
43
- return angle > 0;
44
- }).length > 0;
45
-
46
- return !outOfPolygon;
47
- }