@itwin/core-geometry 5.3.0-dev.8 → 5.3.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.
- package/CHANGELOG.md +28 -1
- package/lib/cjs/curve/Arc3d.d.ts +15 -1
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +31 -2
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.d.ts +25 -8
- package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
- package/lib/cjs/curve/CurveFactory.js +51 -55
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.d.ts +10 -13
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js +23 -22
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.d.ts +10 -6
- package/lib/cjs/curve/spiral/ClothoidSeries.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.js +36 -19
- package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/cjs/curve/spiral/CubicEvaluator.d.ts +7 -6
- package/lib/cjs/curve/spiral/CubicEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/CubicEvaluator.js +29 -14
- package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.d.ts +34 -44
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js +47 -53
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts +2 -2
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js +17 -7
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +112 -104
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js +143 -117
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +71 -53
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +99 -66
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts +8 -12
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js +11 -13
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.d.ts +36 -29
- package/lib/cjs/curve/spiral/NormalizedTransition.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.js +62 -40
- package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.d.ts +13 -18
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js +21 -24
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts +41 -27
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js +50 -33
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +45 -34
- package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js +56 -38
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.d.ts +27 -21
- package/lib/cjs/curve/spiral/XYCurveEvaluator.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.js +23 -18
- package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +96 -98
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js +121 -110
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +135 -142
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +165 -160
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.d.ts +51 -34
- package/lib/cjs/geometry3d/IndexedXYCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.js +16 -6
- package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +78 -77
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js +38 -35
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +27 -7
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +30 -9
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts +15 -1
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +31 -2
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveFactory.d.ts +25 -8
- package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
- package/lib/esm/curve/CurveFactory.js +51 -55
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.d.ts +10 -13
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js +23 -22
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.d.ts +10 -6
- package/lib/esm/curve/spiral/ClothoidSeries.d.ts.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.js +36 -19
- package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/esm/curve/spiral/CubicEvaluator.d.ts +7 -6
- package/lib/esm/curve/spiral/CubicEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/CubicEvaluator.js +29 -14
- package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.d.ts +34 -44
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js +47 -53
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts +2 -2
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js +17 -7
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +112 -104
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js +143 -117
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +71 -53
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +99 -66
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts +8 -12
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js +11 -13
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.d.ts +36 -29
- package/lib/esm/curve/spiral/NormalizedTransition.d.ts.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.js +62 -40
- package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.d.ts +13 -18
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js +21 -24
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts +41 -27
- package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js +50 -33
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +45 -34
- package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js +56 -38
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.d.ts +27 -21
- package/lib/esm/curve/spiral/XYCurveEvaluator.d.ts.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.js +23 -18
- package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +96 -98
- package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js +122 -111
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +135 -142
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +165 -160
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.d.ts +51 -34
- package/lib/esm/geometry3d/IndexedXYCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.js +14 -5
- package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +78 -77
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js +38 -35
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +27 -7
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +30 -9
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,107 +1,97 @@
|
|
|
1
1
|
import { CubicEvaluator } from "./CubicEvaluator";
|
|
2
2
|
/**
|
|
3
3
|
* Czech cubic.
|
|
4
|
-
* This is y= m*x^3 with
|
|
5
|
-
* * x any point on the x axis
|
|
6
|
-
* * `fraction` along the spiral goes to `x = fraction * L
|
|
7
|
-
* * m is gamma
|
|
4
|
+
* This is y = m*x^3 with
|
|
5
|
+
* * x any point on the x axis.
|
|
6
|
+
* * `fraction` along the spiral goes to `x = fraction * L`.
|
|
7
|
+
* * m is gamma/(6RL).
|
|
8
8
|
* * 1/(6RL) is the leading term of the sine series.
|
|
9
|
-
* * `gamma = 2R/sqrt
|
|
10
|
-
* @param localToWorld
|
|
11
|
-
* @param nominalL1
|
|
12
|
-
* @param nominalR1
|
|
13
|
-
* @param activeInterval
|
|
9
|
+
* * `gamma = 2R/sqrt(4RR-LL)` pushes y down a little bit to simulate the lost series terms.
|
|
14
10
|
* @internal
|
|
15
11
|
*/
|
|
16
12
|
export declare class CzechSpiralEvaluator extends CubicEvaluator {
|
|
17
13
|
nominalLength1: number;
|
|
18
14
|
nominalRadius1: number;
|
|
19
|
-
/** Constructor is private.
|
|
15
|
+
/** Constructor is private. Caller responsible for cubicM validity. */
|
|
20
16
|
private constructor();
|
|
21
17
|
/**
|
|
22
18
|
* Return the scale factor between simple x^3 / (6RL) cubic and the czech correction.
|
|
23
19
|
* * For typical case with l1/R1 smallish, this is just less than 1.0:
|
|
24
20
|
* (0.25==>0.99215), (0.15==>0.997184), (0.10==>0.998749), (0.05==>999687)
|
|
25
|
-
* @param length1
|
|
26
|
-
* @param radius1
|
|
27
21
|
*/
|
|
28
22
|
static gammaConstant(length1: number, radius1: number): number | undefined;
|
|
29
23
|
/** Compute the czech cubic constant. */
|
|
30
24
|
static computeCubicM(length1: number, radius1: number): number | undefined;
|
|
31
25
|
static create(length1: number, radius1: number): CzechSpiralEvaluator | undefined;
|
|
32
26
|
scaleInPlace(scaleFactor: number): void;
|
|
33
|
-
/**
|
|
27
|
+
/** Return a deep copy of the evaluator. */
|
|
34
28
|
clone(): CzechSpiralEvaluator;
|
|
35
|
-
/** Member by member matchup
|
|
29
|
+
/** Member by member matchup. */
|
|
36
30
|
isAlmostEqual(other: any): boolean;
|
|
37
31
|
/**
|
|
38
32
|
* Return a (fast but mediocre) approximation of spiral length as a function of x axis position.
|
|
39
33
|
* * This x-to-distance relation is not as precise as the CurvePrimitive method moveSignedDistanceFromFraction.
|
|
40
|
-
* * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate
|
|
34
|
+
* * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate
|
|
35
|
+
* CurvePrimitive measurements.
|
|
41
36
|
* @param x distance along the x axis.
|
|
42
37
|
*/
|
|
43
38
|
xToCzechApproximateDistance(x: number): number;
|
|
44
39
|
/**
|
|
45
40
|
* Return the inverse of the `forwardL2R2Map` function.
|
|
46
41
|
* * The undefined result can only occur for distances outside the usual spirals.
|
|
47
|
-
* @param
|
|
48
|
-
*
|
|
42
|
+
* @param d (approximate) distance along the spiral.
|
|
49
43
|
*/
|
|
50
44
|
czechApproximateDistanceToX(d: number): number | undefined;
|
|
51
45
|
/**
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
46
|
+
* Evaluate a series expansion that is used with varying signs (plus or minus 1) in czech and italian spirals.
|
|
47
|
+
* @param x distance along the x axis.
|
|
48
|
+
*/
|
|
55
49
|
static forwardL2R2Map(x: number, sign: number, length: number, radius: number): number;
|
|
56
50
|
/**
|
|
57
51
|
* Return the inverse of the `forwardL2R2Map` function.
|
|
58
52
|
* * The undefined result can only occur for distances outside the usual spirals.
|
|
59
|
-
* @param
|
|
60
|
-
*
|
|
53
|
+
* @param d (approximate) distance along the spiral.
|
|
61
54
|
*/
|
|
62
|
-
static inverseL2R2Map(
|
|
55
|
+
static inverseL2R2Map(d: number, sign: number, length: number, radius: number): number | undefined;
|
|
63
56
|
}
|
|
64
57
|
/**
|
|
65
58
|
* Italian cubic.
|
|
66
|
-
* This is y= m*x^3 with
|
|
67
|
-
* * x any point on the x axis
|
|
68
|
-
* * `fraction` along the spiral goes to `x = fraction * L
|
|
69
|
-
* * m is gamma
|
|
59
|
+
* This is y = m*x^3 with
|
|
60
|
+
* * x any point on the x axis.
|
|
61
|
+
* * `fraction` along the spiral goes to `x = fraction * L`.
|
|
62
|
+
* * m is gamma/(6RL).
|
|
70
63
|
* * 1/(6RL) is the leading term of the sine series.
|
|
71
|
-
* * `gamma = 2R/sqrt
|
|
72
|
-
* @param localToWorld
|
|
73
|
-
* @param nominalL1
|
|
74
|
-
* @param nominalR1
|
|
75
|
-
* @param activeInterval
|
|
64
|
+
* * `gamma = 2R/sqrt(4RR-LL)` pushes y down a little bit to simulate the lost series terms.
|
|
76
65
|
* @internal
|
|
77
66
|
*/
|
|
78
67
|
export declare class ItalianSpiralEvaluator extends CubicEvaluator {
|
|
79
68
|
nominalLength1: number;
|
|
80
69
|
nominalRadius1: number;
|
|
81
|
-
/**
|
|
82
|
-
*
|
|
70
|
+
/**
|
|
71
|
+
* Compute the czech cubic constant.
|
|
72
|
+
* * Funky mixture of lengths.
|
|
83
73
|
*/
|
|
84
74
|
private static computeCubicM;
|
|
85
|
-
/** Constructor is private.
|
|
75
|
+
/** Constructor is private. Caller responsible for cubicM validity. */
|
|
86
76
|
private constructor();
|
|
87
77
|
static create(length1: number, radius1: number): ItalianSpiralEvaluator | undefined;
|
|
88
78
|
scaleInPlace(scaleFactor: number): void;
|
|
89
|
-
/**
|
|
79
|
+
/** Return a deep copy of the evaluator. */
|
|
90
80
|
clone(): ItalianSpiralEvaluator;
|
|
91
|
-
/** Member by member matchup
|
|
81
|
+
/** Member by member matchup. */
|
|
92
82
|
isAlmostEqual(other: any): boolean;
|
|
93
83
|
/**
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
84
|
+
* Return a (fast but mediocre) approximation of spiral length as a function of x axis position.
|
|
85
|
+
* * This x-to-distance relation is not as precise as the CurvePrimitive method moveSignedDistanceFromFraction.
|
|
86
|
+
* * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate
|
|
87
|
+
* CurvePrimitive measurements.
|
|
88
|
+
* @param x distance along the x axis.
|
|
89
|
+
*/
|
|
99
90
|
distanceToItalianApproximateX(x: number): number;
|
|
100
91
|
/**
|
|
101
92
|
* Return the inverse of the `forwardL2R2Map` function.
|
|
102
93
|
* * The undefined result can only occur for distances outside the usual spirals.
|
|
103
|
-
* @param
|
|
104
|
-
*
|
|
94
|
+
* @param d (approximate) distance along the spiral.
|
|
105
95
|
*/
|
|
106
96
|
xToItalianApproximateDistance(d: number): number | undefined;
|
|
107
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CzechSpiralEvaluator.d.ts","sourceRoot":"","sources":["../../../../src/curve/spiral/CzechSpiralEvaluator.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"CzechSpiralEvaluator.d.ts","sourceRoot":"","sources":["../../../../src/curve/spiral/CzechSpiralEvaluator.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD;;;;;;;;;GASG;AACH,qBAAa,oBAAqB,SAAQ,cAAc;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IAC9B,sEAAsE;IACtE,OAAO;IAKP;;;;OAIG;WACW,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAGjF,wCAAwC;WAC1B,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;WAQnE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAMxE,YAAY,CAAC,WAAW,EAAE,MAAM;IAKhD,2CAA2C;IACpC,KAAK,IAAI,oBAAoB;IAGpC,gCAAgC;IACzB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAOzC;;;;;;OAMG;IACI,2BAA2B,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAGrD;;;;OAIG;IACI,2BAA2B,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAGjE;;;OAGG;WACW,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAO7F;;;;OAIG;WACW,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAiB1G;AAED;;;;;;;;;GASG;AACH,qBAAa,sBAAuB,SAAQ,cAAc;IACjD,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IAE9B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAQ5B,sEAAsE;IACtE,OAAO;WAKO,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS;IAW1E,YAAY,CAAC,WAAW,EAAE,MAAM;IAKhD,2CAA2C;IACpC,KAAK,IAAI,sBAAsB;IAGtC,gCAAgC;IACzB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAOzC;;;;;;OAMG;IACI,6BAA6B,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAGvD;;;;OAIG;IACI,6BAA6B,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAGpE"}
|
|
@@ -13,22 +13,18 @@ const CubicEvaluator_1 = require("./CubicEvaluator");
|
|
|
13
13
|
const Newton_1 = require("../../numerics/Newton");
|
|
14
14
|
/**
|
|
15
15
|
* Czech cubic.
|
|
16
|
-
* This is y= m*x^3 with
|
|
17
|
-
* * x any point on the x axis
|
|
18
|
-
* * `fraction` along the spiral goes to `x = fraction * L
|
|
19
|
-
* * m is gamma
|
|
16
|
+
* This is y = m*x^3 with
|
|
17
|
+
* * x any point on the x axis.
|
|
18
|
+
* * `fraction` along the spiral goes to `x = fraction * L`.
|
|
19
|
+
* * m is gamma/(6RL).
|
|
20
20
|
* * 1/(6RL) is the leading term of the sine series.
|
|
21
|
-
* * `gamma = 2R/sqrt
|
|
22
|
-
* @param localToWorld
|
|
23
|
-
* @param nominalL1
|
|
24
|
-
* @param nominalR1
|
|
25
|
-
* @param activeInterval
|
|
21
|
+
* * `gamma = 2R/sqrt(4RR-LL)` pushes y down a little bit to simulate the lost series terms.
|
|
26
22
|
* @internal
|
|
27
23
|
*/
|
|
28
24
|
class CzechSpiralEvaluator extends CubicEvaluator_1.CubicEvaluator {
|
|
29
25
|
nominalLength1;
|
|
30
26
|
nominalRadius1;
|
|
31
|
-
/** Constructor is private.
|
|
27
|
+
/** Constructor is private. Caller responsible for cubicM validity. */
|
|
32
28
|
constructor(length1, radius1, cubicM) {
|
|
33
29
|
super(length1, cubicM);
|
|
34
30
|
this.nominalLength1 = length1;
|
|
@@ -38,8 +34,6 @@ class CzechSpiralEvaluator extends CubicEvaluator_1.CubicEvaluator {
|
|
|
38
34
|
* Return the scale factor between simple x^3 / (6RL) cubic and the czech correction.
|
|
39
35
|
* * For typical case with l1/R1 smallish, this is just less than 1.0:
|
|
40
36
|
* (0.25==>0.99215), (0.15==>0.997184), (0.10==>0.998749), (0.05==>999687)
|
|
41
|
-
* @param length1
|
|
42
|
-
* @param radius1
|
|
43
37
|
*/
|
|
44
38
|
static gammaConstant(length1, radius1) {
|
|
45
39
|
return 2.0 * radius1 / Math.sqrt(4.0 * radius1 * radius1 - length1 * length1);
|
|
@@ -47,10 +41,10 @@ class CzechSpiralEvaluator extends CubicEvaluator_1.CubicEvaluator {
|
|
|
47
41
|
/** Compute the czech cubic constant. */
|
|
48
42
|
static computeCubicM(length1, radius1) {
|
|
49
43
|
const gamma = CzechSpiralEvaluator.gammaConstant(length1, radius1);
|
|
50
|
-
//
|
|
44
|
+
// in the private update method, the LR values should have been vetted
|
|
51
45
|
if (gamma === undefined)
|
|
52
46
|
return undefined;
|
|
53
|
-
//
|
|
47
|
+
// if radius is negative, it shows up in gamma; but the a signed denominator undoes it so take abs of denominator
|
|
54
48
|
return gamma / Math.abs((6.0 * radius1 * length1));
|
|
55
49
|
}
|
|
56
50
|
static create(length1, radius1) {
|
|
@@ -64,9 +58,11 @@ class CzechSpiralEvaluator extends CubicEvaluator_1.CubicEvaluator {
|
|
|
64
58
|
this.nominalRadius1 *= scaleFactor;
|
|
65
59
|
super.scaleInPlace(scaleFactor);
|
|
66
60
|
}
|
|
67
|
-
/**
|
|
68
|
-
clone() {
|
|
69
|
-
|
|
61
|
+
/** Return a deep copy of the evaluator. */
|
|
62
|
+
clone() {
|
|
63
|
+
return new CzechSpiralEvaluator(this.nominalLength1, this.nominalRadius1, this.cubicM);
|
|
64
|
+
}
|
|
65
|
+
/** Member by member matchup. */
|
|
70
66
|
isAlmostEqual(other) {
|
|
71
67
|
if (other instanceof CzechSpiralEvaluator) {
|
|
72
68
|
return Geometry_1.Geometry.isSameCoordinate(this.nominalLength1, other.nominalLength1)
|
|
@@ -77,7 +73,8 @@ class CzechSpiralEvaluator extends CubicEvaluator_1.CubicEvaluator {
|
|
|
77
73
|
/**
|
|
78
74
|
* Return a (fast but mediocre) approximation of spiral length as a function of x axis position.
|
|
79
75
|
* * This x-to-distance relation is not as precise as the CurvePrimitive method moveSignedDistanceFromFraction.
|
|
80
|
-
* * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate
|
|
76
|
+
* * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate
|
|
77
|
+
* CurvePrimitive measurements.
|
|
81
78
|
* @param x distance along the x axis.
|
|
82
79
|
*/
|
|
83
80
|
xToCzechApproximateDistance(x) {
|
|
@@ -86,16 +83,15 @@ class CzechSpiralEvaluator extends CubicEvaluator_1.CubicEvaluator {
|
|
|
86
83
|
/**
|
|
87
84
|
* Return the inverse of the `forwardL2R2Map` function.
|
|
88
85
|
* * The undefined result can only occur for distances outside the usual spirals.
|
|
89
|
-
* @param
|
|
90
|
-
*
|
|
86
|
+
* @param d (approximate) distance along the spiral.
|
|
91
87
|
*/
|
|
92
88
|
czechApproximateDistanceToX(d) {
|
|
93
89
|
return CzechSpiralEvaluator.inverseL2R2Map(d, 1.0, this.nominalLength1, this.nominalRadius1);
|
|
94
90
|
}
|
|
95
91
|
/**
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
92
|
+
* Evaluate a series expansion that is used with varying signs (plus or minus 1) in czech and italian spirals.
|
|
93
|
+
* @param x distance along the x axis.
|
|
94
|
+
*/
|
|
99
95
|
static forwardL2R2Map(x, sign, length, radius) {
|
|
100
96
|
const l2 = length * length;
|
|
101
97
|
const r2 = radius * radius;
|
|
@@ -106,17 +102,16 @@ class CzechSpiralEvaluator extends CubicEvaluator_1.CubicEvaluator {
|
|
|
106
102
|
/**
|
|
107
103
|
* Return the inverse of the `forwardL2R2Map` function.
|
|
108
104
|
* * The undefined result can only occur for distances outside the usual spirals.
|
|
109
|
-
* @param
|
|
110
|
-
*
|
|
105
|
+
* @param d (approximate) distance along the spiral.
|
|
111
106
|
*/
|
|
112
|
-
static inverseL2R2Map(
|
|
107
|
+
static inverseL2R2Map(d, sign, length, radius) {
|
|
113
108
|
const l2 = length * length;
|
|
114
109
|
const r2 = radius * radius;
|
|
115
110
|
const Q = 4.0 * r2 - l2;
|
|
116
111
|
const a = sign / (10.0 * Q * l2);
|
|
117
|
-
return Newton_1.SimpleNewton.runNewton1D(
|
|
112
|
+
return Newton_1.SimpleNewton.runNewton1D(d, (x) => {
|
|
118
113
|
const xx = x * x;
|
|
119
|
-
return x * (1.0 + xx * xx * a) -
|
|
114
|
+
return x * (1.0 + xx * xx * a) - d;
|
|
120
115
|
}, (x) => {
|
|
121
116
|
const xx = x * x;
|
|
122
117
|
return 1.0 + 5 * xx * xx * a;
|
|
@@ -126,40 +121,37 @@ class CzechSpiralEvaluator extends CubicEvaluator_1.CubicEvaluator {
|
|
|
126
121
|
exports.CzechSpiralEvaluator = CzechSpiralEvaluator;
|
|
127
122
|
/**
|
|
128
123
|
* Italian cubic.
|
|
129
|
-
* This is y= m*x^3 with
|
|
130
|
-
* * x any point on the x axis
|
|
131
|
-
* * `fraction` along the spiral goes to `x = fraction * L
|
|
132
|
-
* * m is gamma
|
|
124
|
+
* This is y = m*x^3 with
|
|
125
|
+
* * x any point on the x axis.
|
|
126
|
+
* * `fraction` along the spiral goes to `x = fraction * L`.
|
|
127
|
+
* * m is gamma/(6RL).
|
|
133
128
|
* * 1/(6RL) is the leading term of the sine series.
|
|
134
|
-
* * `gamma = 2R/sqrt
|
|
135
|
-
* @param localToWorld
|
|
136
|
-
* @param nominalL1
|
|
137
|
-
* @param nominalR1
|
|
138
|
-
* @param activeInterval
|
|
129
|
+
* * `gamma = 2R/sqrt(4RR-LL)` pushes y down a little bit to simulate the lost series terms.
|
|
139
130
|
* @internal
|
|
140
131
|
*/
|
|
141
132
|
class ItalianSpiralEvaluator extends CubicEvaluator_1.CubicEvaluator {
|
|
142
133
|
nominalLength1;
|
|
143
134
|
nominalRadius1;
|
|
144
|
-
/**
|
|
145
|
-
*
|
|
135
|
+
/**
|
|
136
|
+
* Compute the czech cubic constant.
|
|
137
|
+
* * Funky mixture of lengths.
|
|
146
138
|
*/
|
|
147
139
|
static computeCubicM(lengthXByForward, radius1) {
|
|
148
140
|
const gamma = CzechSpiralEvaluator.gammaConstant(lengthXByForward, radius1);
|
|
149
|
-
//
|
|
141
|
+
// in the private update method, the LR values should have been vetted
|
|
150
142
|
if (gamma === undefined)
|
|
151
143
|
return undefined;
|
|
152
|
-
//
|
|
144
|
+
// if radius is negative, it shows up in gamma; but the a signed denominator undoes it so take abs of denominator
|
|
153
145
|
return gamma / Math.abs((6.0 * radius1 * lengthXByForward));
|
|
154
146
|
}
|
|
155
|
-
/** Constructor is private.
|
|
147
|
+
/** Constructor is private. Caller responsible for cubicM validity. */
|
|
156
148
|
constructor(length1, radius1, lengthX, cubicM) {
|
|
157
149
|
super(lengthX, cubicM);
|
|
158
150
|
this.nominalLength1 = length1;
|
|
159
151
|
this.nominalRadius1 = radius1;
|
|
160
152
|
}
|
|
161
153
|
static create(length1, radius1) {
|
|
162
|
-
//
|
|
154
|
+
// this seems goofy.; lengthX from forward, then invert for another but that's what the native code does too
|
|
163
155
|
const lengthX = CzechSpiralEvaluator.forwardL2R2Map(length1, -1.0, length1, radius1);
|
|
164
156
|
const lengthX1 = CzechSpiralEvaluator.inverseL2R2Map(length1, 1.0, lengthX, radius1);
|
|
165
157
|
if (lengthX1 === undefined)
|
|
@@ -174,9 +166,11 @@ class ItalianSpiralEvaluator extends CubicEvaluator_1.CubicEvaluator {
|
|
|
174
166
|
this.nominalRadius1 *= scaleFactor;
|
|
175
167
|
super.scaleInPlace(scaleFactor);
|
|
176
168
|
}
|
|
177
|
-
/**
|
|
178
|
-
clone() {
|
|
179
|
-
|
|
169
|
+
/** Return a deep copy of the evaluator. */
|
|
170
|
+
clone() {
|
|
171
|
+
return new ItalianSpiralEvaluator(this.nominalLength1, this.nominalRadius1, super.axisLength, this.cubicM);
|
|
172
|
+
}
|
|
173
|
+
/** Member by member matchup. */
|
|
180
174
|
isAlmostEqual(other) {
|
|
181
175
|
if (other instanceof ItalianSpiralEvaluator) {
|
|
182
176
|
return Geometry_1.Geometry.isSameCoordinate(this.nominalLength1, other.nominalLength1)
|
|
@@ -185,19 +179,19 @@ class ItalianSpiralEvaluator extends CubicEvaluator_1.CubicEvaluator {
|
|
|
185
179
|
return false;
|
|
186
180
|
}
|
|
187
181
|
/**
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
182
|
+
* Return a (fast but mediocre) approximation of spiral length as a function of x axis position.
|
|
183
|
+
* * This x-to-distance relation is not as precise as the CurvePrimitive method moveSignedDistanceFromFraction.
|
|
184
|
+
* * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate
|
|
185
|
+
* CurvePrimitive measurements.
|
|
186
|
+
* @param x distance along the x axis.
|
|
187
|
+
*/
|
|
193
188
|
distanceToItalianApproximateX(x) {
|
|
194
189
|
return CzechSpiralEvaluator.forwardL2R2Map(x, -1.0, this.nominalLength1, this.nominalRadius1);
|
|
195
190
|
}
|
|
196
191
|
/**
|
|
197
192
|
* Return the inverse of the `forwardL2R2Map` function.
|
|
198
193
|
* * The undefined result can only occur for distances outside the usual spirals.
|
|
199
|
-
* @param
|
|
200
|
-
*
|
|
194
|
+
* @param d (approximate) distance along the spiral.
|
|
201
195
|
*/
|
|
202
196
|
xToItalianApproximateDistance(d) {
|
|
203
197
|
return CzechSpiralEvaluator.inverseL2R2Map(d, -1.0, this.nominalLength1, this.nominalRadius1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CzechSpiralEvaluator.js","sourceRoot":"","sources":["../../../../src/curve/spiral/CzechSpiralEvaluator.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\nimport { Geometry } from \"../../Geometry\";\nimport { CubicEvaluator } from \"./CubicEvaluator\";\nimport { SimpleNewton } from \"../../numerics/Newton\";\n/**\n * Czech cubic.\n * This is y= m*x^3 with\n * * x any point on the x axis\n * * `fraction` along the spiral goes to `x = fraction * L`\n * * m is gamma / (6RL)\n * * 1/(6RL) is the leading term of the sine series.\n * * `gamma = 2R/sqrt (4RR-LL)` pushes y down a little bit to simulate the lost series terms.\n * @param localToWorld\n * @param nominalL1\n * @param nominalR1\n * @param activeInterval\n * @internal\n */\nexport class CzechSpiralEvaluator extends CubicEvaluator {\n public nominalLength1: number;\n public nominalRadius1: number;\n\n /** Constructor is private. Caller responsible for cubicM validity. */\n private constructor(length1: number, radius1: number, cubicM: number) {\n super(length1, cubicM);\n this.nominalLength1 = length1;\n this.nominalRadius1 = radius1;\n }\n /**\n * Return the scale factor between simple x^3 / (6RL) cubic and the czech correction.\n * * For typical case with l1/R1 smallish, this is just less than 1.0:\n * (0.25==>0.99215), (0.15==>0.997184), (0.10==>0.998749), (0.05==>999687)\n * @param length1\n * @param radius1\n */\n public static gammaConstant(length1: number, radius1: number): number | undefined {\n return 2.0 * radius1 / Math.sqrt(4.0 * radius1 * radius1 - length1 * length1);\n }\n /** Compute the czech cubic constant. */\n public static computeCubicM(length1: number, radius1: number): number | undefined {\n const gamma = CzechSpiralEvaluator.gammaConstant(length1, radius1);\n // In the private update method, the LR values should have been vetted.\n if (gamma === undefined)\n return undefined;\n // If radius is negative, it shows up in gamma. But the a signed denominator undoes it. So take abs of denominator.\n return gamma / Math.abs((6.0 * radius1 * length1));\n }\n\n public static create(length1: number, radius1: number): CzechSpiralEvaluator | undefined {\n const m = this.computeCubicM(length1, radius1);\n if (m === undefined)\n return undefined;\n return new CzechSpiralEvaluator(length1, radius1, m);\n }\n\n public override scaleInPlace(scaleFactor: number) {\n this.nominalLength1 *= scaleFactor;\n this.nominalRadius1 *= scaleFactor;\n super.scaleInPlace(scaleFactor);\n }\n /** return a deep copy of the evaluator */\n public clone(): CzechSpiralEvaluator { return new CzechSpiralEvaluator(this.nominalLength1, this.nominalRadius1, this.cubicM); }\n /** Member by member matchup ... */\n public isAlmostEqual(other: any): boolean {\n if (other instanceof CzechSpiralEvaluator) {\n return Geometry.isSameCoordinate(this.nominalLength1, other.nominalLength1)\n && Geometry.isSameCoordinate(this.nominalRadius1, other.nominalRadius1);\n }\n return false;\n }\n\n /**\n * Return a (fast but mediocre) approximation of spiral length as a function of x axis position.\n * * This x-to-distance relation is not as precise as the CurvePrimitive method moveSignedDistanceFromFraction.\n * * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate CurvePrimitive measurements.\n * @param x distance along the x axis.\n */\n public xToCzechApproximateDistance(x: number): number {\n return CzechSpiralEvaluator.forwardL2R2Map(x, 1.0, this.nominalLength1, this.nominalRadius1);\n }\n /**\n * Return the inverse of the `forwardL2R2Map` function.\n * * The undefined result can only occur for distances outside the usual spirals.\n * @param s (approximate) distance along the spiral.\n *\n */\n public czechApproximateDistanceToX(d: number): number | undefined {\n return CzechSpiralEvaluator.inverseL2R2Map(d, 1.0, this.nominalLength1, this.nominalRadius1);\n }\n\n /**\n * evaluate a series expansion that is used with varying signs (plus or minus 1) in czech and italian spirals.\n * @param x distance along the x axis.\n */\n public static forwardL2R2Map(x: number, sign: number, length: number, radius: number): number {\n const l2 = length * length;\n const r2 = radius * radius;\n const Q = 4.0 * r2 - l2;\n const xx = x * x;\n return x * (1.0 + sign * xx * xx / (10.0 * Q * l2));\n }\n /**\n * Return the inverse of the `forwardL2R2Map` function.\n * * The undefined result can only occur for distances outside the usual spirals.\n * @param s (approximate) distance along the spiral.\n *\n */\n public static inverseL2R2Map(b: number, sign: number, length: number, radius: number): number | undefined {\n const l2 = length * length;\n const r2 = radius * radius;\n const Q = 4.0 * r2 - l2;\n const a = sign / (10.0 * Q * l2);\n return SimpleNewton.runNewton1D(b,\n (x: number) => {\n const xx = x * x;\n return x * (1.0 + xx * xx * a) - b;\n },\n (x: number) => {\n const xx = x * x;\n return 1.0 + 5 * xx * xx * a;\n });\n }\n}\n/**\n * Italian cubic.\n * This is y= m*x^3 with\n * * x any point on the x axis\n * * `fraction` along the spiral goes to `x = fraction * L`\n * * m is gamma / (6RL)\n * * 1/(6RL) is the leading term of the sine series.\n * * `gamma = 2R/sqrt (4RR-LL)` pushes y down a little bit to simulate the lost series terms.\n * @param localToWorld\n * @param nominalL1\n * @param nominalR1\n * @param activeInterval\n * @internal\n */\nexport class ItalianSpiralEvaluator extends CubicEvaluator {\n public nominalLength1: number;\n public nominalRadius1: number;\n\n /** Compute the czech cubic constant.\n * ** funky mixture of lengths ....\n */\n private static computeCubicM(lengthXByForward: number, radius1: number): number | undefined {\n const gamma = CzechSpiralEvaluator.gammaConstant(lengthXByForward, radius1);\n // In the private update method, the LR values should have been vetted.\n if (gamma === undefined)\n return undefined;\n // If radius is negative, it shows up in gamma. But the a signed denominator undoes it. So take abs of denominator.\n return gamma / Math.abs((6.0 * radius1 * lengthXByForward));\n }\n\n /** Constructor is private. Caller responsible for cubicM validity. */\n private constructor(length1: number, radius1: number, lengthX: number, cubicM: number) {\n super(lengthX, cubicM);\n this.nominalLength1 = length1;\n this.nominalRadius1 = radius1;\n }\n public static create(length1: number, radius1: number): ItalianSpiralEvaluator | undefined {\n // um ... this seems goofy. lengthX from forward, then invert for another . But that's what the native code does ...\n const lengthX = CzechSpiralEvaluator.forwardL2R2Map(length1, -1.0, length1, radius1);\n const lengthX1 = CzechSpiralEvaluator.inverseL2R2Map(length1, 1.0, lengthX, radius1);\n if (lengthX1 === undefined)\n return undefined;\n const m = ItalianSpiralEvaluator.computeCubicM(lengthX, radius1);\n if (m === undefined)\n return undefined;\n return new ItalianSpiralEvaluator(length1, radius1, lengthX1, m);\n }\n\n public override scaleInPlace(scaleFactor: number) {\n this.nominalLength1 *= scaleFactor;\n this.nominalRadius1 *= scaleFactor;\n super.scaleInPlace(scaleFactor);\n }\n /** return a deep copy of the evaluator */\n public clone(): ItalianSpiralEvaluator { return new ItalianSpiralEvaluator(this.nominalLength1, this.nominalRadius1, super.axisLength, this.cubicM); }\n /** Member by member matchup ... */\n public isAlmostEqual(other: any): boolean {\n if (other instanceof ItalianSpiralEvaluator) {\n return Geometry.isSameCoordinate(this.nominalLength1, other.nominalLength1)\n && Geometry.isSameCoordinate(this.nominalRadius1, other.nominalRadius1);\n }\n return false;\n }\n /**\n * Return a (fast but mediocre) approximation of spiral length as a function of x axis position.\n * * This x-to-distance relation is not as precise as the CurvePrimitive method moveSignedDistanceFromFraction.\n * * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate CurvePrimitive measurements.\n * @param x distance along the x axis.\n */\n public distanceToItalianApproximateX(x: number): number {\n return CzechSpiralEvaluator.forwardL2R2Map(x, -1.0, this.nominalLength1, this.nominalRadius1);\n }\n /**\n * Return the inverse of the `forwardL2R2Map` function.\n * * The undefined result can only occur for distances outside the usual spirals.\n * @param s (approximate) distance along the spiral.\n *\n */\n public xToItalianApproximateDistance(d: number): number | undefined {\n return CzechSpiralEvaluator.inverseL2R2Map(d, -1.0, this.nominalLength1, this.nominalRadius1);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CzechSpiralEvaluator.js","sourceRoot":"","sources":["../../../../src/curve/spiral/CzechSpiralEvaluator.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\nimport { Geometry } from \"../../Geometry\";\nimport { CubicEvaluator } from \"./CubicEvaluator\";\nimport { SimpleNewton } from \"../../numerics/Newton\";\n\n/**\n * Czech cubic.\n * This is y = m*x^3 with\n * * x any point on the x axis.\n * * `fraction` along the spiral goes to `x = fraction * L`.\n * * m is gamma/(6RL).\n * * 1/(6RL) is the leading term of the sine series.\n * * `gamma = 2R/sqrt(4RR-LL)` pushes y down a little bit to simulate the lost series terms.\n * @internal\n */\nexport class CzechSpiralEvaluator extends CubicEvaluator {\n public nominalLength1: number;\n public nominalRadius1: number;\n /** Constructor is private. Caller responsible for cubicM validity. */\n private constructor(length1: number, radius1: number, cubicM: number) {\n super(length1, cubicM);\n this.nominalLength1 = length1;\n this.nominalRadius1 = radius1;\n }\n /**\n * Return the scale factor between simple x^3 / (6RL) cubic and the czech correction.\n * * For typical case with l1/R1 smallish, this is just less than 1.0:\n * (0.25==>0.99215), (0.15==>0.997184), (0.10==>0.998749), (0.05==>999687)\n */\n public static gammaConstant(length1: number, radius1: number): number | undefined {\n return 2.0 * radius1 / Math.sqrt(4.0 * radius1 * radius1 - length1 * length1);\n }\n /** Compute the czech cubic constant. */\n public static computeCubicM(length1: number, radius1: number): number | undefined {\n const gamma = CzechSpiralEvaluator.gammaConstant(length1, radius1);\n // in the private update method, the LR values should have been vetted\n if (gamma === undefined)\n return undefined;\n // if radius is negative, it shows up in gamma; but the a signed denominator undoes it so take abs of denominator\n return gamma / Math.abs((6.0 * radius1 * length1));\n }\n public static create(length1: number, radius1: number): CzechSpiralEvaluator | undefined {\n const m = this.computeCubicM(length1, radius1);\n if (m === undefined)\n return undefined;\n return new CzechSpiralEvaluator(length1, radius1, m);\n }\n public override scaleInPlace(scaleFactor: number) {\n this.nominalLength1 *= scaleFactor;\n this.nominalRadius1 *= scaleFactor;\n super.scaleInPlace(scaleFactor);\n }\n /** Return a deep copy of the evaluator. */\n public clone(): CzechSpiralEvaluator {\n return new CzechSpiralEvaluator(this.nominalLength1, this.nominalRadius1, this.cubicM);\n }\n /** Member by member matchup. */\n public isAlmostEqual(other: any): boolean {\n if (other instanceof CzechSpiralEvaluator) {\n return Geometry.isSameCoordinate(this.nominalLength1, other.nominalLength1)\n && Geometry.isSameCoordinate(this.nominalRadius1, other.nominalRadius1);\n }\n return false;\n }\n /**\n * Return a (fast but mediocre) approximation of spiral length as a function of x axis position.\n * * This x-to-distance relation is not as precise as the CurvePrimitive method moveSignedDistanceFromFraction.\n * * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate\n * CurvePrimitive measurements.\n * @param x distance along the x axis.\n */\n public xToCzechApproximateDistance(x: number): number {\n return CzechSpiralEvaluator.forwardL2R2Map(x, 1.0, this.nominalLength1, this.nominalRadius1);\n }\n /**\n * Return the inverse of the `forwardL2R2Map` function.\n * * The undefined result can only occur for distances outside the usual spirals.\n * @param d (approximate) distance along the spiral.\n */\n public czechApproximateDistanceToX(d: number): number | undefined {\n return CzechSpiralEvaluator.inverseL2R2Map(d, 1.0, this.nominalLength1, this.nominalRadius1);\n }\n /**\n * Evaluate a series expansion that is used with varying signs (plus or minus 1) in czech and italian spirals.\n * @param x distance along the x axis.\n */\n public static forwardL2R2Map(x: number, sign: number, length: number, radius: number): number {\n const l2 = length * length;\n const r2 = radius * radius;\n const Q = 4.0 * r2 - l2;\n const xx = x * x;\n return x * (1.0 + sign * xx * xx / (10.0 * Q * l2));\n }\n /**\n * Return the inverse of the `forwardL2R2Map` function.\n * * The undefined result can only occur for distances outside the usual spirals.\n * @param d (approximate) distance along the spiral.\n */\n public static inverseL2R2Map(d: number, sign: number, length: number, radius: number): number | undefined {\n const l2 = length * length;\n const r2 = radius * radius;\n const Q = 4.0 * r2 - l2;\n const a = sign / (10.0 * Q * l2);\n return SimpleNewton.runNewton1D(\n d,\n (x: number) => {\n const xx = x * x;\n return x * (1.0 + xx * xx * a) - d;\n },\n (x: number) => {\n const xx = x * x;\n return 1.0 + 5 * xx * xx * a;\n },\n );\n }\n}\n\n/**\n * Italian cubic.\n * This is y = m*x^3 with\n * * x any point on the x axis.\n * * `fraction` along the spiral goes to `x = fraction * L`.\n * * m is gamma/(6RL).\n * * 1/(6RL) is the leading term of the sine series.\n * * `gamma = 2R/sqrt(4RR-LL)` pushes y down a little bit to simulate the lost series terms.\n * @internal\n */\nexport class ItalianSpiralEvaluator extends CubicEvaluator {\n public nominalLength1: number;\n public nominalRadius1: number;\n\n /**\n * Compute the czech cubic constant.\n * * Funky mixture of lengths.\n */\n private static computeCubicM(lengthXByForward: number, radius1: number): number | undefined {\n const gamma = CzechSpiralEvaluator.gammaConstant(lengthXByForward, radius1);\n // in the private update method, the LR values should have been vetted\n if (gamma === undefined)\n return undefined;\n // if radius is negative, it shows up in gamma; but the a signed denominator undoes it so take abs of denominator\n return gamma / Math.abs((6.0 * radius1 * lengthXByForward));\n }\n /** Constructor is private. Caller responsible for cubicM validity. */\n private constructor(length1: number, radius1: number, lengthX: number, cubicM: number) {\n super(lengthX, cubicM);\n this.nominalLength1 = length1;\n this.nominalRadius1 = radius1;\n }\n public static create(length1: number, radius1: number): ItalianSpiralEvaluator | undefined {\n // this seems goofy.; lengthX from forward, then invert for another but that's what the native code does too\n const lengthX = CzechSpiralEvaluator.forwardL2R2Map(length1, -1.0, length1, radius1);\n const lengthX1 = CzechSpiralEvaluator.inverseL2R2Map(length1, 1.0, lengthX, radius1);\n if (lengthX1 === undefined)\n return undefined;\n const m = ItalianSpiralEvaluator.computeCubicM(lengthX, radius1);\n if (m === undefined)\n return undefined;\n return new ItalianSpiralEvaluator(length1, radius1, lengthX1, m);\n }\n public override scaleInPlace(scaleFactor: number) {\n this.nominalLength1 *= scaleFactor;\n this.nominalRadius1 *= scaleFactor;\n super.scaleInPlace(scaleFactor);\n }\n /** Return a deep copy of the evaluator. */\n public clone(): ItalianSpiralEvaluator {\n return new ItalianSpiralEvaluator(this.nominalLength1, this.nominalRadius1, super.axisLength, this.cubicM);\n }\n /** Member by member matchup. */\n public isAlmostEqual(other: any): boolean {\n if (other instanceof ItalianSpiralEvaluator) {\n return Geometry.isSameCoordinate(this.nominalLength1, other.nominalLength1)\n && Geometry.isSameCoordinate(this.nominalRadius1, other.nominalRadius1);\n }\n return false;\n }\n /**\n * Return a (fast but mediocre) approximation of spiral length as a function of x axis position.\n * * This x-to-distance relation is not as precise as the CurvePrimitive method moveSignedDistanceFromFraction.\n * * It is supported here for users interested in replicating the Czech distance mapping rather than the more accurate\n * CurvePrimitive measurements.\n * @param x distance along the x axis.\n */\n public distanceToItalianApproximateX(x: number): number {\n return CzechSpiralEvaluator.forwardL2R2Map(x, -1.0, this.nominalLength1, this.nominalRadius1);\n }\n /**\n * Return the inverse of the `forwardL2R2Map` function.\n * * The undefined result can only occur for distances outside the usual spirals.\n * @param d (approximate) distance along the spiral.\n */\n public xToItalianApproximateDistance(d: number): number | undefined {\n return CzechSpiralEvaluator.inverseL2R2Map(d, -1.0, this.nominalLength1, this.nominalRadius1);\n }\n}\n"]}
|
|
@@ -11,9 +11,9 @@ export declare class DirectHalfCosineSpiralEvaluator extends XYCurveEvaluator {
|
|
|
11
11
|
constructor(length1: number, radius1: number);
|
|
12
12
|
private updateConstants;
|
|
13
13
|
scaleInPlace(scaleFactor: number): void;
|
|
14
|
-
/**
|
|
14
|
+
/** Return a deep copy of the evaluator. */
|
|
15
15
|
clone(): DirectHalfCosineSpiralEvaluator;
|
|
16
|
-
/** Member by member matchup
|
|
16
|
+
/** Member by member matchup. */
|
|
17
17
|
isAlmostEqual(other: any): boolean;
|
|
18
18
|
/** Evaluate X at fractional position. */
|
|
19
19
|
fractionToX(fraction: number): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DirectHalfCosineSpiralEvaluator.d.ts","sourceRoot":"","sources":["../../../../src/curve/spiral/DirectHalfCosineSpiralEvaluator.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"DirectHalfCosineSpiralEvaluator.d.ts","sourceRoot":"","sources":["../../../../src/curve/spiral/DirectHalfCosineSpiralEvaluator.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD;;GAEG;AACH,qBAAa,+BAAgC,SAAQ,gBAAgB;IAC5D,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,GAAG,CAAS;gBACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAUnD,OAAO,CAAC,eAAe;IAGhB,YAAY,CAAC,WAAW,EAAE,MAAM;IAKvC,2CAA2C;IACpC,KAAK,IAAI,+BAA+B;IAG/C,gCAAgC;IACzB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAQzC,yCAAyC;IAClC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAG5C,yCAAyC;IAClC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI5C,gFAAgF;IACzE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAG9C,gFAAgF;IACzE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAK7C,uFAAuF;IAChF,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAG/C,sFAAsF;IAC/E,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAK9C,uFAAuF;IAChF,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAG/C,sFAAsF;IAC/E,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAK9C,yEAAyE;IACzD,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAGpE,mDAAmD;IAC5C,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAWlD"}
|
|
@@ -38,9 +38,11 @@ class DirectHalfCosineSpiralEvaluator extends XYCurveEvaluator_1.XYCurveEvaluato
|
|
|
38
38
|
this.nominalRadius1 *= scaleFactor;
|
|
39
39
|
this.updateConstants();
|
|
40
40
|
}
|
|
41
|
-
/**
|
|
42
|
-
clone() {
|
|
43
|
-
|
|
41
|
+
/** Return a deep copy of the evaluator. */
|
|
42
|
+
clone() {
|
|
43
|
+
return new DirectHalfCosineSpiralEvaluator(this.nominalLength1, this.nominalRadius1);
|
|
44
|
+
}
|
|
45
|
+
/** Member by member matchup. */
|
|
44
46
|
isAlmostEqual(other) {
|
|
45
47
|
if (other instanceof DirectHalfCosineSpiralEvaluator) {
|
|
46
48
|
return Geometry_1.Geometry.isSameCoordinate(this.nominalLength1, other.nominalLength1)
|
|
@@ -50,14 +52,18 @@ class DirectHalfCosineSpiralEvaluator extends XYCurveEvaluator_1.XYCurveEvaluato
|
|
|
50
52
|
return false;
|
|
51
53
|
}
|
|
52
54
|
/** Evaluate X at fractional position. */
|
|
53
|
-
fractionToX(fraction) {
|
|
55
|
+
fractionToX(fraction) {
|
|
56
|
+
return fraction * this.nominalLength1;
|
|
57
|
+
}
|
|
54
58
|
/** Evaluate Y at fractional position. */
|
|
55
59
|
fractionToY(fraction) {
|
|
56
60
|
const theta = fraction * Math.PI;
|
|
57
61
|
return this._c * (this._c2 * fraction * fraction - this._c1 * (1.0 - Math.cos(theta)));
|
|
58
62
|
}
|
|
59
63
|
/** Evaluate derivative of X with respect to fraction at fractional position. */
|
|
60
|
-
fractionToDX(_fraction) {
|
|
64
|
+
fractionToDX(_fraction) {
|
|
65
|
+
return this.nominalLength1;
|
|
66
|
+
}
|
|
61
67
|
/** Evaluate derivative of Y with respect to fraction at fractional position. */
|
|
62
68
|
fractionToDY(fraction) {
|
|
63
69
|
const pi = Math.PI;
|
|
@@ -65,7 +71,9 @@ class DirectHalfCosineSpiralEvaluator extends XYCurveEvaluator_1.XYCurveEvaluato
|
|
|
65
71
|
return this._c * (2.0 * this._c2 * fraction - this._c1 * pi * Math.sin(theta));
|
|
66
72
|
}
|
|
67
73
|
/** Evaluate second derivative of X with respect to fraction at fractional position. */
|
|
68
|
-
fractionToDDX(_fraction) {
|
|
74
|
+
fractionToDDX(_fraction) {
|
|
75
|
+
return 0.0;
|
|
76
|
+
}
|
|
69
77
|
/** Evaluate third derivative of Y with respect to fraction at fractional position. */
|
|
70
78
|
fractionToDDY(fraction) {
|
|
71
79
|
const pi = Math.PI;
|
|
@@ -73,7 +81,9 @@ class DirectHalfCosineSpiralEvaluator extends XYCurveEvaluator_1.XYCurveEvaluato
|
|
|
73
81
|
return this._c * (2.0 * this._c2 - this._c1 * pi * pi * Math.cos(theta));
|
|
74
82
|
}
|
|
75
83
|
/** Evaluate second derivative of X with respect to fraction at fractional position. */
|
|
76
|
-
fractionToD3X(_fraction) {
|
|
84
|
+
fractionToD3X(_fraction) {
|
|
85
|
+
return 0.0;
|
|
86
|
+
}
|
|
77
87
|
/** Evaluate third derivative of Y with respect to fraction at fractional position. */
|
|
78
88
|
fractionToD3Y(fraction) {
|
|
79
89
|
const pi = Math.PI;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DirectHalfCosineSpiralEvaluator.js","sourceRoot":"","sources":["../../../../src/curve/spiral/DirectHalfCosineSpiralEvaluator.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F;;GAEG;AACH,6CAA0C;AAC1C,yDAAsD;AACtD,kDAAqD;
|
|
1
|
+
{"version":3,"file":"DirectHalfCosineSpiralEvaluator.js","sourceRoot":"","sources":["../../../../src/curve/spiral/DirectHalfCosineSpiralEvaluator.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\nimport { Geometry } from \"../../Geometry\";\nimport { XYCurveEvaluator } from \"./XYCurveEvaluator\";\nimport { SimpleNewton } from \"../../numerics/Newton\";\n\n/**\n * @internal\n */\nexport class DirectHalfCosineSpiralEvaluator extends XYCurveEvaluator {\n public nominalLength1: number;\n public nominalRadius1: number;\n private _c: number;\n private _c1: number;\n private _c2: number;\n public constructor(length1: number, radius1: number) {\n super();\n this.nominalLength1 = length1;\n this.nominalRadius1 = radius1;\n const pi = Math.PI;\n this._c1 = 1.0 / (2.0 * pi * pi);\n this._c2 = 0.25;\n this._c = 0.0; // TO BE UPDATED BELOW\n this.updateConstants();\n }\n private updateConstants() {\n this._c = this.nominalLength1 * this.nominalLength1 / this.nominalRadius1;\n }\n public scaleInPlace(scaleFactor: number) {\n this.nominalLength1 *= scaleFactor;\n this.nominalRadius1 *= scaleFactor;\n this.updateConstants();\n }\n /** Return a deep copy of the evaluator. */\n public clone(): DirectHalfCosineSpiralEvaluator {\n return new DirectHalfCosineSpiralEvaluator(this.nominalLength1, this.nominalRadius1);\n }\n /** Member by member matchup. */\n public isAlmostEqual(other: any): boolean {\n if (other instanceof DirectHalfCosineSpiralEvaluator) {\n return Geometry.isSameCoordinate(this.nominalLength1, other.nominalLength1)\n && Geometry.isSameCoordinate(this.nominalRadius1, other.nominalRadius1);\n // remark: c,c1,c2 are computed, need not be tested.\n }\n return false;\n }\n /** Evaluate X at fractional position. */\n public fractionToX(fraction: number): number {\n return fraction * this.nominalLength1;\n }\n /** Evaluate Y at fractional position. */\n public fractionToY(fraction: number): number {\n const theta = fraction * Math.PI;\n return this._c * (this._c2 * fraction * fraction - this._c1 * (1.0 - Math.cos(theta)));\n }\n /** Evaluate derivative of X with respect to fraction at fractional position. */\n public fractionToDX(_fraction: number): number {\n return this.nominalLength1;\n }\n /** Evaluate derivative of Y with respect to fraction at fractional position. */\n public fractionToDY(fraction: number): number {\n const pi = Math.PI;\n const theta = fraction * pi;\n return this._c * (2.0 * this._c2 * fraction - this._c1 * pi * Math.sin(theta));\n }\n /** Evaluate second derivative of X with respect to fraction at fractional position. */\n public fractionToDDX(_fraction: number): number {\n return 0.0;\n }\n /** Evaluate third derivative of Y with respect to fraction at fractional position. */\n public fractionToDDY(fraction: number): number {\n const pi = Math.PI;\n const theta = fraction * pi;\n return this._c * (2.0 * this._c2 - this._c1 * pi * pi * Math.cos(theta));\n }\n /** Evaluate second derivative of X with respect to fraction at fractional position. */\n public fractionToD3X(_fraction: number): number {\n return 0.0;\n }\n /** Evaluate third derivative of Y with respect to fraction at fractional position. */\n public fractionToD3Y(fraction: number): number {\n const pi = Math.PI;\n const theta = fraction * pi;\n return this._c * this._c1 * pi * pi * pi * Math.sin(theta);\n }\n /** Return the magnitude of the first vector at fractional coordinate. */\n public override fractionToTangentMagnitude(fraction: number): number {\n return Geometry.hypotenuseXY(this.fractionToDX(fraction), this.fractionToDY(fraction));\n }\n /** Invert the fractionToX function for given X. */\n public xToFraction(x: number): number | undefined {\n const fraction0 = x / this.nominalLength1;\n const fraction1 = SimpleNewton.runNewton1D(\n fraction0,\n (f: number) => (this.fractionToX(f) - x),\n (f: number) => this.fractionToDX(f),\n );\n if (fraction1 === undefined)\n return undefined;\n return fraction1;\n }\n}\n"]}
|