@itwin/core-geometry 4.0.0-dev.68 → 4.0.0-dev.70
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/cjs/geometry3d/Ray3d.d.ts +50 -43
- package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js +96 -55
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.d.ts +50 -43
- package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js +96 -55
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/package.json +3 -3
|
@@ -8,16 +8,17 @@ import { Point3d, Vector3d } from "./Point3dVector3d";
|
|
|
8
8
|
import { Range1d, Range3d } from "./Range";
|
|
9
9
|
import { Transform } from "./Transform";
|
|
10
10
|
import { XYAndZ } from "./XYZProps";
|
|
11
|
-
/**
|
|
12
|
-
*
|
|
13
|
-
* *
|
|
14
|
-
*
|
|
11
|
+
/**
|
|
12
|
+
* A Ray3d contains
|
|
13
|
+
* * an `origin` point.
|
|
14
|
+
* * a `direction` vector (The vector is not required to be normalized).
|
|
15
|
+
* * an optional weight (number).
|
|
15
16
|
* @public
|
|
16
17
|
*/
|
|
17
18
|
export declare class Ray3d implements BeJSONFunctions {
|
|
18
19
|
/** The ray origin */
|
|
19
20
|
origin: Point3d;
|
|
20
|
-
/** The ray direction.
|
|
21
|
+
/** The ray direction. This is commonly (but not always) a unit vector. */
|
|
21
22
|
direction: Vector3d;
|
|
22
23
|
/** Numeric annotation. */
|
|
23
24
|
a?: number;
|
|
@@ -31,19 +32,29 @@ export declare class Ray3d implements BeJSONFunctions {
|
|
|
31
32
|
static createZAxis(): Ray3d;
|
|
32
33
|
/** Create a ray with all zeros. */
|
|
33
34
|
static createZero(result?: Ray3d): Ray3d;
|
|
34
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Test for nearly equal Ray3d objects.
|
|
35
37
|
* * This tests for near equality of origin and direction -- i.e. member-by-member comparison.
|
|
36
|
-
* * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the
|
|
37
|
-
|
|
38
|
+
* * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the
|
|
39
|
+
* directions to be scaled or opposing.
|
|
40
|
+
*/
|
|
38
41
|
isAlmostEqual(other: Ray3d): boolean;
|
|
39
|
-
/**
|
|
42
|
+
/** Return the dot product of the ray's direction vector with a vector from the ray origin to the `spacePoint`. */
|
|
43
|
+
dotProductToPoint(spacePoint: Point3d): number;
|
|
44
|
+
/** Return the fractional coordinate (along the direction vector) of the `spacePoint` projected to the ray. */
|
|
45
|
+
pointToFraction(spacePoint: Point3d): number;
|
|
46
|
+
/** Return the `spacePoint` projected onto the ray. */
|
|
47
|
+
projectPointToRay(spacePoint: Point3d): Point3d;
|
|
48
|
+
/**
|
|
49
|
+
* Test for nearly equal rays, allowing origin float and direction scaling.
|
|
40
50
|
* * Use [[isAlmostEqual]] to require member-by-member comparison.
|
|
41
|
-
|
|
51
|
+
*/
|
|
42
52
|
isAlmostEqualPointSet(other: Ray3d): boolean;
|
|
43
53
|
/** Create a ray from origin and direction. */
|
|
44
54
|
static create(origin: Point3d, direction: Vector3d, result?: Ray3d): Ray3d;
|
|
45
55
|
/**
|
|
46
|
-
* Given a homogeneous point and its derivative components, construct a Ray3d with cartesian
|
|
56
|
+
* Given a homogeneous point and its derivative components, construct a Ray3d with cartesian
|
|
57
|
+
* coordinates and derivatives.
|
|
47
58
|
* @param weightedPoint `[x,y,z,w]` parts of weighted point.
|
|
48
59
|
* @param weightedDerivative `[x,y,z,w]` derivatives
|
|
49
60
|
* @param result
|
|
@@ -55,13 +66,13 @@ export declare class Ray3d implements BeJSONFunctions {
|
|
|
55
66
|
static createCapture(origin: Point3d, direction: Vector3d): Ray3d;
|
|
56
67
|
/** Create from (clones of) origin, direction, and numeric weight. */
|
|
57
68
|
static createPointVectorNumber(origin: Point3d, direction: Vector3d, a: number, result?: Ray3d): Ray3d;
|
|
58
|
-
/** Create from origin and target.
|
|
69
|
+
/** Create from origin and target. The direction vector is the full length (non-unit) vector from origin to target. */
|
|
59
70
|
static createStartEnd(origin: Point3d, target: Point3d, result?: Ray3d): Ray3d;
|
|
60
71
|
/** Return a reference to the ray's origin. */
|
|
61
72
|
getOriginRef(): Point3d;
|
|
62
73
|
/** Return a reference to the ray's direction vector. */
|
|
63
74
|
getDirectionRef(): Vector3d;
|
|
64
|
-
/**
|
|
75
|
+
/** Copy coordinates from origin and direction. */
|
|
65
76
|
set(origin: Point3d, direction: Vector3d): void;
|
|
66
77
|
/** Clone the ray. */
|
|
67
78
|
clone(result?: Ray3d): Ray3d;
|
|
@@ -73,33 +84,22 @@ export declare class Ray3d implements BeJSONFunctions {
|
|
|
73
84
|
transformInPlace(transform: Transform): void;
|
|
74
85
|
/** Copy data from another ray. */
|
|
75
86
|
setFrom(source: Ray3d): void;
|
|
76
|
-
/**
|
|
87
|
+
/**
|
|
88
|
+
* Return a point at fractional position along the ray.
|
|
89
|
+
* * fraction 0 is the ray origin.
|
|
77
90
|
* * fraction 1 is at the end of the direction vector when placed at the origin.
|
|
78
|
-
* @returns Return a point at fractional position along the ray.
|
|
79
91
|
*/
|
|
80
92
|
fractionToPoint(fraction: number, result?: Point3d): Point3d;
|
|
81
|
-
/** Return the dot product of the ray's direction vector with a vector from the ray origin to the space point. */
|
|
82
|
-
dotProductToPoint(spacePoint: Point3d): number;
|
|
83
93
|
/**
|
|
84
|
-
* Return
|
|
85
|
-
|
|
86
|
-
pointToFraction(spacePoint: Point3d): number;
|
|
87
|
-
/**
|
|
88
|
-
*
|
|
89
|
-
* Return the spacePoint projected onto the ray.
|
|
90
|
-
*/
|
|
91
|
-
projectPointToRay(spacePoint: Point3d): Point3d;
|
|
92
|
-
/** Return a transform for rigid axes
|
|
93
|
-
* at ray origin with z in ray direction. If the direction vector is zero, axes default to identity (from createHeadsUpTriad)
|
|
94
|
+
* Return a transform for rigid axes at ray origin with z in ray direction.
|
|
95
|
+
* * If the direction vector is zero, axes default to identity (from [[Matrix3d.createRigidHeadsUp]])
|
|
94
96
|
*/
|
|
95
97
|
toRigidZFrame(): Transform | undefined;
|
|
96
|
-
/**
|
|
97
|
-
* Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d.
|
|
98
|
-
*/
|
|
98
|
+
/** Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d. */
|
|
99
99
|
setFromJSON(json?: any): void;
|
|
100
100
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
101
|
+
* Try to scale the direction vector to a given magnitude.
|
|
102
|
+
* * Returns false if ray direction is a zero vector.
|
|
103
103
|
*/
|
|
104
104
|
trySetDirectionMagnitudeInPlace(magnitude?: number): boolean;
|
|
105
105
|
/**
|
|
@@ -113,11 +113,11 @@ export declare class Ray3d implements BeJSONFunctions {
|
|
|
113
113
|
*/
|
|
114
114
|
tryNormalizeInPlaceWithAreaWeight(a: number): boolean;
|
|
115
115
|
/**
|
|
116
|
-
*
|
|
116
|
+
* Construct a JSON object from this Ray3d.
|
|
117
117
|
* @return {*} [origin,normal]
|
|
118
118
|
*/
|
|
119
119
|
toJSON(): any;
|
|
120
|
-
/** Create a new ray from json object.
|
|
120
|
+
/** Create a new ray from json object. See `setFromJSON` for json structure; */
|
|
121
121
|
static fromJSON(json?: any): Ray3d;
|
|
122
122
|
/** return distance from the ray to point in space */
|
|
123
123
|
distance(spacePoint: Point3d): number;
|
|
@@ -129,24 +129,31 @@ export declare class Ray3d implements BeJSONFunctions {
|
|
|
129
129
|
*/
|
|
130
130
|
intersectionWithPlane(plane: Plane3dByOriginAndUnitNormal, result?: Point3d): number | undefined;
|
|
131
131
|
/**
|
|
132
|
-
*
|
|
132
|
+
* Find intersection of the ray with a Range3d.
|
|
133
133
|
* * return the range of fractions (on the ray) which are "inside" the range.
|
|
134
134
|
* * Note that a range is always returned; if there is no intersection it is indicated by the test `result.sNull`
|
|
135
135
|
*/
|
|
136
136
|
intersectionWithRange3d(range: Range3d, result?: Range1d): Range1d;
|
|
137
|
-
/**
|
|
137
|
+
/**
|
|
138
|
+
* Construct a vector from `ray.origin` to target point.
|
|
138
139
|
* * return the part of the vector that is perpendicular to `ray.direction`.
|
|
139
|
-
*
|
|
140
|
+
* * i.e., return the shortest vector from the ray to the point.
|
|
140
141
|
*/
|
|
141
142
|
perpendicularPartOfVectorToTarget(targetPoint: XYAndZ, result?: Vector3d): Vector3d;
|
|
142
|
-
/**
|
|
143
|
+
/**
|
|
144
|
+
* Determine if two rays intersect, are fully overlapped, parallel but no coincident, or skew
|
|
143
145
|
* * Return a CurveLocationDetailPair which
|
|
144
146
|
* * contains fraction and point on each ray.
|
|
145
|
-
* * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of
|
|
146
|
-
*
|
|
147
|
-
* * CurveCurveApproachType.
|
|
148
|
-
*
|
|
149
|
-
* * CurveCurveApproachType.
|
|
147
|
+
* * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of
|
|
148
|
+
* these relationships
|
|
149
|
+
* * CurveCurveApproachType.Intersection -- the rays have a simple intersection, at fractions indicated
|
|
150
|
+
* in detailA and detailB
|
|
151
|
+
* * CurveCurveApproachType.PerpendicularChord -- there is pair of where the rays have closest approach.
|
|
152
|
+
* The rays are skew in space.
|
|
153
|
+
* * CurveCurveApproachType.CoincidentGeometry -- the rays are the same unbounded line in space. The
|
|
154
|
+
* fractions and points are a representative single common point.
|
|
155
|
+
* * CurveCurveApproachType.Parallel -- the rays are parallel (and not coincident). The two points are
|
|
156
|
+
* at the minimum distance
|
|
150
157
|
*/
|
|
151
158
|
static closestApproachRay3dRay3d(rayA: Ray3d, rayB: Ray3d): CurveLocationDetailPair;
|
|
152
159
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ray3d.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Ray3d.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,OAAO,EAA+C,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACpH,OAAO,EAAa,eAAe,EAAY,MAAM,aAAa,CAAC;AAGnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC
|
|
1
|
+
{"version":3,"file":"Ray3d.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Ray3d.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,14 +16,15 @@ const Point2dVector2d_1 = require("./Point2dVector2d");
|
|
|
16
16
|
const Point3dVector3d_1 = require("./Point3dVector3d");
|
|
17
17
|
const Range_1 = require("./Range");
|
|
18
18
|
const Transform_1 = require("./Transform");
|
|
19
|
-
/**
|
|
20
|
-
*
|
|
21
|
-
* *
|
|
22
|
-
*
|
|
19
|
+
/**
|
|
20
|
+
* A Ray3d contains
|
|
21
|
+
* * an `origin` point.
|
|
22
|
+
* * a `direction` vector (The vector is not required to be normalized).
|
|
23
|
+
* * an optional weight (number).
|
|
23
24
|
* @public
|
|
24
25
|
*/
|
|
25
26
|
class Ray3d {
|
|
26
|
-
// constructor captures references
|
|
27
|
+
// constructor (captures references)
|
|
27
28
|
constructor(origin, direction) {
|
|
28
29
|
this.origin = origin;
|
|
29
30
|
this.direction = direction;
|
|
@@ -33,11 +34,17 @@ class Ray3d {
|
|
|
33
34
|
return new Ray3d(Point3dVector3d_1.Point3d.create(x, y, z), Point3dVector3d_1.Vector3d.create(u, v, w));
|
|
34
35
|
}
|
|
35
36
|
/** Create a ray on the x axis. */
|
|
36
|
-
static createXAxis() {
|
|
37
|
+
static createXAxis() {
|
|
38
|
+
return Ray3d._create(0, 0, 0, 1, 0, 0);
|
|
39
|
+
}
|
|
37
40
|
/** Create a ray on the y axis. */
|
|
38
|
-
static createYAxis() {
|
|
41
|
+
static createYAxis() {
|
|
42
|
+
return Ray3d._create(0, 0, 0, 0, 1, 0);
|
|
43
|
+
}
|
|
39
44
|
/** Create a ray on the z axis. */
|
|
40
|
-
static createZAxis() {
|
|
45
|
+
static createZAxis() {
|
|
46
|
+
return Ray3d._create(0, 0, 0, 0, 0, 1);
|
|
47
|
+
}
|
|
41
48
|
/** Create a ray with all zeros. */
|
|
42
49
|
static createZero(result) {
|
|
43
50
|
if (result) {
|
|
@@ -47,20 +54,51 @@ class Ray3d {
|
|
|
47
54
|
}
|
|
48
55
|
return new Ray3d(Point3dVector3d_1.Point3d.createZero(), Point3dVector3d_1.Vector3d.createZero());
|
|
49
56
|
}
|
|
50
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* Test for nearly equal Ray3d objects.
|
|
51
59
|
* * This tests for near equality of origin and direction -- i.e. member-by-member comparison.
|
|
52
|
-
* * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the
|
|
53
|
-
|
|
60
|
+
* * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the
|
|
61
|
+
* directions to be scaled or opposing.
|
|
62
|
+
*/
|
|
54
63
|
isAlmostEqual(other) {
|
|
55
64
|
return this.origin.isAlmostEqual(other.origin) && this.direction.isAlmostEqual(other.direction);
|
|
56
65
|
}
|
|
57
|
-
/**
|
|
66
|
+
/** Return the dot product of the ray's direction vector with a vector from the ray origin to the `spacePoint`. */
|
|
67
|
+
dotProductToPoint(spacePoint) {
|
|
68
|
+
return this.direction.dotProductStartEnd(this.origin, spacePoint);
|
|
69
|
+
}
|
|
70
|
+
/** Return the fractional coordinate (along the direction vector) of the `spacePoint` projected to the ray. */
|
|
71
|
+
pointToFraction(spacePoint) {
|
|
72
|
+
return Geometry_1.Geometry.safeDivideFraction(this.dotProductToPoint(spacePoint), this.direction.magnitudeSquared(), 0);
|
|
73
|
+
}
|
|
74
|
+
/** Return the `spacePoint` projected onto the ray. */
|
|
75
|
+
projectPointToRay(spacePoint) {
|
|
76
|
+
/**
|
|
77
|
+
* To project a point to the ray, we can create a vector called "v" from ray origin to the spacePoint and project
|
|
78
|
+
* that vector to the ray direction vector "r". The projection is "((v.r)/||r||^2) r" where "v.r" is the dot
|
|
79
|
+
* product. Note that pointToFraction returns "(v.r)/||r||^2".
|
|
80
|
+
* Note: If r is the normal of a plane, then projection length "(v.r)/||r||" is the signed altitude of the
|
|
81
|
+
* spacePoint with respect to the plane.
|
|
82
|
+
*/
|
|
83
|
+
return this.origin.plusScaled(this.direction, this.pointToFraction(spacePoint));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Test for nearly equal rays, allowing origin float and direction scaling.
|
|
58
87
|
* * Use [[isAlmostEqual]] to require member-by-member comparison.
|
|
59
|
-
|
|
88
|
+
*/
|
|
60
89
|
isAlmostEqualPointSet(other) {
|
|
90
|
+
/**
|
|
91
|
+
* This function tests two rays to determine if they define the same infinite lines.
|
|
92
|
+
* So the origins can be different as long as they are on the infinite line (they can
|
|
93
|
+
* "float") but the directions must be parallel or antiparallel.
|
|
94
|
+
*/
|
|
61
95
|
if (!this.direction.isParallelTo(other.direction, true))
|
|
62
96
|
return false;
|
|
63
|
-
|
|
97
|
+
/**
|
|
98
|
+
* In exact math, we consider a ray to have an infinite line as direction (not a finite vector).
|
|
99
|
+
* Therefore, in exact math it is not possible for one origin to be on the other ray but not vice
|
|
100
|
+
* versa. However, we test both ways because first check may pass due to round-off errors.
|
|
101
|
+
*/
|
|
64
102
|
let workPoint = this.projectPointToRay(other.origin);
|
|
65
103
|
if (!other.origin.isAlmostEqualMetric(workPoint))
|
|
66
104
|
return false;
|
|
@@ -78,7 +116,8 @@ class Ray3d {
|
|
|
78
116
|
return new Ray3d(origin.clone(), direction.clone());
|
|
79
117
|
}
|
|
80
118
|
/**
|
|
81
|
-
* Given a homogeneous point and its derivative components, construct a Ray3d with cartesian
|
|
119
|
+
* Given a homogeneous point and its derivative components, construct a Ray3d with cartesian
|
|
120
|
+
* coordinates and derivatives.
|
|
82
121
|
* @param weightedPoint `[x,y,z,w]` parts of weighted point.
|
|
83
122
|
* @param weightedDerivative `[x,y,z,w]` derivatives
|
|
84
123
|
* @param result
|
|
@@ -123,7 +162,7 @@ class Ray3d {
|
|
|
123
162
|
result.a = a;
|
|
124
163
|
return result;
|
|
125
164
|
}
|
|
126
|
-
/** Create from origin and target.
|
|
165
|
+
/** Create from origin and target. The direction vector is the full length (non-unit) vector from origin to target. */
|
|
127
166
|
static createStartEnd(origin, target, result) {
|
|
128
167
|
if (result) {
|
|
129
168
|
result.origin.setFrom(origin);
|
|
@@ -133,10 +172,14 @@ class Ray3d {
|
|
|
133
172
|
return new Ray3d(origin.clone(), Point3dVector3d_1.Vector3d.createStartEnd(origin, target));
|
|
134
173
|
}
|
|
135
174
|
/** Return a reference to the ray's origin. */
|
|
136
|
-
getOriginRef() {
|
|
175
|
+
getOriginRef() {
|
|
176
|
+
return this.origin;
|
|
177
|
+
}
|
|
137
178
|
/** Return a reference to the ray's direction vector. */
|
|
138
|
-
getDirectionRef() {
|
|
139
|
-
|
|
179
|
+
getDirectionRef() {
|
|
180
|
+
return this.direction;
|
|
181
|
+
}
|
|
182
|
+
/** Copy coordinates from origin and direction. */
|
|
140
183
|
set(origin, direction) {
|
|
141
184
|
this.origin.setFrom(origin);
|
|
142
185
|
this.direction.setFrom(direction);
|
|
@@ -167,37 +210,26 @@ class Ray3d {
|
|
|
167
210
|
transform.multiplyVector(this.direction, this.direction);
|
|
168
211
|
}
|
|
169
212
|
/** Copy data from another ray. */
|
|
170
|
-
setFrom(source) {
|
|
171
|
-
|
|
172
|
-
* * fraction 1 is at the end of the direction vector when placed at the origin.
|
|
173
|
-
* @returns Return a point at fractional position along the ray.
|
|
174
|
-
*/
|
|
175
|
-
fractionToPoint(fraction, result) { return this.origin.plusScaled(this.direction, fraction, result); }
|
|
176
|
-
/** Return the dot product of the ray's direction vector with a vector from the ray origin to the space point. */
|
|
177
|
-
dotProductToPoint(spacePoint) { return this.direction.dotProductStartEnd(this.origin, spacePoint); }
|
|
178
|
-
/**
|
|
179
|
-
* Return the fractional coordinate (along the direction vector) of the spacePoint projected to the ray.
|
|
180
|
-
*/
|
|
181
|
-
pointToFraction(spacePoint) {
|
|
182
|
-
return Geometry_1.Geometry.safeDivideFraction(this.direction.dotProductStartEnd(this.origin, spacePoint), this.direction.magnitudeSquared(), 0);
|
|
213
|
+
setFrom(source) {
|
|
214
|
+
this.set(source.origin, source.direction);
|
|
183
215
|
}
|
|
184
216
|
/**
|
|
185
|
-
*
|
|
186
|
-
*
|
|
217
|
+
* Return a point at fractional position along the ray.
|
|
218
|
+
* * fraction 0 is the ray origin.
|
|
219
|
+
* * fraction 1 is at the end of the direction vector when placed at the origin.
|
|
187
220
|
*/
|
|
188
|
-
|
|
189
|
-
return this.origin.plusScaled(this.direction,
|
|
221
|
+
fractionToPoint(fraction, result) {
|
|
222
|
+
return this.origin.plusScaled(this.direction, fraction, result);
|
|
190
223
|
}
|
|
191
|
-
/**
|
|
192
|
-
* at ray origin with z in ray direction.
|
|
224
|
+
/**
|
|
225
|
+
* Return a transform for rigid axes at ray origin with z in ray direction.
|
|
226
|
+
* * If the direction vector is zero, axes default to identity (from [[Matrix3d.createRigidHeadsUp]])
|
|
193
227
|
*/
|
|
194
228
|
toRigidZFrame() {
|
|
195
229
|
const axes = Matrix3d_1.Matrix3d.createRigidHeadsUp(this.direction, Geometry_1.AxisOrder.ZXY);
|
|
196
230
|
return Transform_1.Transform.createOriginAndMatrix(this.origin, axes);
|
|
197
231
|
}
|
|
198
|
-
/**
|
|
199
|
-
* Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d.
|
|
200
|
-
*/
|
|
232
|
+
/** Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d. */
|
|
201
233
|
setFromJSON(json) {
|
|
202
234
|
if (!json) {
|
|
203
235
|
this.origin.set(0, 0, 0);
|
|
@@ -208,8 +240,8 @@ class Ray3d {
|
|
|
208
240
|
this.direction.setFromJSON(json.direction);
|
|
209
241
|
}
|
|
210
242
|
/**
|
|
211
|
-
*
|
|
212
|
-
*
|
|
243
|
+
* Try to scale the direction vector to a given magnitude.
|
|
244
|
+
* * Returns false if ray direction is a zero vector.
|
|
213
245
|
*/
|
|
214
246
|
trySetDirectionMagnitudeInPlace(magnitude = 1.0) {
|
|
215
247
|
if (this.direction.tryNormalizeInPlace()) {
|
|
@@ -242,11 +274,13 @@ class Ray3d {
|
|
|
242
274
|
return false;
|
|
243
275
|
}
|
|
244
276
|
/**
|
|
245
|
-
*
|
|
277
|
+
* Construct a JSON object from this Ray3d.
|
|
246
278
|
* @return {*} [origin,normal]
|
|
247
279
|
*/
|
|
248
|
-
toJSON() {
|
|
249
|
-
|
|
280
|
+
toJSON() {
|
|
281
|
+
return { origin: this.origin.toJSON(), direction: this.direction.toJSON() };
|
|
282
|
+
}
|
|
283
|
+
/** Create a new ray from json object. See `setFromJSON` for json structure; */
|
|
250
284
|
static fromJSON(json) {
|
|
251
285
|
const result = Ray3d.createXAxis();
|
|
252
286
|
result.setFromJSON(json);
|
|
@@ -285,7 +319,7 @@ class Ray3d {
|
|
|
285
319
|
return division;
|
|
286
320
|
}
|
|
287
321
|
/**
|
|
288
|
-
*
|
|
322
|
+
* Find intersection of the ray with a Range3d.
|
|
289
323
|
* * return the range of fractions (on the ray) which are "inside" the range.
|
|
290
324
|
* * Note that a range is always returned; if there is no intersection it is indicated by the test `result.sNull`
|
|
291
325
|
*/
|
|
@@ -299,9 +333,10 @@ class Ray3d {
|
|
|
299
333
|
return interval;
|
|
300
334
|
return interval;
|
|
301
335
|
}
|
|
302
|
-
/**
|
|
336
|
+
/**
|
|
337
|
+
* Construct a vector from `ray.origin` to target point.
|
|
303
338
|
* * return the part of the vector that is perpendicular to `ray.direction`.
|
|
304
|
-
*
|
|
339
|
+
* * i.e., return the shortest vector from the ray to the point.
|
|
305
340
|
*/
|
|
306
341
|
perpendicularPartOfVectorToTarget(targetPoint, result) {
|
|
307
342
|
const vectorV = Point3dVector3d_1.Vector3d.createStartEnd(this.origin, targetPoint);
|
|
@@ -310,14 +345,20 @@ class Ray3d {
|
|
|
310
345
|
const fraction = Geometry_1.Geometry.safeDivideFraction(uv, uu, 0.0);
|
|
311
346
|
return vectorV.plusScaled(this.direction, -fraction, result);
|
|
312
347
|
}
|
|
313
|
-
/**
|
|
348
|
+
/**
|
|
349
|
+
* Determine if two rays intersect, are fully overlapped, parallel but no coincident, or skew
|
|
314
350
|
* * Return a CurveLocationDetailPair which
|
|
315
351
|
* * contains fraction and point on each ray.
|
|
316
|
-
* * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of
|
|
317
|
-
*
|
|
318
|
-
* * CurveCurveApproachType.
|
|
319
|
-
*
|
|
320
|
-
* * CurveCurveApproachType.
|
|
352
|
+
* * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of
|
|
353
|
+
* these relationships
|
|
354
|
+
* * CurveCurveApproachType.Intersection -- the rays have a simple intersection, at fractions indicated
|
|
355
|
+
* in detailA and detailB
|
|
356
|
+
* * CurveCurveApproachType.PerpendicularChord -- there is pair of where the rays have closest approach.
|
|
357
|
+
* The rays are skew in space.
|
|
358
|
+
* * CurveCurveApproachType.CoincidentGeometry -- the rays are the same unbounded line in space. The
|
|
359
|
+
* fractions and points are a representative single common point.
|
|
360
|
+
* * CurveCurveApproachType.Parallel -- the rays are parallel (and not coincident). The two points are
|
|
361
|
+
* at the minimum distance
|
|
321
362
|
*/
|
|
322
363
|
static closestApproachRay3dRay3d(rayA, rayB) {
|
|
323
364
|
const intersectionFractions = Point2dVector2d_1.Vector2d.create();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ray3d.js","sourceRoot":"","sources":["../../../src/geometry3d/Ray3d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\nimport { CurveCurveApproachType, CurveLocationDetail, CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\r\nimport { AxisOrder, BeJSONFunctions, Geometry } from \"../Geometry\";\r\nimport { SmallSystem } from \"../numerics/Polynomials\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\r\nimport { Vector2d } from \"./Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Range1d, Range3d } from \"./Range\";\r\nimport { Transform } from \"./Transform\";\r\nimport { XYAndZ } from \"./XYZProps\";\r\n\r\n/** A Ray3d contains\r\n * * an origin point.\r\n * * a direction vector. The vector is NOT required to be normalized.\r\n * * an optional weight (number).\r\n * @public\r\n */\r\nexport class Ray3d implements BeJSONFunctions {\r\n /** The ray origin */\r\n public origin: Point3d;\r\n /** The ray direction. This is commonly (but not always) a unit vector. */\r\n public direction: Vector3d;\r\n /** Numeric annotation. */\r\n public a?: number; // optional, e.g. weight.\r\n // constructor captures references !!!\r\n private constructor(origin: Point3d, direction: Vector3d) {\r\n this.origin = origin;\r\n this.direction = direction;\r\n this.a = undefined;\r\n }\r\n private static _create(x: number, y: number, z: number, u: number, v: number, w: number) {\r\n return new Ray3d(Point3d.create(x, y, z), Vector3d.create(u, v, w));\r\n }\r\n /** Create a ray on the x axis. */\r\n public static createXAxis(): Ray3d { return Ray3d._create(0, 0, 0, 1, 0, 0); }\r\n /** Create a ray on the y axis. */\r\n public static createYAxis(): Ray3d { return Ray3d._create(0, 0, 0, 0, 1, 0); }\r\n /** Create a ray on the z axis. */\r\n public static createZAxis(): Ray3d { return Ray3d._create(0, 0, 0, 0, 0, 1); }\r\n /** Create a ray with all zeros. */\r\n public static createZero(result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setZero();\r\n result.direction.setZero();\r\n return result;\r\n }\r\n return new Ray3d(Point3d.createZero(), Vector3d.createZero());\r\n }\r\n /** Test for nearly equal Ray3d objects.\r\n * * This tests for near equality of origin and direction -- i.e. member-by-member comparison.\r\n * * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the directions to be scaled or opposing.\r\n */\r\n public isAlmostEqual(other: Ray3d): boolean {\r\n return this.origin.isAlmostEqual(other.origin) && this.direction.isAlmostEqual(other.direction);\r\n }\r\n /** Test for nearly equal rays, allowing origin float and direction scaling.\r\n * * Use [[isAlmostEqual]] to require member-by-member comparison.\r\n */\r\n public isAlmostEqualPointSet(other: Ray3d): boolean {\r\n if (!this.direction.isParallelTo(other.direction, true))\r\n return false;\r\n // In exact math, it is not possible for one origin to be on the other ray but not vice versa. But we'll test both ways.\r\n let workPoint = this.projectPointToRay(other.origin);\r\n if (!other.origin.isAlmostEqualMetric(workPoint))\r\n return false;\r\n workPoint = other.projectPointToRay(this.origin);\r\n if (!this.origin.isAlmostEqualMetric(workPoint))\r\n return false;\r\n return true;\r\n }\r\n /** Create a ray from origin and direction. */\r\n public static create(origin: Point3d, direction: Vector3d, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.set(origin, direction);\r\n return result;\r\n }\r\n return new Ray3d(origin.clone(), direction.clone());\r\n }\r\n /**\r\n * Given a homogeneous point and its derivative components, construct a Ray3d with cartesian coordinates and derivatives.\r\n * @param weightedPoint `[x,y,z,w]` parts of weighted point.\r\n * @param weightedDerivative `[x,y,z,w]` derivatives\r\n * @param result\r\n */\r\n public static createWeightedDerivative(weightedPoint: Float64Array, weightedDerivative: Float64Array, result?: Ray3d): Ray3d | undefined {\r\n const w = weightedPoint[3];\r\n const dw = weightedDerivative[3];\r\n const x = weightedPoint[0];\r\n const y = weightedPoint[1];\r\n const z = weightedPoint[2];\r\n const dx = weightedDerivative[0] * w - weightedPoint[0] * dw;\r\n const dy = weightedDerivative[1] * w - weightedPoint[1] * dw;\r\n const dz = weightedDerivative[2] * w - weightedPoint[2] * dw;\r\n if (Geometry.isSmallMetricDistance(w))\r\n return undefined;\r\n const divW = 1.0 / w;\r\n const divWW = divW * divW;\r\n return Ray3d.createXYZUVW(x * divW, y * divW, z * divW, dx * divWW, dy * divWW, dz * divWW, result);\r\n }\r\n /** Create from coordinates of the origin and direction. */\r\n public static createXYZUVW(originX: number, originY: number, originZ: number, directionX: number, directionY: number, directionZ: number, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.getOriginRef().set(originX, originY, originZ);\r\n result.getDirectionRef().set(directionX, directionY, directionZ);\r\n return result;\r\n }\r\n return new Ray3d(Point3d.create(originX, originY, originZ), Vector3d.create(directionX, directionY, directionZ));\r\n }\r\n /** Capture origin and direction in a new Ray3d. */\r\n public static createCapture(origin: Point3d, direction: Vector3d): Ray3d {\r\n return new Ray3d(origin, direction);\r\n }\r\n /** Create from (clones of) origin, direction, and numeric weight. */\r\n public static createPointVectorNumber(origin: Point3d, direction: Vector3d, a: number, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setFrom(origin);\r\n result.direction.setFrom(direction);\r\n result.a = a;\r\n return result;\r\n }\r\n result = new Ray3d(origin.clone(), direction.clone());\r\n result.a = a;\r\n return result;\r\n }\r\n /** Create from origin and target. The direction vector is the full length (non-unit) vector from origin to target. */\r\n public static createStartEnd(origin: Point3d, target: Point3d, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setFrom(origin);\r\n result.direction.setStartEnd(origin, target);\r\n return result;\r\n }\r\n return new Ray3d(origin.clone(), Vector3d.createStartEnd(origin, target));\r\n }\r\n /** Return a reference to the ray's origin. */\r\n public getOriginRef(): Point3d { return this.origin; }\r\n /** Return a reference to the ray's direction vector. */\r\n public getDirectionRef(): Vector3d { return this.direction; }\r\n /** copy coordinates from origin and direction. */\r\n public set(origin: Point3d, direction: Vector3d): void {\r\n this.origin.setFrom(origin);\r\n this.direction.setFrom(direction);\r\n }\r\n /** Clone the ray. */\r\n public clone(result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.set(this.origin.clone(), this.direction.clone());\r\n return result;\r\n }\r\n return new Ray3d(this.origin.clone(), this.direction.clone());\r\n }\r\n /** Create a clone and return the transform of the clone. */\r\n public cloneTransformed(transform: Transform): Ray3d {\r\n return new Ray3d(transform.multiplyPoint3d(this.origin), transform.multiplyVector(this.direction));\r\n }\r\n\r\n /** Create a clone and return the inverse transform of the clone. */\r\n public cloneInverseTransformed(transform: Transform): Ray3d | undefined {\r\n const origin = transform.multiplyInversePoint3d(this.origin);\r\n const direction = transform.matrix.multiplyInverseXYZAsVector3d(this.direction.x, this.direction.y, this.direction.z);\r\n if (undefined !== origin && undefined !== direction)\r\n return new Ray3d(origin, direction);\r\n return undefined;\r\n }\r\n\r\n /** Apply a transform in place. */\r\n public transformInPlace(transform: Transform) {\r\n transform.multiplyPoint3d(this.origin, this.origin);\r\n transform.multiplyVector(this.direction, this.direction);\r\n }\r\n /** Copy data from another ray. */\r\n public setFrom(source: Ray3d): void { this.set(source.origin, source.direction); }\r\n /** * fraction 0 is the ray origin.\r\n * * fraction 1 is at the end of the direction vector when placed at the origin.\r\n * @returns Return a point at fractional position along the ray.\r\n */\r\n public fractionToPoint(fraction: number, result?: Point3d): Point3d { return this.origin.plusScaled(this.direction, fraction, result); }\r\n /** Return the dot product of the ray's direction vector with a vector from the ray origin to the space point. */\r\n public dotProductToPoint(spacePoint: Point3d): number { return this.direction.dotProductStartEnd(this.origin, spacePoint); }\r\n /**\r\n * Return the fractional coordinate (along the direction vector) of the spacePoint projected to the ray.\r\n */\r\n public pointToFraction(spacePoint: Point3d): number {\r\n return Geometry.safeDivideFraction(this.direction.dotProductStartEnd(this.origin, spacePoint), this.direction.magnitudeSquared(), 0);\r\n }\r\n /**\r\n *\r\n * Return the spacePoint projected onto the ray.\r\n */\r\n public projectPointToRay(spacePoint: Point3d): Point3d {\r\n return this.origin.plusScaled(this.direction, this.pointToFraction(spacePoint));\r\n }\r\n /** Return a transform for rigid axes\r\n * at ray origin with z in ray direction. If the direction vector is zero, axes default to identity (from createHeadsUpTriad)\r\n */\r\n public toRigidZFrame(): Transform | undefined {\r\n const axes = Matrix3d.createRigidHeadsUp(this.direction, AxisOrder.ZXY);\r\n return Transform.createOriginAndMatrix(this.origin, axes);\r\n }\r\n /**\r\n * Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d.\r\n */\r\n public setFromJSON(json?: any) {\r\n if (!json) {\r\n this.origin.set(0, 0, 0);\r\n this.direction.set(0, 0, 1);\r\n return;\r\n }\r\n this.origin.setFromJSON(json.origin);\r\n this.direction.setFromJSON(json.direction);\r\n }\r\n /**\r\n * try to scale the direction vector to a given magnitude.\r\n * @returns Returns false if ray direction is a zero vector.\r\n */\r\n public trySetDirectionMagnitudeInPlace(magnitude: number = 1.0): boolean {\r\n if (this.direction.tryNormalizeInPlace()) {\r\n this.direction.scaleInPlace(magnitude);\r\n return true;\r\n }\r\n this.direction.setZero();\r\n this.a = 0.0;\r\n return false;\r\n }\r\n /**\r\n * * If parameter `a` is clearly nonzero and the direction vector can be normalized,\r\n * * save the parameter `a` as the optional `a` member of the ray.\r\n * * normalize the ray's direction vector\r\n * * If parameter `a` is nearly zero,\r\n * * Set the `a` member to zero\r\n * * Set the ray's direction vector to zero.\r\n * @param a area to be saved.\r\n */\r\n // input a ray and \"a\" understood as an area.\r\n // if a is clearly nonzero metric squared and the vector can be normalized, install those and return true.\r\n // otherwise set ray.z to zero and zero the vector of the ray and return false.\r\n public tryNormalizeInPlaceWithAreaWeight(a: number): boolean {\r\n const tolerance = Geometry.smallMetricDistanceSquared;\r\n this.a = a;\r\n if (Math.abs(a) > tolerance && this.direction.tryNormalizeInPlace(tolerance))\r\n return true;\r\n this.direction.setZero();\r\n this.a = 0.0;\r\n return false;\r\n }\r\n /**\r\n * Convert an Angle to a JSON object.\r\n * @return {*} [origin,normal]\r\n */\r\n public toJSON(): any { return { origin: this.origin.toJSON(), direction: this.direction.toJSON() }; }\r\n /** Create a new ray from json object. See `setFromJSON` for json structure; */\r\n public static fromJSON(json?: any) {\r\n const result = Ray3d.createXAxis();\r\n result.setFromJSON(json);\r\n return result;\r\n }\r\n /** return distance from the ray to point in space */\r\n public distance(spacePoint: Point3d): number {\r\n const uu = this.direction.magnitudeSquared();\r\n const uv = this.dotProductToPoint(spacePoint);\r\n const aa = Geometry.inverseMetricDistanceSquared(uu);\r\n if (aa)\r\n return Math.sqrt(this.origin.distanceSquared(spacePoint) - uv * uv * aa);\r\n else\r\n return Math.sqrt(this.origin.distanceSquared(spacePoint));\r\n }\r\n /**\r\n * Return the intersection of the unbounded ray with a plane.\r\n * Stores the point of intersection in the result point given as a parameter,\r\n * and returns the parameter along the ray where the intersection occurs.\r\n * Returns undefined if the ray and plane are parallel or coplanar.\r\n */\r\n public intersectionWithPlane(plane: Plane3dByOriginAndUnitNormal, result?: Point3d): number | undefined {\r\n const vectorA = Vector3d.createStartEnd(plane.getOriginRef(), this.origin);\r\n const uDotN = this.direction.dotProduct(plane.getNormalRef());\r\n const nDotN = this.direction.magnitudeSquared();\r\n const aDotN = vectorA.dotProduct(plane.getNormalRef());\r\n const division = Geometry.conditionalDivideFraction(-aDotN, uDotN);\r\n if (undefined === division)\r\n return undefined;\r\n const division1 = Geometry.conditionalDivideFraction(nDotN, uDotN);\r\n if (undefined === division1)\r\n return undefined;\r\n if (result) {\r\n this.origin.plusScaled(this.direction, division, result);\r\n }\r\n return division;\r\n }\r\n\r\n /**\r\n * * Find intersection of the ray with a Range3d.\r\n * * return the range of fractions (on the ray) which are \"inside\" the range.\r\n * * Note that a range is always returned; if there is no intersection it is indicated by the test `result.sNull`\r\n */\r\n public intersectionWithRange3d(range: Range3d, result?: Range1d): Range1d {\r\n if (range.isNull)\r\n return Range1d.createNull(result);\r\n const interval = Range1d.createXX(-Geometry.largeCoordinateResult, Geometry.largeCoordinateResult, result);\r\n if (interval.clipLinearMapToInterval(this.origin.x, this.direction.x, range.low.x, range.high.x)\r\n && interval.clipLinearMapToInterval(this.origin.y, this.direction.y, range.low.y, range.high.y)\r\n && interval.clipLinearMapToInterval(this.origin.z, this.direction.z, range.low.z, range.high.z))\r\n return interval;\r\n return interval;\r\n }\r\n\r\n /** Construct a vector from `ray.origin` to target point.\r\n * * return the part of the vector that is perpendicular to `ray.direction`.\r\n * * i.e. return the shortest vector from the ray to the point.\r\n */\r\n public perpendicularPartOfVectorToTarget(targetPoint: XYAndZ, result?: Vector3d): Vector3d {\r\n const vectorV = Vector3d.createStartEnd(this.origin, targetPoint);\r\n const uu = this.direction.magnitudeSquared();\r\n const uv = this.direction.dotProductStartEnd(this.origin, targetPoint);\r\n const fraction = Geometry.safeDivideFraction(uv, uu, 0.0);\r\n return vectorV.plusScaled(this.direction, -fraction, result);\r\n }\r\n /** Determine if two rays intersect, are fully overlapped, parallel but no coincident, or skew\r\n * * Return a CurveLocationDetailPair which\r\n * * contains fraction and point on each ray.\r\n * * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of these relationships\r\n * * CurveCurveApproachType.Intersection -- the rays have a simple intersection, at fractions indicated in detailA and detailB\r\n * * CurveCurveApproachType.PerpendicularChord -- there is pair of where the rays have closest approach. The rays are skew in space.\r\n * * CurveCurveApproachType.CoincidentGeometry -- the rays are the same unbounded line in space. The fractions and points are a representative single common point.\r\n * * CurveCurveApproachType.Parallel -- the rays are parallel (and not coincident). The two points are at the minimum distance\r\n */\r\n public static closestApproachRay3dRay3d(rayA: Ray3d, rayB: Ray3d): CurveLocationDetailPair {\r\n const intersectionFractions = Vector2d.create();\r\n let fractionA, fractionB;\r\n let pointA, pointB;\r\n let pairType;\r\n if (SmallSystem.ray3dXYZUVWClosestApproachUnbounded(\r\n rayA.origin.x, rayA.origin.y, rayA.origin.z, rayA.direction.x, rayA.direction.y, rayA.direction.z,\r\n rayB.origin.x, rayB.origin.y, rayB.origin.z, rayB.direction.x, rayB.direction.y, rayB.direction.z, intersectionFractions)) {\r\n fractionA = intersectionFractions.x;\r\n fractionB = intersectionFractions.y;\r\n pointA = rayA.fractionToPoint(fractionA);\r\n pointB = rayB.fractionToPoint(fractionB);\r\n pairType = pointA.isAlmostEqualMetric(pointB) ? CurveCurveApproachType.Intersection : CurveCurveApproachType.PerpendicularChord;\r\n } else {\r\n fractionB = 0.0;\r\n fractionA = rayA.pointToFraction(rayB.origin);\r\n pointA = rayA.fractionToPoint(fractionA);\r\n pointB = rayB.fractionToPoint(fractionB);\r\n pairType = pointA.isAlmostEqualMetric(pointB) ? CurveCurveApproachType.CoincidentGeometry : CurveCurveApproachType.ParallelGeometry;\r\n }\r\n const pair = CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createRayFractionPoint(rayA, fractionA, rayA.fractionToPoint(fractionA)),\r\n CurveLocationDetail.createRayFractionPoint(rayB, fractionB, rayB.fractionToPoint(fractionB)));\r\n pair.approachType = pairType;\r\n return pair;\r\n }\r\n\r\n /**\r\n * Return a ray with `ray.origin` interpolated between pt1 and pt2 at the given fraction\r\n * and `ray.direction` set to the vector from pt1 to pt2 multiplied by the given scale factor.\r\n * @param pt1 start point of interpolation.\r\n * @param fraction fractional position between points.\r\n * @param pt2 endpoint of interpolation.\r\n * @param tangentScale scale factor to apply to the startToEnd vector.\r\n * @param result optional receiver.\r\n */\r\n public static interpolatePointAndTangent(pt1: XYAndZ, fraction: number, pt2: XYAndZ, tangentScale: number, result?: Ray3d): Ray3d {\r\n result = result ?? Ray3d.createZero();\r\n const dx = pt2.x - pt1.x;\r\n const dy = pt2.y - pt1.y;\r\n const dz = pt2.z - pt1.z;\r\n result.direction.set(tangentScale * dx, tangentScale * dy, tangentScale * dz);\r\n if (fraction <= 0.5)\r\n result.origin.set(pt1.x + fraction * dx, pt1.y + fraction * dy, pt1.z + fraction * dz);\r\n else {\r\n const t: number = fraction - 1.0;\r\n result.origin.set(pt2.x + t * dx, pt2.y + t * dy, pt2.z + t * dz);\r\n }\r\n return result;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"Ray3d.js","sourceRoot":"","sources":["../../../src/geometry3d/Ray3d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\nimport { CurveCurveApproachType, CurveLocationDetail, CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\r\nimport { AxisOrder, BeJSONFunctions, Geometry } from \"../Geometry\";\r\nimport { SmallSystem } from \"../numerics/Polynomials\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\r\nimport { Vector2d } from \"./Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Range1d, Range3d } from \"./Range\";\r\nimport { Transform } from \"./Transform\";\r\nimport { XYAndZ } from \"./XYZProps\";\r\n\r\n/**\r\n * A Ray3d contains\r\n * * an `origin` point.\r\n * * a `direction` vector (The vector is not required to be normalized).\r\n * * an optional weight (number).\r\n * @public\r\n */\r\nexport class Ray3d implements BeJSONFunctions {\r\n /** The ray origin */\r\n public origin: Point3d;\r\n /** The ray direction. This is commonly (but not always) a unit vector. */\r\n public direction: Vector3d;\r\n /** Numeric annotation. */\r\n public a?: number; // optional (e.g. weight)\r\n // constructor (captures references)\r\n private constructor(origin: Point3d, direction: Vector3d) {\r\n this.origin = origin;\r\n this.direction = direction;\r\n this.a = undefined;\r\n }\r\n private static _create(x: number, y: number, z: number, u: number, v: number, w: number) {\r\n return new Ray3d(Point3d.create(x, y, z), Vector3d.create(u, v, w));\r\n }\r\n /** Create a ray on the x axis. */\r\n public static createXAxis(): Ray3d {\r\n return Ray3d._create(0, 0, 0, 1, 0, 0);\r\n }\r\n /** Create a ray on the y axis. */\r\n public static createYAxis(): Ray3d {\r\n return Ray3d._create(0, 0, 0, 0, 1, 0);\r\n }\r\n /** Create a ray on the z axis. */\r\n public static createZAxis(): Ray3d {\r\n return Ray3d._create(0, 0, 0, 0, 0, 1);\r\n }\r\n /** Create a ray with all zeros. */\r\n public static createZero(result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setZero();\r\n result.direction.setZero();\r\n return result;\r\n }\r\n return new Ray3d(Point3d.createZero(), Vector3d.createZero());\r\n }\r\n /**\r\n * Test for nearly equal Ray3d objects.\r\n * * This tests for near equality of origin and direction -- i.e. member-by-member comparison.\r\n * * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the\r\n * directions to be scaled or opposing.\r\n */\r\n public isAlmostEqual(other: Ray3d): boolean {\r\n return this.origin.isAlmostEqual(other.origin) && this.direction.isAlmostEqual(other.direction);\r\n }\r\n /** Return the dot product of the ray's direction vector with a vector from the ray origin to the `spacePoint`. */\r\n public dotProductToPoint(spacePoint: Point3d): number {\r\n return this.direction.dotProductStartEnd(this.origin, spacePoint);\r\n }\r\n /** Return the fractional coordinate (along the direction vector) of the `spacePoint` projected to the ray. */\r\n public pointToFraction(spacePoint: Point3d): number {\r\n return Geometry.safeDivideFraction(\r\n this.dotProductToPoint(spacePoint),\r\n this.direction.magnitudeSquared(),\r\n 0\r\n );\r\n }\r\n /** Return the `spacePoint` projected onto the ray. */\r\n public projectPointToRay(spacePoint: Point3d): Point3d {\r\n /**\r\n * To project a point to the ray, we can create a vector called \"v\" from ray origin to the spacePoint and project\r\n * that vector to the ray direction vector \"r\". The projection is \"((v.r)/||r||^2) r\" where \"v.r\" is the dot\r\n * product. Note that pointToFraction returns \"(v.r)/||r||^2\".\r\n * Note: If r is the normal of a plane, then projection length \"(v.r)/||r||\" is the signed altitude of the\r\n * spacePoint with respect to the plane.\r\n */\r\n return this.origin.plusScaled(this.direction, this.pointToFraction(spacePoint));\r\n }\r\n /**\r\n * Test for nearly equal rays, allowing origin float and direction scaling.\r\n * * Use [[isAlmostEqual]] to require member-by-member comparison.\r\n */\r\n public isAlmostEqualPointSet(other: Ray3d): boolean {\r\n /**\r\n * This function tests two rays to determine if they define the same infinite lines.\r\n * So the origins can be different as long as they are on the infinite line (they can\r\n * \"float\") but the directions must be parallel or antiparallel.\r\n */\r\n if (!this.direction.isParallelTo(other.direction, true))\r\n return false;\r\n /**\r\n * In exact math, we consider a ray to have an infinite line as direction (not a finite vector).\r\n * Therefore, in exact math it is not possible for one origin to be on the other ray but not vice\r\n * versa. However, we test both ways because first check may pass due to round-off errors.\r\n */\r\n let workPoint = this.projectPointToRay(other.origin);\r\n if (!other.origin.isAlmostEqualMetric(workPoint))\r\n return false;\r\n workPoint = other.projectPointToRay(this.origin);\r\n if (!this.origin.isAlmostEqualMetric(workPoint))\r\n return false;\r\n return true;\r\n }\r\n /** Create a ray from origin and direction. */\r\n public static create(origin: Point3d, direction: Vector3d, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.set(origin, direction);\r\n return result;\r\n }\r\n return new Ray3d(origin.clone(), direction.clone());\r\n }\r\n /**\r\n * Given a homogeneous point and its derivative components, construct a Ray3d with cartesian\r\n * coordinates and derivatives.\r\n * @param weightedPoint `[x,y,z,w]` parts of weighted point.\r\n * @param weightedDerivative `[x,y,z,w]` derivatives\r\n * @param result\r\n */\r\n public static createWeightedDerivative(\r\n weightedPoint: Float64Array, weightedDerivative: Float64Array, result?: Ray3d\r\n ): Ray3d | undefined {\r\n const w = weightedPoint[3];\r\n const dw = weightedDerivative[3];\r\n const x = weightedPoint[0];\r\n const y = weightedPoint[1];\r\n const z = weightedPoint[2];\r\n const dx = weightedDerivative[0] * w - weightedPoint[0] * dw;\r\n const dy = weightedDerivative[1] * w - weightedPoint[1] * dw;\r\n const dz = weightedDerivative[2] * w - weightedPoint[2] * dw;\r\n if (Geometry.isSmallMetricDistance(w))\r\n return undefined;\r\n const divW = 1.0 / w;\r\n const divWW = divW * divW;\r\n return Ray3d.createXYZUVW(\r\n x * divW, y * divW, z * divW,\r\n dx * divWW, dy * divWW, dz * divWW,\r\n result\r\n );\r\n }\r\n /** Create from coordinates of the origin and direction. */\r\n public static createXYZUVW(\r\n originX: number, originY: number, originZ: number,\r\n directionX: number, directionY: number, directionZ: number,\r\n result?: Ray3d\r\n ): Ray3d {\r\n if (result) {\r\n result.getOriginRef().set(originX, originY, originZ);\r\n result.getDirectionRef().set(directionX, directionY, directionZ);\r\n return result;\r\n }\r\n return new Ray3d(Point3d.create(originX, originY, originZ), Vector3d.create(directionX, directionY, directionZ));\r\n }\r\n /** Capture origin and direction in a new Ray3d. */\r\n public static createCapture(origin: Point3d, direction: Vector3d): Ray3d {\r\n return new Ray3d(origin, direction);\r\n }\r\n /** Create from (clones of) origin, direction, and numeric weight. */\r\n public static createPointVectorNumber(origin: Point3d, direction: Vector3d, a: number, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setFrom(origin);\r\n result.direction.setFrom(direction);\r\n result.a = a;\r\n return result;\r\n }\r\n result = new Ray3d(origin.clone(), direction.clone());\r\n result.a = a;\r\n return result;\r\n }\r\n /** Create from origin and target. The direction vector is the full length (non-unit) vector from origin to target. */\r\n public static createStartEnd(origin: Point3d, target: Point3d, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setFrom(origin);\r\n result.direction.setStartEnd(origin, target);\r\n return result;\r\n }\r\n return new Ray3d(origin.clone(), Vector3d.createStartEnd(origin, target));\r\n }\r\n /** Return a reference to the ray's origin. */\r\n public getOriginRef(): Point3d {\r\n return this.origin;\r\n }\r\n /** Return a reference to the ray's direction vector. */\r\n public getDirectionRef(): Vector3d {\r\n return this.direction;\r\n }\r\n /** Copy coordinates from origin and direction. */\r\n public set(origin: Point3d, direction: Vector3d): void {\r\n this.origin.setFrom(origin);\r\n this.direction.setFrom(direction);\r\n }\r\n /** Clone the ray. */\r\n public clone(result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.set(this.origin.clone(), this.direction.clone());\r\n return result;\r\n }\r\n return new Ray3d(this.origin.clone(), this.direction.clone());\r\n }\r\n /** Create a clone and return the transform of the clone. */\r\n public cloneTransformed(transform: Transform): Ray3d {\r\n return new Ray3d(transform.multiplyPoint3d(this.origin), transform.multiplyVector(this.direction));\r\n }\r\n /** Create a clone and return the inverse transform of the clone. */\r\n public cloneInverseTransformed(transform: Transform): Ray3d | undefined {\r\n const origin = transform.multiplyInversePoint3d(this.origin);\r\n const direction = transform.matrix.multiplyInverseXYZAsVector3d(this.direction.x, this.direction.y, this.direction.z);\r\n if (undefined !== origin && undefined !== direction)\r\n return new Ray3d(origin, direction);\r\n return undefined;\r\n }\r\n /** Apply a transform in place. */\r\n public transformInPlace(transform: Transform) {\r\n transform.multiplyPoint3d(this.origin, this.origin);\r\n transform.multiplyVector(this.direction, this.direction);\r\n }\r\n /** Copy data from another ray. */\r\n public setFrom(source: Ray3d): void {\r\n this.set(source.origin, source.direction);\r\n }\r\n /**\r\n * Return a point at fractional position along the ray.\r\n * * fraction 0 is the ray origin.\r\n * * fraction 1 is at the end of the direction vector when placed at the origin.\r\n */\r\n public fractionToPoint(fraction: number, result?: Point3d): Point3d {\r\n return this.origin.plusScaled(this.direction, fraction, result);\r\n }\r\n /**\r\n * Return a transform for rigid axes at ray origin with z in ray direction.\r\n * * If the direction vector is zero, axes default to identity (from [[Matrix3d.createRigidHeadsUp]])\r\n */\r\n public toRigidZFrame(): Transform | undefined {\r\n const axes = Matrix3d.createRigidHeadsUp(this.direction, AxisOrder.ZXY);\r\n return Transform.createOriginAndMatrix(this.origin, axes);\r\n }\r\n /** Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d. */\r\n public setFromJSON(json?: any) {\r\n if (!json) {\r\n this.origin.set(0, 0, 0);\r\n this.direction.set(0, 0, 1);\r\n return;\r\n }\r\n this.origin.setFromJSON(json.origin);\r\n this.direction.setFromJSON(json.direction);\r\n }\r\n /**\r\n * Try to scale the direction vector to a given magnitude.\r\n * * Returns false if ray direction is a zero vector.\r\n */\r\n public trySetDirectionMagnitudeInPlace(magnitude: number = 1.0): boolean {\r\n if (this.direction.tryNormalizeInPlace()) {\r\n this.direction.scaleInPlace(magnitude);\r\n return true;\r\n }\r\n this.direction.setZero();\r\n this.a = 0.0;\r\n return false;\r\n }\r\n /**\r\n * * If parameter `a` is clearly nonzero and the direction vector can be normalized,\r\n * * save the parameter `a` as the optional `a` member of the ray.\r\n * * normalize the ray's direction vector\r\n * * If parameter `a` is nearly zero,\r\n * * Set the `a` member to zero\r\n * * Set the ray's direction vector to zero.\r\n * @param a area to be saved.\r\n */\r\n // input a ray and \"a\" understood as an area.\r\n // if a is clearly nonzero metric squared and the vector can be normalized, install those and return true.\r\n // otherwise set ray.z to zero and zero the vector of the ray and return false.\r\n public tryNormalizeInPlaceWithAreaWeight(a: number): boolean {\r\n const tolerance = Geometry.smallMetricDistanceSquared;\r\n this.a = a;\r\n if (Math.abs(a) > tolerance && this.direction.tryNormalizeInPlace(tolerance))\r\n return true;\r\n this.direction.setZero();\r\n this.a = 0.0;\r\n return false;\r\n }\r\n /**\r\n * Construct a JSON object from this Ray3d.\r\n * @return {*} [origin,normal]\r\n */\r\n public toJSON(): any {\r\n return { origin: this.origin.toJSON(), direction: this.direction.toJSON() };\r\n }\r\n /** Create a new ray from json object. See `setFromJSON` for json structure; */\r\n public static fromJSON(json?: any) {\r\n const result = Ray3d.createXAxis();\r\n result.setFromJSON(json);\r\n return result;\r\n }\r\n /** return distance from the ray to point in space */\r\n public distance(spacePoint: Point3d): number {\r\n const uu = this.direction.magnitudeSquared();\r\n const uv = this.dotProductToPoint(spacePoint);\r\n const aa = Geometry.inverseMetricDistanceSquared(uu);\r\n if (aa)\r\n return Math.sqrt(this.origin.distanceSquared(spacePoint) - uv * uv * aa);\r\n else\r\n return Math.sqrt(this.origin.distanceSquared(spacePoint));\r\n }\r\n /**\r\n * Return the intersection of the unbounded ray with a plane.\r\n * Stores the point of intersection in the result point given as a parameter,\r\n * and returns the parameter along the ray where the intersection occurs.\r\n * Returns undefined if the ray and plane are parallel or coplanar.\r\n */\r\n public intersectionWithPlane(plane: Plane3dByOriginAndUnitNormal, result?: Point3d): number | undefined {\r\n const vectorA = Vector3d.createStartEnd(plane.getOriginRef(), this.origin);\r\n const uDotN = this.direction.dotProduct(plane.getNormalRef());\r\n const nDotN = this.direction.magnitudeSquared();\r\n const aDotN = vectorA.dotProduct(plane.getNormalRef());\r\n const division = Geometry.conditionalDivideFraction(-aDotN, uDotN);\r\n if (undefined === division)\r\n return undefined;\r\n const division1 = Geometry.conditionalDivideFraction(nDotN, uDotN);\r\n if (undefined === division1)\r\n return undefined;\r\n if (result) {\r\n this.origin.plusScaled(this.direction, division, result);\r\n }\r\n return division;\r\n }\r\n /**\r\n * Find intersection of the ray with a Range3d.\r\n * * return the range of fractions (on the ray) which are \"inside\" the range.\r\n * * Note that a range is always returned; if there is no intersection it is indicated by the test `result.sNull`\r\n */\r\n public intersectionWithRange3d(range: Range3d, result?: Range1d): Range1d {\r\n if (range.isNull)\r\n return Range1d.createNull(result);\r\n const interval = Range1d.createXX(-Geometry.largeCoordinateResult, Geometry.largeCoordinateResult, result);\r\n if (interval.clipLinearMapToInterval(this.origin.x, this.direction.x, range.low.x, range.high.x)\r\n && interval.clipLinearMapToInterval(this.origin.y, this.direction.y, range.low.y, range.high.y)\r\n && interval.clipLinearMapToInterval(this.origin.z, this.direction.z, range.low.z, range.high.z))\r\n return interval;\r\n return interval;\r\n }\r\n\r\n /**\r\n * Construct a vector from `ray.origin` to target point.\r\n * * return the part of the vector that is perpendicular to `ray.direction`.\r\n * * i.e., return the shortest vector from the ray to the point.\r\n */\r\n public perpendicularPartOfVectorToTarget(targetPoint: XYAndZ, result?: Vector3d): Vector3d {\r\n const vectorV = Vector3d.createStartEnd(this.origin, targetPoint);\r\n const uu = this.direction.magnitudeSquared();\r\n const uv = this.direction.dotProductStartEnd(this.origin, targetPoint);\r\n const fraction = Geometry.safeDivideFraction(uv, uu, 0.0);\r\n return vectorV.plusScaled(this.direction, -fraction, result);\r\n }\r\n /**\r\n * Determine if two rays intersect, are fully overlapped, parallel but no coincident, or skew\r\n * * Return a CurveLocationDetailPair which\r\n * * contains fraction and point on each ray.\r\n * * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of\r\n * these relationships\r\n * * CurveCurveApproachType.Intersection -- the rays have a simple intersection, at fractions indicated\r\n * in detailA and detailB\r\n * * CurveCurveApproachType.PerpendicularChord -- there is pair of where the rays have closest approach.\r\n * The rays are skew in space.\r\n * * CurveCurveApproachType.CoincidentGeometry -- the rays are the same unbounded line in space. The\r\n * fractions and points are a representative single common point.\r\n * * CurveCurveApproachType.Parallel -- the rays are parallel (and not coincident). The two points are\r\n * at the minimum distance\r\n */\r\n public static closestApproachRay3dRay3d(rayA: Ray3d, rayB: Ray3d): CurveLocationDetailPair {\r\n const intersectionFractions = Vector2d.create();\r\n let fractionA, fractionB;\r\n let pointA, pointB;\r\n let pairType;\r\n if (SmallSystem.ray3dXYZUVWClosestApproachUnbounded(\r\n rayA.origin.x, rayA.origin.y, rayA.origin.z, rayA.direction.x, rayA.direction.y, rayA.direction.z,\r\n rayB.origin.x, rayB.origin.y, rayB.origin.z, rayB.direction.x, rayB.direction.y, rayB.direction.z, intersectionFractions)) {\r\n fractionA = intersectionFractions.x;\r\n fractionB = intersectionFractions.y;\r\n pointA = rayA.fractionToPoint(fractionA);\r\n pointB = rayB.fractionToPoint(fractionB);\r\n pairType = pointA.isAlmostEqualMetric(pointB) ? CurveCurveApproachType.Intersection : CurveCurveApproachType.PerpendicularChord;\r\n } else {\r\n fractionB = 0.0;\r\n fractionA = rayA.pointToFraction(rayB.origin);\r\n pointA = rayA.fractionToPoint(fractionA);\r\n pointB = rayB.fractionToPoint(fractionB);\r\n pairType = pointA.isAlmostEqualMetric(pointB) ? CurveCurveApproachType.CoincidentGeometry : CurveCurveApproachType.ParallelGeometry;\r\n }\r\n const pair = CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createRayFractionPoint(rayA, fractionA, rayA.fractionToPoint(fractionA)),\r\n CurveLocationDetail.createRayFractionPoint(rayB, fractionB, rayB.fractionToPoint(fractionB)));\r\n pair.approachType = pairType;\r\n return pair;\r\n }\r\n /**\r\n * Return a ray with `ray.origin` interpolated between pt1 and pt2 at the given fraction\r\n * and `ray.direction` set to the vector from pt1 to pt2 multiplied by the given scale factor.\r\n * @param pt1 start point of interpolation.\r\n * @param fraction fractional position between points.\r\n * @param pt2 endpoint of interpolation.\r\n * @param tangentScale scale factor to apply to the startToEnd vector.\r\n * @param result optional receiver.\r\n */\r\n public static interpolatePointAndTangent(pt1: XYAndZ, fraction: number, pt2: XYAndZ, tangentScale: number, result?: Ray3d): Ray3d {\r\n result = result ?? Ray3d.createZero();\r\n const dx = pt2.x - pt1.x;\r\n const dy = pt2.y - pt1.y;\r\n const dz = pt2.z - pt1.z;\r\n result.direction.set(tangentScale * dx, tangentScale * dy, tangentScale * dz);\r\n if (fraction <= 0.5)\r\n result.origin.set(pt1.x + fraction * dx, pt1.y + fraction * dy, pt1.z + fraction * dz);\r\n else {\r\n const t: number = fraction - 1.0;\r\n result.origin.set(pt2.x + t * dx, pt2.y + t * dy, pt2.z + t * dz);\r\n }\r\n return result;\r\n }\r\n}\r\n"]}
|
|
@@ -8,16 +8,17 @@ import { Point3d, Vector3d } from "./Point3dVector3d";
|
|
|
8
8
|
import { Range1d, Range3d } from "./Range";
|
|
9
9
|
import { Transform } from "./Transform";
|
|
10
10
|
import { XYAndZ } from "./XYZProps";
|
|
11
|
-
/**
|
|
12
|
-
*
|
|
13
|
-
* *
|
|
14
|
-
*
|
|
11
|
+
/**
|
|
12
|
+
* A Ray3d contains
|
|
13
|
+
* * an `origin` point.
|
|
14
|
+
* * a `direction` vector (The vector is not required to be normalized).
|
|
15
|
+
* * an optional weight (number).
|
|
15
16
|
* @public
|
|
16
17
|
*/
|
|
17
18
|
export declare class Ray3d implements BeJSONFunctions {
|
|
18
19
|
/** The ray origin */
|
|
19
20
|
origin: Point3d;
|
|
20
|
-
/** The ray direction.
|
|
21
|
+
/** The ray direction. This is commonly (but not always) a unit vector. */
|
|
21
22
|
direction: Vector3d;
|
|
22
23
|
/** Numeric annotation. */
|
|
23
24
|
a?: number;
|
|
@@ -31,19 +32,29 @@ export declare class Ray3d implements BeJSONFunctions {
|
|
|
31
32
|
static createZAxis(): Ray3d;
|
|
32
33
|
/** Create a ray with all zeros. */
|
|
33
34
|
static createZero(result?: Ray3d): Ray3d;
|
|
34
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Test for nearly equal Ray3d objects.
|
|
35
37
|
* * This tests for near equality of origin and direction -- i.e. member-by-member comparison.
|
|
36
|
-
* * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the
|
|
37
|
-
|
|
38
|
+
* * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the
|
|
39
|
+
* directions to be scaled or opposing.
|
|
40
|
+
*/
|
|
38
41
|
isAlmostEqual(other: Ray3d): boolean;
|
|
39
|
-
/**
|
|
42
|
+
/** Return the dot product of the ray's direction vector with a vector from the ray origin to the `spacePoint`. */
|
|
43
|
+
dotProductToPoint(spacePoint: Point3d): number;
|
|
44
|
+
/** Return the fractional coordinate (along the direction vector) of the `spacePoint` projected to the ray. */
|
|
45
|
+
pointToFraction(spacePoint: Point3d): number;
|
|
46
|
+
/** Return the `spacePoint` projected onto the ray. */
|
|
47
|
+
projectPointToRay(spacePoint: Point3d): Point3d;
|
|
48
|
+
/**
|
|
49
|
+
* Test for nearly equal rays, allowing origin float and direction scaling.
|
|
40
50
|
* * Use [[isAlmostEqual]] to require member-by-member comparison.
|
|
41
|
-
|
|
51
|
+
*/
|
|
42
52
|
isAlmostEqualPointSet(other: Ray3d): boolean;
|
|
43
53
|
/** Create a ray from origin and direction. */
|
|
44
54
|
static create(origin: Point3d, direction: Vector3d, result?: Ray3d): Ray3d;
|
|
45
55
|
/**
|
|
46
|
-
* Given a homogeneous point and its derivative components, construct a Ray3d with cartesian
|
|
56
|
+
* Given a homogeneous point and its derivative components, construct a Ray3d with cartesian
|
|
57
|
+
* coordinates and derivatives.
|
|
47
58
|
* @param weightedPoint `[x,y,z,w]` parts of weighted point.
|
|
48
59
|
* @param weightedDerivative `[x,y,z,w]` derivatives
|
|
49
60
|
* @param result
|
|
@@ -55,13 +66,13 @@ export declare class Ray3d implements BeJSONFunctions {
|
|
|
55
66
|
static createCapture(origin: Point3d, direction: Vector3d): Ray3d;
|
|
56
67
|
/** Create from (clones of) origin, direction, and numeric weight. */
|
|
57
68
|
static createPointVectorNumber(origin: Point3d, direction: Vector3d, a: number, result?: Ray3d): Ray3d;
|
|
58
|
-
/** Create from origin and target.
|
|
69
|
+
/** Create from origin and target. The direction vector is the full length (non-unit) vector from origin to target. */
|
|
59
70
|
static createStartEnd(origin: Point3d, target: Point3d, result?: Ray3d): Ray3d;
|
|
60
71
|
/** Return a reference to the ray's origin. */
|
|
61
72
|
getOriginRef(): Point3d;
|
|
62
73
|
/** Return a reference to the ray's direction vector. */
|
|
63
74
|
getDirectionRef(): Vector3d;
|
|
64
|
-
/**
|
|
75
|
+
/** Copy coordinates from origin and direction. */
|
|
65
76
|
set(origin: Point3d, direction: Vector3d): void;
|
|
66
77
|
/** Clone the ray. */
|
|
67
78
|
clone(result?: Ray3d): Ray3d;
|
|
@@ -73,33 +84,22 @@ export declare class Ray3d implements BeJSONFunctions {
|
|
|
73
84
|
transformInPlace(transform: Transform): void;
|
|
74
85
|
/** Copy data from another ray. */
|
|
75
86
|
setFrom(source: Ray3d): void;
|
|
76
|
-
/**
|
|
87
|
+
/**
|
|
88
|
+
* Return a point at fractional position along the ray.
|
|
89
|
+
* * fraction 0 is the ray origin.
|
|
77
90
|
* * fraction 1 is at the end of the direction vector when placed at the origin.
|
|
78
|
-
* @returns Return a point at fractional position along the ray.
|
|
79
91
|
*/
|
|
80
92
|
fractionToPoint(fraction: number, result?: Point3d): Point3d;
|
|
81
|
-
/** Return the dot product of the ray's direction vector with a vector from the ray origin to the space point. */
|
|
82
|
-
dotProductToPoint(spacePoint: Point3d): number;
|
|
83
93
|
/**
|
|
84
|
-
* Return
|
|
85
|
-
|
|
86
|
-
pointToFraction(spacePoint: Point3d): number;
|
|
87
|
-
/**
|
|
88
|
-
*
|
|
89
|
-
* Return the spacePoint projected onto the ray.
|
|
90
|
-
*/
|
|
91
|
-
projectPointToRay(spacePoint: Point3d): Point3d;
|
|
92
|
-
/** Return a transform for rigid axes
|
|
93
|
-
* at ray origin with z in ray direction. If the direction vector is zero, axes default to identity (from createHeadsUpTriad)
|
|
94
|
+
* Return a transform for rigid axes at ray origin with z in ray direction.
|
|
95
|
+
* * If the direction vector is zero, axes default to identity (from [[Matrix3d.createRigidHeadsUp]])
|
|
94
96
|
*/
|
|
95
97
|
toRigidZFrame(): Transform | undefined;
|
|
96
|
-
/**
|
|
97
|
-
* Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d.
|
|
98
|
-
*/
|
|
98
|
+
/** Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d. */
|
|
99
99
|
setFromJSON(json?: any): void;
|
|
100
100
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
101
|
+
* Try to scale the direction vector to a given magnitude.
|
|
102
|
+
* * Returns false if ray direction is a zero vector.
|
|
103
103
|
*/
|
|
104
104
|
trySetDirectionMagnitudeInPlace(magnitude?: number): boolean;
|
|
105
105
|
/**
|
|
@@ -113,11 +113,11 @@ export declare class Ray3d implements BeJSONFunctions {
|
|
|
113
113
|
*/
|
|
114
114
|
tryNormalizeInPlaceWithAreaWeight(a: number): boolean;
|
|
115
115
|
/**
|
|
116
|
-
*
|
|
116
|
+
* Construct a JSON object from this Ray3d.
|
|
117
117
|
* @return {*} [origin,normal]
|
|
118
118
|
*/
|
|
119
119
|
toJSON(): any;
|
|
120
|
-
/** Create a new ray from json object.
|
|
120
|
+
/** Create a new ray from json object. See `setFromJSON` for json structure; */
|
|
121
121
|
static fromJSON(json?: any): Ray3d;
|
|
122
122
|
/** return distance from the ray to point in space */
|
|
123
123
|
distance(spacePoint: Point3d): number;
|
|
@@ -129,24 +129,31 @@ export declare class Ray3d implements BeJSONFunctions {
|
|
|
129
129
|
*/
|
|
130
130
|
intersectionWithPlane(plane: Plane3dByOriginAndUnitNormal, result?: Point3d): number | undefined;
|
|
131
131
|
/**
|
|
132
|
-
*
|
|
132
|
+
* Find intersection of the ray with a Range3d.
|
|
133
133
|
* * return the range of fractions (on the ray) which are "inside" the range.
|
|
134
134
|
* * Note that a range is always returned; if there is no intersection it is indicated by the test `result.sNull`
|
|
135
135
|
*/
|
|
136
136
|
intersectionWithRange3d(range: Range3d, result?: Range1d): Range1d;
|
|
137
|
-
/**
|
|
137
|
+
/**
|
|
138
|
+
* Construct a vector from `ray.origin` to target point.
|
|
138
139
|
* * return the part of the vector that is perpendicular to `ray.direction`.
|
|
139
|
-
*
|
|
140
|
+
* * i.e., return the shortest vector from the ray to the point.
|
|
140
141
|
*/
|
|
141
142
|
perpendicularPartOfVectorToTarget(targetPoint: XYAndZ, result?: Vector3d): Vector3d;
|
|
142
|
-
/**
|
|
143
|
+
/**
|
|
144
|
+
* Determine if two rays intersect, are fully overlapped, parallel but no coincident, or skew
|
|
143
145
|
* * Return a CurveLocationDetailPair which
|
|
144
146
|
* * contains fraction and point on each ray.
|
|
145
|
-
* * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of
|
|
146
|
-
*
|
|
147
|
-
* * CurveCurveApproachType.
|
|
148
|
-
*
|
|
149
|
-
* * CurveCurveApproachType.
|
|
147
|
+
* * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of
|
|
148
|
+
* these relationships
|
|
149
|
+
* * CurveCurveApproachType.Intersection -- the rays have a simple intersection, at fractions indicated
|
|
150
|
+
* in detailA and detailB
|
|
151
|
+
* * CurveCurveApproachType.PerpendicularChord -- there is pair of where the rays have closest approach.
|
|
152
|
+
* The rays are skew in space.
|
|
153
|
+
* * CurveCurveApproachType.CoincidentGeometry -- the rays are the same unbounded line in space. The
|
|
154
|
+
* fractions and points are a representative single common point.
|
|
155
|
+
* * CurveCurveApproachType.Parallel -- the rays are parallel (and not coincident). The two points are
|
|
156
|
+
* at the minimum distance
|
|
150
157
|
*/
|
|
151
158
|
static closestApproachRay3dRay3d(rayA: Ray3d, rayB: Ray3d): CurveLocationDetailPair;
|
|
152
159
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ray3d.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Ray3d.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,OAAO,EAA+C,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACpH,OAAO,EAAa,eAAe,EAAY,MAAM,aAAa,CAAC;AAGnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC
|
|
1
|
+
{"version":3,"file":"Ray3d.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Ray3d.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,14 +13,15 @@ import { Vector2d } from "./Point2dVector2d";
|
|
|
13
13
|
import { Point3d, Vector3d } from "./Point3dVector3d";
|
|
14
14
|
import { Range1d } from "./Range";
|
|
15
15
|
import { Transform } from "./Transform";
|
|
16
|
-
/**
|
|
17
|
-
*
|
|
18
|
-
* *
|
|
19
|
-
*
|
|
16
|
+
/**
|
|
17
|
+
* A Ray3d contains
|
|
18
|
+
* * an `origin` point.
|
|
19
|
+
* * a `direction` vector (The vector is not required to be normalized).
|
|
20
|
+
* * an optional weight (number).
|
|
20
21
|
* @public
|
|
21
22
|
*/
|
|
22
23
|
export class Ray3d {
|
|
23
|
-
// constructor captures references
|
|
24
|
+
// constructor (captures references)
|
|
24
25
|
constructor(origin, direction) {
|
|
25
26
|
this.origin = origin;
|
|
26
27
|
this.direction = direction;
|
|
@@ -30,11 +31,17 @@ export class Ray3d {
|
|
|
30
31
|
return new Ray3d(Point3d.create(x, y, z), Vector3d.create(u, v, w));
|
|
31
32
|
}
|
|
32
33
|
/** Create a ray on the x axis. */
|
|
33
|
-
static createXAxis() {
|
|
34
|
+
static createXAxis() {
|
|
35
|
+
return Ray3d._create(0, 0, 0, 1, 0, 0);
|
|
36
|
+
}
|
|
34
37
|
/** Create a ray on the y axis. */
|
|
35
|
-
static createYAxis() {
|
|
38
|
+
static createYAxis() {
|
|
39
|
+
return Ray3d._create(0, 0, 0, 0, 1, 0);
|
|
40
|
+
}
|
|
36
41
|
/** Create a ray on the z axis. */
|
|
37
|
-
static createZAxis() {
|
|
42
|
+
static createZAxis() {
|
|
43
|
+
return Ray3d._create(0, 0, 0, 0, 0, 1);
|
|
44
|
+
}
|
|
38
45
|
/** Create a ray with all zeros. */
|
|
39
46
|
static createZero(result) {
|
|
40
47
|
if (result) {
|
|
@@ -44,20 +51,51 @@ export class Ray3d {
|
|
|
44
51
|
}
|
|
45
52
|
return new Ray3d(Point3d.createZero(), Vector3d.createZero());
|
|
46
53
|
}
|
|
47
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* Test for nearly equal Ray3d objects.
|
|
48
56
|
* * This tests for near equality of origin and direction -- i.e. member-by-member comparison.
|
|
49
|
-
* * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the
|
|
50
|
-
|
|
57
|
+
* * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the
|
|
58
|
+
* directions to be scaled or opposing.
|
|
59
|
+
*/
|
|
51
60
|
isAlmostEqual(other) {
|
|
52
61
|
return this.origin.isAlmostEqual(other.origin) && this.direction.isAlmostEqual(other.direction);
|
|
53
62
|
}
|
|
54
|
-
/**
|
|
63
|
+
/** Return the dot product of the ray's direction vector with a vector from the ray origin to the `spacePoint`. */
|
|
64
|
+
dotProductToPoint(spacePoint) {
|
|
65
|
+
return this.direction.dotProductStartEnd(this.origin, spacePoint);
|
|
66
|
+
}
|
|
67
|
+
/** Return the fractional coordinate (along the direction vector) of the `spacePoint` projected to the ray. */
|
|
68
|
+
pointToFraction(spacePoint) {
|
|
69
|
+
return Geometry.safeDivideFraction(this.dotProductToPoint(spacePoint), this.direction.magnitudeSquared(), 0);
|
|
70
|
+
}
|
|
71
|
+
/** Return the `spacePoint` projected onto the ray. */
|
|
72
|
+
projectPointToRay(spacePoint) {
|
|
73
|
+
/**
|
|
74
|
+
* To project a point to the ray, we can create a vector called "v" from ray origin to the spacePoint and project
|
|
75
|
+
* that vector to the ray direction vector "r". The projection is "((v.r)/||r||^2) r" where "v.r" is the dot
|
|
76
|
+
* product. Note that pointToFraction returns "(v.r)/||r||^2".
|
|
77
|
+
* Note: If r is the normal of a plane, then projection length "(v.r)/||r||" is the signed altitude of the
|
|
78
|
+
* spacePoint with respect to the plane.
|
|
79
|
+
*/
|
|
80
|
+
return this.origin.plusScaled(this.direction, this.pointToFraction(spacePoint));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Test for nearly equal rays, allowing origin float and direction scaling.
|
|
55
84
|
* * Use [[isAlmostEqual]] to require member-by-member comparison.
|
|
56
|
-
|
|
85
|
+
*/
|
|
57
86
|
isAlmostEqualPointSet(other) {
|
|
87
|
+
/**
|
|
88
|
+
* This function tests two rays to determine if they define the same infinite lines.
|
|
89
|
+
* So the origins can be different as long as they are on the infinite line (they can
|
|
90
|
+
* "float") but the directions must be parallel or antiparallel.
|
|
91
|
+
*/
|
|
58
92
|
if (!this.direction.isParallelTo(other.direction, true))
|
|
59
93
|
return false;
|
|
60
|
-
|
|
94
|
+
/**
|
|
95
|
+
* In exact math, we consider a ray to have an infinite line as direction (not a finite vector).
|
|
96
|
+
* Therefore, in exact math it is not possible for one origin to be on the other ray but not vice
|
|
97
|
+
* versa. However, we test both ways because first check may pass due to round-off errors.
|
|
98
|
+
*/
|
|
61
99
|
let workPoint = this.projectPointToRay(other.origin);
|
|
62
100
|
if (!other.origin.isAlmostEqualMetric(workPoint))
|
|
63
101
|
return false;
|
|
@@ -75,7 +113,8 @@ export class Ray3d {
|
|
|
75
113
|
return new Ray3d(origin.clone(), direction.clone());
|
|
76
114
|
}
|
|
77
115
|
/**
|
|
78
|
-
* Given a homogeneous point and its derivative components, construct a Ray3d with cartesian
|
|
116
|
+
* Given a homogeneous point and its derivative components, construct a Ray3d with cartesian
|
|
117
|
+
* coordinates and derivatives.
|
|
79
118
|
* @param weightedPoint `[x,y,z,w]` parts of weighted point.
|
|
80
119
|
* @param weightedDerivative `[x,y,z,w]` derivatives
|
|
81
120
|
* @param result
|
|
@@ -120,7 +159,7 @@ export class Ray3d {
|
|
|
120
159
|
result.a = a;
|
|
121
160
|
return result;
|
|
122
161
|
}
|
|
123
|
-
/** Create from origin and target.
|
|
162
|
+
/** Create from origin and target. The direction vector is the full length (non-unit) vector from origin to target. */
|
|
124
163
|
static createStartEnd(origin, target, result) {
|
|
125
164
|
if (result) {
|
|
126
165
|
result.origin.setFrom(origin);
|
|
@@ -130,10 +169,14 @@ export class Ray3d {
|
|
|
130
169
|
return new Ray3d(origin.clone(), Vector3d.createStartEnd(origin, target));
|
|
131
170
|
}
|
|
132
171
|
/** Return a reference to the ray's origin. */
|
|
133
|
-
getOriginRef() {
|
|
172
|
+
getOriginRef() {
|
|
173
|
+
return this.origin;
|
|
174
|
+
}
|
|
134
175
|
/** Return a reference to the ray's direction vector. */
|
|
135
|
-
getDirectionRef() {
|
|
136
|
-
|
|
176
|
+
getDirectionRef() {
|
|
177
|
+
return this.direction;
|
|
178
|
+
}
|
|
179
|
+
/** Copy coordinates from origin and direction. */
|
|
137
180
|
set(origin, direction) {
|
|
138
181
|
this.origin.setFrom(origin);
|
|
139
182
|
this.direction.setFrom(direction);
|
|
@@ -164,37 +207,26 @@ export class Ray3d {
|
|
|
164
207
|
transform.multiplyVector(this.direction, this.direction);
|
|
165
208
|
}
|
|
166
209
|
/** Copy data from another ray. */
|
|
167
|
-
setFrom(source) {
|
|
168
|
-
|
|
169
|
-
* * fraction 1 is at the end of the direction vector when placed at the origin.
|
|
170
|
-
* @returns Return a point at fractional position along the ray.
|
|
171
|
-
*/
|
|
172
|
-
fractionToPoint(fraction, result) { return this.origin.plusScaled(this.direction, fraction, result); }
|
|
173
|
-
/** Return the dot product of the ray's direction vector with a vector from the ray origin to the space point. */
|
|
174
|
-
dotProductToPoint(spacePoint) { return this.direction.dotProductStartEnd(this.origin, spacePoint); }
|
|
175
|
-
/**
|
|
176
|
-
* Return the fractional coordinate (along the direction vector) of the spacePoint projected to the ray.
|
|
177
|
-
*/
|
|
178
|
-
pointToFraction(spacePoint) {
|
|
179
|
-
return Geometry.safeDivideFraction(this.direction.dotProductStartEnd(this.origin, spacePoint), this.direction.magnitudeSquared(), 0);
|
|
210
|
+
setFrom(source) {
|
|
211
|
+
this.set(source.origin, source.direction);
|
|
180
212
|
}
|
|
181
213
|
/**
|
|
182
|
-
*
|
|
183
|
-
*
|
|
214
|
+
* Return a point at fractional position along the ray.
|
|
215
|
+
* * fraction 0 is the ray origin.
|
|
216
|
+
* * fraction 1 is at the end of the direction vector when placed at the origin.
|
|
184
217
|
*/
|
|
185
|
-
|
|
186
|
-
return this.origin.plusScaled(this.direction,
|
|
218
|
+
fractionToPoint(fraction, result) {
|
|
219
|
+
return this.origin.plusScaled(this.direction, fraction, result);
|
|
187
220
|
}
|
|
188
|
-
/**
|
|
189
|
-
* at ray origin with z in ray direction.
|
|
221
|
+
/**
|
|
222
|
+
* Return a transform for rigid axes at ray origin with z in ray direction.
|
|
223
|
+
* * If the direction vector is zero, axes default to identity (from [[Matrix3d.createRigidHeadsUp]])
|
|
190
224
|
*/
|
|
191
225
|
toRigidZFrame() {
|
|
192
226
|
const axes = Matrix3d.createRigidHeadsUp(this.direction, AxisOrder.ZXY);
|
|
193
227
|
return Transform.createOriginAndMatrix(this.origin, axes);
|
|
194
228
|
}
|
|
195
|
-
/**
|
|
196
|
-
* Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d.
|
|
197
|
-
*/
|
|
229
|
+
/** Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d. */
|
|
198
230
|
setFromJSON(json) {
|
|
199
231
|
if (!json) {
|
|
200
232
|
this.origin.set(0, 0, 0);
|
|
@@ -205,8 +237,8 @@ export class Ray3d {
|
|
|
205
237
|
this.direction.setFromJSON(json.direction);
|
|
206
238
|
}
|
|
207
239
|
/**
|
|
208
|
-
*
|
|
209
|
-
*
|
|
240
|
+
* Try to scale the direction vector to a given magnitude.
|
|
241
|
+
* * Returns false if ray direction is a zero vector.
|
|
210
242
|
*/
|
|
211
243
|
trySetDirectionMagnitudeInPlace(magnitude = 1.0) {
|
|
212
244
|
if (this.direction.tryNormalizeInPlace()) {
|
|
@@ -239,11 +271,13 @@ export class Ray3d {
|
|
|
239
271
|
return false;
|
|
240
272
|
}
|
|
241
273
|
/**
|
|
242
|
-
*
|
|
274
|
+
* Construct a JSON object from this Ray3d.
|
|
243
275
|
* @return {*} [origin,normal]
|
|
244
276
|
*/
|
|
245
|
-
toJSON() {
|
|
246
|
-
|
|
277
|
+
toJSON() {
|
|
278
|
+
return { origin: this.origin.toJSON(), direction: this.direction.toJSON() };
|
|
279
|
+
}
|
|
280
|
+
/** Create a new ray from json object. See `setFromJSON` for json structure; */
|
|
247
281
|
static fromJSON(json) {
|
|
248
282
|
const result = Ray3d.createXAxis();
|
|
249
283
|
result.setFromJSON(json);
|
|
@@ -282,7 +316,7 @@ export class Ray3d {
|
|
|
282
316
|
return division;
|
|
283
317
|
}
|
|
284
318
|
/**
|
|
285
|
-
*
|
|
319
|
+
* Find intersection of the ray with a Range3d.
|
|
286
320
|
* * return the range of fractions (on the ray) which are "inside" the range.
|
|
287
321
|
* * Note that a range is always returned; if there is no intersection it is indicated by the test `result.sNull`
|
|
288
322
|
*/
|
|
@@ -296,9 +330,10 @@ export class Ray3d {
|
|
|
296
330
|
return interval;
|
|
297
331
|
return interval;
|
|
298
332
|
}
|
|
299
|
-
/**
|
|
333
|
+
/**
|
|
334
|
+
* Construct a vector from `ray.origin` to target point.
|
|
300
335
|
* * return the part of the vector that is perpendicular to `ray.direction`.
|
|
301
|
-
*
|
|
336
|
+
* * i.e., return the shortest vector from the ray to the point.
|
|
302
337
|
*/
|
|
303
338
|
perpendicularPartOfVectorToTarget(targetPoint, result) {
|
|
304
339
|
const vectorV = Vector3d.createStartEnd(this.origin, targetPoint);
|
|
@@ -307,14 +342,20 @@ export class Ray3d {
|
|
|
307
342
|
const fraction = Geometry.safeDivideFraction(uv, uu, 0.0);
|
|
308
343
|
return vectorV.plusScaled(this.direction, -fraction, result);
|
|
309
344
|
}
|
|
310
|
-
/**
|
|
345
|
+
/**
|
|
346
|
+
* Determine if two rays intersect, are fully overlapped, parallel but no coincident, or skew
|
|
311
347
|
* * Return a CurveLocationDetailPair which
|
|
312
348
|
* * contains fraction and point on each ray.
|
|
313
|
-
* * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of
|
|
314
|
-
*
|
|
315
|
-
* * CurveCurveApproachType.
|
|
316
|
-
*
|
|
317
|
-
* * CurveCurveApproachType.
|
|
349
|
+
* * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of
|
|
350
|
+
* these relationships
|
|
351
|
+
* * CurveCurveApproachType.Intersection -- the rays have a simple intersection, at fractions indicated
|
|
352
|
+
* in detailA and detailB
|
|
353
|
+
* * CurveCurveApproachType.PerpendicularChord -- there is pair of where the rays have closest approach.
|
|
354
|
+
* The rays are skew in space.
|
|
355
|
+
* * CurveCurveApproachType.CoincidentGeometry -- the rays are the same unbounded line in space. The
|
|
356
|
+
* fractions and points are a representative single common point.
|
|
357
|
+
* * CurveCurveApproachType.Parallel -- the rays are parallel (and not coincident). The two points are
|
|
358
|
+
* at the minimum distance
|
|
318
359
|
*/
|
|
319
360
|
static closestApproachRay3dRay3d(rayA, rayB) {
|
|
320
361
|
const intersectionFractions = Vector2d.create();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ray3d.js","sourceRoot":"","sources":["../../../src/geometry3d/Ray3d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\nimport { CurveCurveApproachType, CurveLocationDetail, CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\r\nimport { AxisOrder, BeJSONFunctions, Geometry } from \"../Geometry\";\r\nimport { SmallSystem } from \"../numerics/Polynomials\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\r\nimport { Vector2d } from \"./Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Range1d, Range3d } from \"./Range\";\r\nimport { Transform } from \"./Transform\";\r\nimport { XYAndZ } from \"./XYZProps\";\r\n\r\n/** A Ray3d contains\r\n * * an origin point.\r\n * * a direction vector. The vector is NOT required to be normalized.\r\n * * an optional weight (number).\r\n * @public\r\n */\r\nexport class Ray3d implements BeJSONFunctions {\r\n /** The ray origin */\r\n public origin: Point3d;\r\n /** The ray direction. This is commonly (but not always) a unit vector. */\r\n public direction: Vector3d;\r\n /** Numeric annotation. */\r\n public a?: number; // optional, e.g. weight.\r\n // constructor captures references !!!\r\n private constructor(origin: Point3d, direction: Vector3d) {\r\n this.origin = origin;\r\n this.direction = direction;\r\n this.a = undefined;\r\n }\r\n private static _create(x: number, y: number, z: number, u: number, v: number, w: number) {\r\n return new Ray3d(Point3d.create(x, y, z), Vector3d.create(u, v, w));\r\n }\r\n /** Create a ray on the x axis. */\r\n public static createXAxis(): Ray3d { return Ray3d._create(0, 0, 0, 1, 0, 0); }\r\n /** Create a ray on the y axis. */\r\n public static createYAxis(): Ray3d { return Ray3d._create(0, 0, 0, 0, 1, 0); }\r\n /** Create a ray on the z axis. */\r\n public static createZAxis(): Ray3d { return Ray3d._create(0, 0, 0, 0, 0, 1); }\r\n /** Create a ray with all zeros. */\r\n public static createZero(result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setZero();\r\n result.direction.setZero();\r\n return result;\r\n }\r\n return new Ray3d(Point3d.createZero(), Vector3d.createZero());\r\n }\r\n /** Test for nearly equal Ray3d objects.\r\n * * This tests for near equality of origin and direction -- i.e. member-by-member comparison.\r\n * * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the directions to be scaled or opposing.\r\n */\r\n public isAlmostEqual(other: Ray3d): boolean {\r\n return this.origin.isAlmostEqual(other.origin) && this.direction.isAlmostEqual(other.direction);\r\n }\r\n /** Test for nearly equal rays, allowing origin float and direction scaling.\r\n * * Use [[isAlmostEqual]] to require member-by-member comparison.\r\n */\r\n public isAlmostEqualPointSet(other: Ray3d): boolean {\r\n if (!this.direction.isParallelTo(other.direction, true))\r\n return false;\r\n // In exact math, it is not possible for one origin to be on the other ray but not vice versa. But we'll test both ways.\r\n let workPoint = this.projectPointToRay(other.origin);\r\n if (!other.origin.isAlmostEqualMetric(workPoint))\r\n return false;\r\n workPoint = other.projectPointToRay(this.origin);\r\n if (!this.origin.isAlmostEqualMetric(workPoint))\r\n return false;\r\n return true;\r\n }\r\n /** Create a ray from origin and direction. */\r\n public static create(origin: Point3d, direction: Vector3d, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.set(origin, direction);\r\n return result;\r\n }\r\n return new Ray3d(origin.clone(), direction.clone());\r\n }\r\n /**\r\n * Given a homogeneous point and its derivative components, construct a Ray3d with cartesian coordinates and derivatives.\r\n * @param weightedPoint `[x,y,z,w]` parts of weighted point.\r\n * @param weightedDerivative `[x,y,z,w]` derivatives\r\n * @param result\r\n */\r\n public static createWeightedDerivative(weightedPoint: Float64Array, weightedDerivative: Float64Array, result?: Ray3d): Ray3d | undefined {\r\n const w = weightedPoint[3];\r\n const dw = weightedDerivative[3];\r\n const x = weightedPoint[0];\r\n const y = weightedPoint[1];\r\n const z = weightedPoint[2];\r\n const dx = weightedDerivative[0] * w - weightedPoint[0] * dw;\r\n const dy = weightedDerivative[1] * w - weightedPoint[1] * dw;\r\n const dz = weightedDerivative[2] * w - weightedPoint[2] * dw;\r\n if (Geometry.isSmallMetricDistance(w))\r\n return undefined;\r\n const divW = 1.0 / w;\r\n const divWW = divW * divW;\r\n return Ray3d.createXYZUVW(x * divW, y * divW, z * divW, dx * divWW, dy * divWW, dz * divWW, result);\r\n }\r\n /** Create from coordinates of the origin and direction. */\r\n public static createXYZUVW(originX: number, originY: number, originZ: number, directionX: number, directionY: number, directionZ: number, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.getOriginRef().set(originX, originY, originZ);\r\n result.getDirectionRef().set(directionX, directionY, directionZ);\r\n return result;\r\n }\r\n return new Ray3d(Point3d.create(originX, originY, originZ), Vector3d.create(directionX, directionY, directionZ));\r\n }\r\n /** Capture origin and direction in a new Ray3d. */\r\n public static createCapture(origin: Point3d, direction: Vector3d): Ray3d {\r\n return new Ray3d(origin, direction);\r\n }\r\n /** Create from (clones of) origin, direction, and numeric weight. */\r\n public static createPointVectorNumber(origin: Point3d, direction: Vector3d, a: number, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setFrom(origin);\r\n result.direction.setFrom(direction);\r\n result.a = a;\r\n return result;\r\n }\r\n result = new Ray3d(origin.clone(), direction.clone());\r\n result.a = a;\r\n return result;\r\n }\r\n /** Create from origin and target. The direction vector is the full length (non-unit) vector from origin to target. */\r\n public static createStartEnd(origin: Point3d, target: Point3d, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setFrom(origin);\r\n result.direction.setStartEnd(origin, target);\r\n return result;\r\n }\r\n return new Ray3d(origin.clone(), Vector3d.createStartEnd(origin, target));\r\n }\r\n /** Return a reference to the ray's origin. */\r\n public getOriginRef(): Point3d { return this.origin; }\r\n /** Return a reference to the ray's direction vector. */\r\n public getDirectionRef(): Vector3d { return this.direction; }\r\n /** copy coordinates from origin and direction. */\r\n public set(origin: Point3d, direction: Vector3d): void {\r\n this.origin.setFrom(origin);\r\n this.direction.setFrom(direction);\r\n }\r\n /** Clone the ray. */\r\n public clone(result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.set(this.origin.clone(), this.direction.clone());\r\n return result;\r\n }\r\n return new Ray3d(this.origin.clone(), this.direction.clone());\r\n }\r\n /** Create a clone and return the transform of the clone. */\r\n public cloneTransformed(transform: Transform): Ray3d {\r\n return new Ray3d(transform.multiplyPoint3d(this.origin), transform.multiplyVector(this.direction));\r\n }\r\n\r\n /** Create a clone and return the inverse transform of the clone. */\r\n public cloneInverseTransformed(transform: Transform): Ray3d | undefined {\r\n const origin = transform.multiplyInversePoint3d(this.origin);\r\n const direction = transform.matrix.multiplyInverseXYZAsVector3d(this.direction.x, this.direction.y, this.direction.z);\r\n if (undefined !== origin && undefined !== direction)\r\n return new Ray3d(origin, direction);\r\n return undefined;\r\n }\r\n\r\n /** Apply a transform in place. */\r\n public transformInPlace(transform: Transform) {\r\n transform.multiplyPoint3d(this.origin, this.origin);\r\n transform.multiplyVector(this.direction, this.direction);\r\n }\r\n /** Copy data from another ray. */\r\n public setFrom(source: Ray3d): void { this.set(source.origin, source.direction); }\r\n /** * fraction 0 is the ray origin.\r\n * * fraction 1 is at the end of the direction vector when placed at the origin.\r\n * @returns Return a point at fractional position along the ray.\r\n */\r\n public fractionToPoint(fraction: number, result?: Point3d): Point3d { return this.origin.plusScaled(this.direction, fraction, result); }\r\n /** Return the dot product of the ray's direction vector with a vector from the ray origin to the space point. */\r\n public dotProductToPoint(spacePoint: Point3d): number { return this.direction.dotProductStartEnd(this.origin, spacePoint); }\r\n /**\r\n * Return the fractional coordinate (along the direction vector) of the spacePoint projected to the ray.\r\n */\r\n public pointToFraction(spacePoint: Point3d): number {\r\n return Geometry.safeDivideFraction(this.direction.dotProductStartEnd(this.origin, spacePoint), this.direction.magnitudeSquared(), 0);\r\n }\r\n /**\r\n *\r\n * Return the spacePoint projected onto the ray.\r\n */\r\n public projectPointToRay(spacePoint: Point3d): Point3d {\r\n return this.origin.plusScaled(this.direction, this.pointToFraction(spacePoint));\r\n }\r\n /** Return a transform for rigid axes\r\n * at ray origin with z in ray direction. If the direction vector is zero, axes default to identity (from createHeadsUpTriad)\r\n */\r\n public toRigidZFrame(): Transform | undefined {\r\n const axes = Matrix3d.createRigidHeadsUp(this.direction, AxisOrder.ZXY);\r\n return Transform.createOriginAndMatrix(this.origin, axes);\r\n }\r\n /**\r\n * Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d.\r\n */\r\n public setFromJSON(json?: any) {\r\n if (!json) {\r\n this.origin.set(0, 0, 0);\r\n this.direction.set(0, 0, 1);\r\n return;\r\n }\r\n this.origin.setFromJSON(json.origin);\r\n this.direction.setFromJSON(json.direction);\r\n }\r\n /**\r\n * try to scale the direction vector to a given magnitude.\r\n * @returns Returns false if ray direction is a zero vector.\r\n */\r\n public trySetDirectionMagnitudeInPlace(magnitude: number = 1.0): boolean {\r\n if (this.direction.tryNormalizeInPlace()) {\r\n this.direction.scaleInPlace(magnitude);\r\n return true;\r\n }\r\n this.direction.setZero();\r\n this.a = 0.0;\r\n return false;\r\n }\r\n /**\r\n * * If parameter `a` is clearly nonzero and the direction vector can be normalized,\r\n * * save the parameter `a` as the optional `a` member of the ray.\r\n * * normalize the ray's direction vector\r\n * * If parameter `a` is nearly zero,\r\n * * Set the `a` member to zero\r\n * * Set the ray's direction vector to zero.\r\n * @param a area to be saved.\r\n */\r\n // input a ray and \"a\" understood as an area.\r\n // if a is clearly nonzero metric squared and the vector can be normalized, install those and return true.\r\n // otherwise set ray.z to zero and zero the vector of the ray and return false.\r\n public tryNormalizeInPlaceWithAreaWeight(a: number): boolean {\r\n const tolerance = Geometry.smallMetricDistanceSquared;\r\n this.a = a;\r\n if (Math.abs(a) > tolerance && this.direction.tryNormalizeInPlace(tolerance))\r\n return true;\r\n this.direction.setZero();\r\n this.a = 0.0;\r\n return false;\r\n }\r\n /**\r\n * Convert an Angle to a JSON object.\r\n * @return {*} [origin,normal]\r\n */\r\n public toJSON(): any { return { origin: this.origin.toJSON(), direction: this.direction.toJSON() }; }\r\n /** Create a new ray from json object. See `setFromJSON` for json structure; */\r\n public static fromJSON(json?: any) {\r\n const result = Ray3d.createXAxis();\r\n result.setFromJSON(json);\r\n return result;\r\n }\r\n /** return distance from the ray to point in space */\r\n public distance(spacePoint: Point3d): number {\r\n const uu = this.direction.magnitudeSquared();\r\n const uv = this.dotProductToPoint(spacePoint);\r\n const aa = Geometry.inverseMetricDistanceSquared(uu);\r\n if (aa)\r\n return Math.sqrt(this.origin.distanceSquared(spacePoint) - uv * uv * aa);\r\n else\r\n return Math.sqrt(this.origin.distanceSquared(spacePoint));\r\n }\r\n /**\r\n * Return the intersection of the unbounded ray with a plane.\r\n * Stores the point of intersection in the result point given as a parameter,\r\n * and returns the parameter along the ray where the intersection occurs.\r\n * Returns undefined if the ray and plane are parallel or coplanar.\r\n */\r\n public intersectionWithPlane(plane: Plane3dByOriginAndUnitNormal, result?: Point3d): number | undefined {\r\n const vectorA = Vector3d.createStartEnd(plane.getOriginRef(), this.origin);\r\n const uDotN = this.direction.dotProduct(plane.getNormalRef());\r\n const nDotN = this.direction.magnitudeSquared();\r\n const aDotN = vectorA.dotProduct(plane.getNormalRef());\r\n const division = Geometry.conditionalDivideFraction(-aDotN, uDotN);\r\n if (undefined === division)\r\n return undefined;\r\n const division1 = Geometry.conditionalDivideFraction(nDotN, uDotN);\r\n if (undefined === division1)\r\n return undefined;\r\n if (result) {\r\n this.origin.plusScaled(this.direction, division, result);\r\n }\r\n return division;\r\n }\r\n\r\n /**\r\n * * Find intersection of the ray with a Range3d.\r\n * * return the range of fractions (on the ray) which are \"inside\" the range.\r\n * * Note that a range is always returned; if there is no intersection it is indicated by the test `result.sNull`\r\n */\r\n public intersectionWithRange3d(range: Range3d, result?: Range1d): Range1d {\r\n if (range.isNull)\r\n return Range1d.createNull(result);\r\n const interval = Range1d.createXX(-Geometry.largeCoordinateResult, Geometry.largeCoordinateResult, result);\r\n if (interval.clipLinearMapToInterval(this.origin.x, this.direction.x, range.low.x, range.high.x)\r\n && interval.clipLinearMapToInterval(this.origin.y, this.direction.y, range.low.y, range.high.y)\r\n && interval.clipLinearMapToInterval(this.origin.z, this.direction.z, range.low.z, range.high.z))\r\n return interval;\r\n return interval;\r\n }\r\n\r\n /** Construct a vector from `ray.origin` to target point.\r\n * * return the part of the vector that is perpendicular to `ray.direction`.\r\n * * i.e. return the shortest vector from the ray to the point.\r\n */\r\n public perpendicularPartOfVectorToTarget(targetPoint: XYAndZ, result?: Vector3d): Vector3d {\r\n const vectorV = Vector3d.createStartEnd(this.origin, targetPoint);\r\n const uu = this.direction.magnitudeSquared();\r\n const uv = this.direction.dotProductStartEnd(this.origin, targetPoint);\r\n const fraction = Geometry.safeDivideFraction(uv, uu, 0.0);\r\n return vectorV.plusScaled(this.direction, -fraction, result);\r\n }\r\n /** Determine if two rays intersect, are fully overlapped, parallel but no coincident, or skew\r\n * * Return a CurveLocationDetailPair which\r\n * * contains fraction and point on each ray.\r\n * * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of these relationships\r\n * * CurveCurveApproachType.Intersection -- the rays have a simple intersection, at fractions indicated in detailA and detailB\r\n * * CurveCurveApproachType.PerpendicularChord -- there is pair of where the rays have closest approach. The rays are skew in space.\r\n * * CurveCurveApproachType.CoincidentGeometry -- the rays are the same unbounded line in space. The fractions and points are a representative single common point.\r\n * * CurveCurveApproachType.Parallel -- the rays are parallel (and not coincident). The two points are at the minimum distance\r\n */\r\n public static closestApproachRay3dRay3d(rayA: Ray3d, rayB: Ray3d): CurveLocationDetailPair {\r\n const intersectionFractions = Vector2d.create();\r\n let fractionA, fractionB;\r\n let pointA, pointB;\r\n let pairType;\r\n if (SmallSystem.ray3dXYZUVWClosestApproachUnbounded(\r\n rayA.origin.x, rayA.origin.y, rayA.origin.z, rayA.direction.x, rayA.direction.y, rayA.direction.z,\r\n rayB.origin.x, rayB.origin.y, rayB.origin.z, rayB.direction.x, rayB.direction.y, rayB.direction.z, intersectionFractions)) {\r\n fractionA = intersectionFractions.x;\r\n fractionB = intersectionFractions.y;\r\n pointA = rayA.fractionToPoint(fractionA);\r\n pointB = rayB.fractionToPoint(fractionB);\r\n pairType = pointA.isAlmostEqualMetric(pointB) ? CurveCurveApproachType.Intersection : CurveCurveApproachType.PerpendicularChord;\r\n } else {\r\n fractionB = 0.0;\r\n fractionA = rayA.pointToFraction(rayB.origin);\r\n pointA = rayA.fractionToPoint(fractionA);\r\n pointB = rayB.fractionToPoint(fractionB);\r\n pairType = pointA.isAlmostEqualMetric(pointB) ? CurveCurveApproachType.CoincidentGeometry : CurveCurveApproachType.ParallelGeometry;\r\n }\r\n const pair = CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createRayFractionPoint(rayA, fractionA, rayA.fractionToPoint(fractionA)),\r\n CurveLocationDetail.createRayFractionPoint(rayB, fractionB, rayB.fractionToPoint(fractionB)));\r\n pair.approachType = pairType;\r\n return pair;\r\n }\r\n\r\n /**\r\n * Return a ray with `ray.origin` interpolated between pt1 and pt2 at the given fraction\r\n * and `ray.direction` set to the vector from pt1 to pt2 multiplied by the given scale factor.\r\n * @param pt1 start point of interpolation.\r\n * @param fraction fractional position between points.\r\n * @param pt2 endpoint of interpolation.\r\n * @param tangentScale scale factor to apply to the startToEnd vector.\r\n * @param result optional receiver.\r\n */\r\n public static interpolatePointAndTangent(pt1: XYAndZ, fraction: number, pt2: XYAndZ, tangentScale: number, result?: Ray3d): Ray3d {\r\n result = result ?? Ray3d.createZero();\r\n const dx = pt2.x - pt1.x;\r\n const dy = pt2.y - pt1.y;\r\n const dz = pt2.z - pt1.z;\r\n result.direction.set(tangentScale * dx, tangentScale * dy, tangentScale * dz);\r\n if (fraction <= 0.5)\r\n result.origin.set(pt1.x + fraction * dx, pt1.y + fraction * dy, pt1.z + fraction * dz);\r\n else {\r\n const t: number = fraction - 1.0;\r\n result.origin.set(pt2.x + t * dx, pt2.y + t * dy, pt2.z + t * dz);\r\n }\r\n return result;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"Ray3d.js","sourceRoot":"","sources":["../../../src/geometry3d/Ray3d.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\nimport { CurveCurveApproachType, CurveLocationDetail, CurveLocationDetailPair } from \"../curve/CurveLocationDetail\";\r\nimport { AxisOrder, BeJSONFunctions, Geometry } from \"../Geometry\";\r\nimport { SmallSystem } from \"../numerics/Polynomials\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\r\nimport { Vector2d } from \"./Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Range1d, Range3d } from \"./Range\";\r\nimport { Transform } from \"./Transform\";\r\nimport { XYAndZ } from \"./XYZProps\";\r\n\r\n/**\r\n * A Ray3d contains\r\n * * an `origin` point.\r\n * * a `direction` vector (The vector is not required to be normalized).\r\n * * an optional weight (number).\r\n * @public\r\n */\r\nexport class Ray3d implements BeJSONFunctions {\r\n /** The ray origin */\r\n public origin: Point3d;\r\n /** The ray direction. This is commonly (but not always) a unit vector. */\r\n public direction: Vector3d;\r\n /** Numeric annotation. */\r\n public a?: number; // optional (e.g. weight)\r\n // constructor (captures references)\r\n private constructor(origin: Point3d, direction: Vector3d) {\r\n this.origin = origin;\r\n this.direction = direction;\r\n this.a = undefined;\r\n }\r\n private static _create(x: number, y: number, z: number, u: number, v: number, w: number) {\r\n return new Ray3d(Point3d.create(x, y, z), Vector3d.create(u, v, w));\r\n }\r\n /** Create a ray on the x axis. */\r\n public static createXAxis(): Ray3d {\r\n return Ray3d._create(0, 0, 0, 1, 0, 0);\r\n }\r\n /** Create a ray on the y axis. */\r\n public static createYAxis(): Ray3d {\r\n return Ray3d._create(0, 0, 0, 0, 1, 0);\r\n }\r\n /** Create a ray on the z axis. */\r\n public static createZAxis(): Ray3d {\r\n return Ray3d._create(0, 0, 0, 0, 0, 1);\r\n }\r\n /** Create a ray with all zeros. */\r\n public static createZero(result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setZero();\r\n result.direction.setZero();\r\n return result;\r\n }\r\n return new Ray3d(Point3d.createZero(), Vector3d.createZero());\r\n }\r\n /**\r\n * Test for nearly equal Ray3d objects.\r\n * * This tests for near equality of origin and direction -- i.e. member-by-member comparison.\r\n * * Use [[isAlmostEqualPointSet]] to allow origins to be anywhere along the common ray and to have to allow the\r\n * directions to be scaled or opposing.\r\n */\r\n public isAlmostEqual(other: Ray3d): boolean {\r\n return this.origin.isAlmostEqual(other.origin) && this.direction.isAlmostEqual(other.direction);\r\n }\r\n /** Return the dot product of the ray's direction vector with a vector from the ray origin to the `spacePoint`. */\r\n public dotProductToPoint(spacePoint: Point3d): number {\r\n return this.direction.dotProductStartEnd(this.origin, spacePoint);\r\n }\r\n /** Return the fractional coordinate (along the direction vector) of the `spacePoint` projected to the ray. */\r\n public pointToFraction(spacePoint: Point3d): number {\r\n return Geometry.safeDivideFraction(\r\n this.dotProductToPoint(spacePoint),\r\n this.direction.magnitudeSquared(),\r\n 0\r\n );\r\n }\r\n /** Return the `spacePoint` projected onto the ray. */\r\n public projectPointToRay(spacePoint: Point3d): Point3d {\r\n /**\r\n * To project a point to the ray, we can create a vector called \"v\" from ray origin to the spacePoint and project\r\n * that vector to the ray direction vector \"r\". The projection is \"((v.r)/||r||^2) r\" where \"v.r\" is the dot\r\n * product. Note that pointToFraction returns \"(v.r)/||r||^2\".\r\n * Note: If r is the normal of a plane, then projection length \"(v.r)/||r||\" is the signed altitude of the\r\n * spacePoint with respect to the plane.\r\n */\r\n return this.origin.plusScaled(this.direction, this.pointToFraction(spacePoint));\r\n }\r\n /**\r\n * Test for nearly equal rays, allowing origin float and direction scaling.\r\n * * Use [[isAlmostEqual]] to require member-by-member comparison.\r\n */\r\n public isAlmostEqualPointSet(other: Ray3d): boolean {\r\n /**\r\n * This function tests two rays to determine if they define the same infinite lines.\r\n * So the origins can be different as long as they are on the infinite line (they can\r\n * \"float\") but the directions must be parallel or antiparallel.\r\n */\r\n if (!this.direction.isParallelTo(other.direction, true))\r\n return false;\r\n /**\r\n * In exact math, we consider a ray to have an infinite line as direction (not a finite vector).\r\n * Therefore, in exact math it is not possible for one origin to be on the other ray but not vice\r\n * versa. However, we test both ways because first check may pass due to round-off errors.\r\n */\r\n let workPoint = this.projectPointToRay(other.origin);\r\n if (!other.origin.isAlmostEqualMetric(workPoint))\r\n return false;\r\n workPoint = other.projectPointToRay(this.origin);\r\n if (!this.origin.isAlmostEqualMetric(workPoint))\r\n return false;\r\n return true;\r\n }\r\n /** Create a ray from origin and direction. */\r\n public static create(origin: Point3d, direction: Vector3d, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.set(origin, direction);\r\n return result;\r\n }\r\n return new Ray3d(origin.clone(), direction.clone());\r\n }\r\n /**\r\n * Given a homogeneous point and its derivative components, construct a Ray3d with cartesian\r\n * coordinates and derivatives.\r\n * @param weightedPoint `[x,y,z,w]` parts of weighted point.\r\n * @param weightedDerivative `[x,y,z,w]` derivatives\r\n * @param result\r\n */\r\n public static createWeightedDerivative(\r\n weightedPoint: Float64Array, weightedDerivative: Float64Array, result?: Ray3d\r\n ): Ray3d | undefined {\r\n const w = weightedPoint[3];\r\n const dw = weightedDerivative[3];\r\n const x = weightedPoint[0];\r\n const y = weightedPoint[1];\r\n const z = weightedPoint[2];\r\n const dx = weightedDerivative[0] * w - weightedPoint[0] * dw;\r\n const dy = weightedDerivative[1] * w - weightedPoint[1] * dw;\r\n const dz = weightedDerivative[2] * w - weightedPoint[2] * dw;\r\n if (Geometry.isSmallMetricDistance(w))\r\n return undefined;\r\n const divW = 1.0 / w;\r\n const divWW = divW * divW;\r\n return Ray3d.createXYZUVW(\r\n x * divW, y * divW, z * divW,\r\n dx * divWW, dy * divWW, dz * divWW,\r\n result\r\n );\r\n }\r\n /** Create from coordinates of the origin and direction. */\r\n public static createXYZUVW(\r\n originX: number, originY: number, originZ: number,\r\n directionX: number, directionY: number, directionZ: number,\r\n result?: Ray3d\r\n ): Ray3d {\r\n if (result) {\r\n result.getOriginRef().set(originX, originY, originZ);\r\n result.getDirectionRef().set(directionX, directionY, directionZ);\r\n return result;\r\n }\r\n return new Ray3d(Point3d.create(originX, originY, originZ), Vector3d.create(directionX, directionY, directionZ));\r\n }\r\n /** Capture origin and direction in a new Ray3d. */\r\n public static createCapture(origin: Point3d, direction: Vector3d): Ray3d {\r\n return new Ray3d(origin, direction);\r\n }\r\n /** Create from (clones of) origin, direction, and numeric weight. */\r\n public static createPointVectorNumber(origin: Point3d, direction: Vector3d, a: number, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setFrom(origin);\r\n result.direction.setFrom(direction);\r\n result.a = a;\r\n return result;\r\n }\r\n result = new Ray3d(origin.clone(), direction.clone());\r\n result.a = a;\r\n return result;\r\n }\r\n /** Create from origin and target. The direction vector is the full length (non-unit) vector from origin to target. */\r\n public static createStartEnd(origin: Point3d, target: Point3d, result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.origin.setFrom(origin);\r\n result.direction.setStartEnd(origin, target);\r\n return result;\r\n }\r\n return new Ray3d(origin.clone(), Vector3d.createStartEnd(origin, target));\r\n }\r\n /** Return a reference to the ray's origin. */\r\n public getOriginRef(): Point3d {\r\n return this.origin;\r\n }\r\n /** Return a reference to the ray's direction vector. */\r\n public getDirectionRef(): Vector3d {\r\n return this.direction;\r\n }\r\n /** Copy coordinates from origin and direction. */\r\n public set(origin: Point3d, direction: Vector3d): void {\r\n this.origin.setFrom(origin);\r\n this.direction.setFrom(direction);\r\n }\r\n /** Clone the ray. */\r\n public clone(result?: Ray3d): Ray3d {\r\n if (result) {\r\n result.set(this.origin.clone(), this.direction.clone());\r\n return result;\r\n }\r\n return new Ray3d(this.origin.clone(), this.direction.clone());\r\n }\r\n /** Create a clone and return the transform of the clone. */\r\n public cloneTransformed(transform: Transform): Ray3d {\r\n return new Ray3d(transform.multiplyPoint3d(this.origin), transform.multiplyVector(this.direction));\r\n }\r\n /** Create a clone and return the inverse transform of the clone. */\r\n public cloneInverseTransformed(transform: Transform): Ray3d | undefined {\r\n const origin = transform.multiplyInversePoint3d(this.origin);\r\n const direction = transform.matrix.multiplyInverseXYZAsVector3d(this.direction.x, this.direction.y, this.direction.z);\r\n if (undefined !== origin && undefined !== direction)\r\n return new Ray3d(origin, direction);\r\n return undefined;\r\n }\r\n /** Apply a transform in place. */\r\n public transformInPlace(transform: Transform) {\r\n transform.multiplyPoint3d(this.origin, this.origin);\r\n transform.multiplyVector(this.direction, this.direction);\r\n }\r\n /** Copy data from another ray. */\r\n public setFrom(source: Ray3d): void {\r\n this.set(source.origin, source.direction);\r\n }\r\n /**\r\n * Return a point at fractional position along the ray.\r\n * * fraction 0 is the ray origin.\r\n * * fraction 1 is at the end of the direction vector when placed at the origin.\r\n */\r\n public fractionToPoint(fraction: number, result?: Point3d): Point3d {\r\n return this.origin.plusScaled(this.direction, fraction, result);\r\n }\r\n /**\r\n * Return a transform for rigid axes at ray origin with z in ray direction.\r\n * * If the direction vector is zero, axes default to identity (from [[Matrix3d.createRigidHeadsUp]])\r\n */\r\n public toRigidZFrame(): Transform | undefined {\r\n const axes = Matrix3d.createRigidHeadsUp(this.direction, AxisOrder.ZXY);\r\n return Transform.createOriginAndMatrix(this.origin, axes);\r\n }\r\n /** Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d. */\r\n public setFromJSON(json?: any) {\r\n if (!json) {\r\n this.origin.set(0, 0, 0);\r\n this.direction.set(0, 0, 1);\r\n return;\r\n }\r\n this.origin.setFromJSON(json.origin);\r\n this.direction.setFromJSON(json.direction);\r\n }\r\n /**\r\n * Try to scale the direction vector to a given magnitude.\r\n * * Returns false if ray direction is a zero vector.\r\n */\r\n public trySetDirectionMagnitudeInPlace(magnitude: number = 1.0): boolean {\r\n if (this.direction.tryNormalizeInPlace()) {\r\n this.direction.scaleInPlace(magnitude);\r\n return true;\r\n }\r\n this.direction.setZero();\r\n this.a = 0.0;\r\n return false;\r\n }\r\n /**\r\n * * If parameter `a` is clearly nonzero and the direction vector can be normalized,\r\n * * save the parameter `a` as the optional `a` member of the ray.\r\n * * normalize the ray's direction vector\r\n * * If parameter `a` is nearly zero,\r\n * * Set the `a` member to zero\r\n * * Set the ray's direction vector to zero.\r\n * @param a area to be saved.\r\n */\r\n // input a ray and \"a\" understood as an area.\r\n // if a is clearly nonzero metric squared and the vector can be normalized, install those and return true.\r\n // otherwise set ray.z to zero and zero the vector of the ray and return false.\r\n public tryNormalizeInPlaceWithAreaWeight(a: number): boolean {\r\n const tolerance = Geometry.smallMetricDistanceSquared;\r\n this.a = a;\r\n if (Math.abs(a) > tolerance && this.direction.tryNormalizeInPlace(tolerance))\r\n return true;\r\n this.direction.setZero();\r\n this.a = 0.0;\r\n return false;\r\n }\r\n /**\r\n * Construct a JSON object from this Ray3d.\r\n * @return {*} [origin,normal]\r\n */\r\n public toJSON(): any {\r\n return { origin: this.origin.toJSON(), direction: this.direction.toJSON() };\r\n }\r\n /** Create a new ray from json object. See `setFromJSON` for json structure; */\r\n public static fromJSON(json?: any) {\r\n const result = Ray3d.createXAxis();\r\n result.setFromJSON(json);\r\n return result;\r\n }\r\n /** return distance from the ray to point in space */\r\n public distance(spacePoint: Point3d): number {\r\n const uu = this.direction.magnitudeSquared();\r\n const uv = this.dotProductToPoint(spacePoint);\r\n const aa = Geometry.inverseMetricDistanceSquared(uu);\r\n if (aa)\r\n return Math.sqrt(this.origin.distanceSquared(spacePoint) - uv * uv * aa);\r\n else\r\n return Math.sqrt(this.origin.distanceSquared(spacePoint));\r\n }\r\n /**\r\n * Return the intersection of the unbounded ray with a plane.\r\n * Stores the point of intersection in the result point given as a parameter,\r\n * and returns the parameter along the ray where the intersection occurs.\r\n * Returns undefined if the ray and plane are parallel or coplanar.\r\n */\r\n public intersectionWithPlane(plane: Plane3dByOriginAndUnitNormal, result?: Point3d): number | undefined {\r\n const vectorA = Vector3d.createStartEnd(plane.getOriginRef(), this.origin);\r\n const uDotN = this.direction.dotProduct(plane.getNormalRef());\r\n const nDotN = this.direction.magnitudeSquared();\r\n const aDotN = vectorA.dotProduct(plane.getNormalRef());\r\n const division = Geometry.conditionalDivideFraction(-aDotN, uDotN);\r\n if (undefined === division)\r\n return undefined;\r\n const division1 = Geometry.conditionalDivideFraction(nDotN, uDotN);\r\n if (undefined === division1)\r\n return undefined;\r\n if (result) {\r\n this.origin.plusScaled(this.direction, division, result);\r\n }\r\n return division;\r\n }\r\n /**\r\n * Find intersection of the ray with a Range3d.\r\n * * return the range of fractions (on the ray) which are \"inside\" the range.\r\n * * Note that a range is always returned; if there is no intersection it is indicated by the test `result.sNull`\r\n */\r\n public intersectionWithRange3d(range: Range3d, result?: Range1d): Range1d {\r\n if (range.isNull)\r\n return Range1d.createNull(result);\r\n const interval = Range1d.createXX(-Geometry.largeCoordinateResult, Geometry.largeCoordinateResult, result);\r\n if (interval.clipLinearMapToInterval(this.origin.x, this.direction.x, range.low.x, range.high.x)\r\n && interval.clipLinearMapToInterval(this.origin.y, this.direction.y, range.low.y, range.high.y)\r\n && interval.clipLinearMapToInterval(this.origin.z, this.direction.z, range.low.z, range.high.z))\r\n return interval;\r\n return interval;\r\n }\r\n\r\n /**\r\n * Construct a vector from `ray.origin` to target point.\r\n * * return the part of the vector that is perpendicular to `ray.direction`.\r\n * * i.e., return the shortest vector from the ray to the point.\r\n */\r\n public perpendicularPartOfVectorToTarget(targetPoint: XYAndZ, result?: Vector3d): Vector3d {\r\n const vectorV = Vector3d.createStartEnd(this.origin, targetPoint);\r\n const uu = this.direction.magnitudeSquared();\r\n const uv = this.direction.dotProductStartEnd(this.origin, targetPoint);\r\n const fraction = Geometry.safeDivideFraction(uv, uu, 0.0);\r\n return vectorV.plusScaled(this.direction, -fraction, result);\r\n }\r\n /**\r\n * Determine if two rays intersect, are fully overlapped, parallel but no coincident, or skew\r\n * * Return a CurveLocationDetailPair which\r\n * * contains fraction and point on each ray.\r\n * * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of\r\n * these relationships\r\n * * CurveCurveApproachType.Intersection -- the rays have a simple intersection, at fractions indicated\r\n * in detailA and detailB\r\n * * CurveCurveApproachType.PerpendicularChord -- there is pair of where the rays have closest approach.\r\n * The rays are skew in space.\r\n * * CurveCurveApproachType.CoincidentGeometry -- the rays are the same unbounded line in space. The\r\n * fractions and points are a representative single common point.\r\n * * CurveCurveApproachType.Parallel -- the rays are parallel (and not coincident). The two points are\r\n * at the minimum distance\r\n */\r\n public static closestApproachRay3dRay3d(rayA: Ray3d, rayB: Ray3d): CurveLocationDetailPair {\r\n const intersectionFractions = Vector2d.create();\r\n let fractionA, fractionB;\r\n let pointA, pointB;\r\n let pairType;\r\n if (SmallSystem.ray3dXYZUVWClosestApproachUnbounded(\r\n rayA.origin.x, rayA.origin.y, rayA.origin.z, rayA.direction.x, rayA.direction.y, rayA.direction.z,\r\n rayB.origin.x, rayB.origin.y, rayB.origin.z, rayB.direction.x, rayB.direction.y, rayB.direction.z, intersectionFractions)) {\r\n fractionA = intersectionFractions.x;\r\n fractionB = intersectionFractions.y;\r\n pointA = rayA.fractionToPoint(fractionA);\r\n pointB = rayB.fractionToPoint(fractionB);\r\n pairType = pointA.isAlmostEqualMetric(pointB) ? CurveCurveApproachType.Intersection : CurveCurveApproachType.PerpendicularChord;\r\n } else {\r\n fractionB = 0.0;\r\n fractionA = rayA.pointToFraction(rayB.origin);\r\n pointA = rayA.fractionToPoint(fractionA);\r\n pointB = rayB.fractionToPoint(fractionB);\r\n pairType = pointA.isAlmostEqualMetric(pointB) ? CurveCurveApproachType.CoincidentGeometry : CurveCurveApproachType.ParallelGeometry;\r\n }\r\n const pair = CurveLocationDetailPair.createCapture(\r\n CurveLocationDetail.createRayFractionPoint(rayA, fractionA, rayA.fractionToPoint(fractionA)),\r\n CurveLocationDetail.createRayFractionPoint(rayB, fractionB, rayB.fractionToPoint(fractionB)));\r\n pair.approachType = pairType;\r\n return pair;\r\n }\r\n /**\r\n * Return a ray with `ray.origin` interpolated between pt1 and pt2 at the given fraction\r\n * and `ray.direction` set to the vector from pt1 to pt2 multiplied by the given scale factor.\r\n * @param pt1 start point of interpolation.\r\n * @param fraction fractional position between points.\r\n * @param pt2 endpoint of interpolation.\r\n * @param tangentScale scale factor to apply to the startToEnd vector.\r\n * @param result optional receiver.\r\n */\r\n public static interpolatePointAndTangent(pt1: XYAndZ, fraction: number, pt2: XYAndZ, tangentScale: number, result?: Ray3d): Ray3d {\r\n result = result ?? Ray3d.createZero();\r\n const dx = pt2.x - pt1.x;\r\n const dy = pt2.y - pt1.y;\r\n const dz = pt2.z - pt1.z;\r\n result.direction.set(tangentScale * dx, tangentScale * dy, tangentScale * dz);\r\n if (fraction <= 0.5)\r\n result.origin.set(pt1.x + fraction * dx, pt1.y + fraction * dy, pt1.z + fraction * dz);\r\n else {\r\n const t: number = fraction - 1.0;\r\n result.origin.set(pt2.x + t * dx, pt2.y + t * dy, pt2.z + t * dz);\r\n }\r\n return result;\r\n }\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/core-geometry",
|
|
3
|
-
"version": "4.0.0-dev.
|
|
3
|
+
"version": "4.0.0-dev.70",
|
|
4
4
|
"description": "iTwin.js Core Geometry library",
|
|
5
5
|
"main": "lib/cjs/core-geometry.js",
|
|
6
6
|
"module": "lib/esm/core-geometry.js",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"url": "http://www.bentley.com"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@itwin/build-tools": "4.0.0-dev.
|
|
26
|
+
"@itwin/build-tools": "4.0.0-dev.70",
|
|
27
27
|
"@itwin/eslint-plugin": "^4.0.0-dev.32",
|
|
28
28
|
"@types/chai": "4.3.1",
|
|
29
29
|
"@types/flatbuffers": "~1.10.0",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"typescript": "~5.0.2"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@itwin/core-bentley": "4.0.0-dev.
|
|
42
|
+
"@itwin/core-bentley": "4.0.0-dev.70",
|
|
43
43
|
"flatbuffers": "~1.12.0"
|
|
44
44
|
},
|
|
45
45
|
"nyc": {
|