@itwin/core-geometry 4.0.0-dev.70 → 4.0.0-dev.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/CHANGELOG.md +36 -3
  2. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +7 -1
  3. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  4. package/lib/cjs/curve/Query/PlanarSubdivision.js +14 -12
  5. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  6. package/lib/cjs/curve/RegionOps.d.ts +2 -2
  7. package/lib/cjs/curve/RegionOps.js +2 -2
  8. package/lib/cjs/curve/RegionOps.js.map +1 -1
  9. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts +134 -90
  10. package/lib/cjs/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  11. package/lib/cjs/geometry3d/BarycentricTriangle.js +192 -129
  12. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  13. package/lib/cjs/geometry3d/Ray3d.d.ts +38 -34
  14. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  15. package/lib/cjs/geometry3d/Ray3d.js +48 -45
  16. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  17. package/lib/esm/curve/Query/PlanarSubdivision.d.ts +7 -1
  18. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  19. package/lib/esm/curve/Query/PlanarSubdivision.js +14 -12
  20. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  21. package/lib/esm/curve/RegionOps.d.ts +2 -2
  22. package/lib/esm/curve/RegionOps.js +2 -2
  23. package/lib/esm/curve/RegionOps.js.map +1 -1
  24. package/lib/esm/geometry3d/BarycentricTriangle.d.ts +134 -90
  25. package/lib/esm/geometry3d/BarycentricTriangle.d.ts.map +1 -1
  26. package/lib/esm/geometry3d/BarycentricTriangle.js +192 -129
  27. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  28. package/lib/esm/geometry3d/Ray3d.d.ts +38 -34
  29. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  30. package/lib/esm/geometry3d/Ray3d.js +48 -45
  31. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  32. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"BarycentricTriangle.js","sourceRoot":"","sources":["../../../src/geometry3d/BarycentricTriangle.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/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry, PolygonLocation } from \"../Geometry\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Ray3d } from \"./Ray3d\";\r\n\r\n/**\r\n * Carries data about a location in the plane of a triangle.\r\n * * Each instance carries both world and barycentric coordinates for the point, and provides query services on the latter.\r\n * * No tolerance is used when querying barycentric coordinates (e.g., `isInsideOrOn`, `classify`). Use `snapLocalToEdge`\r\n * to adjust the barycentric coordinates to a triangle edge if they lie within a parametric tolerance.\r\n *\r\n * Properties of the barycentric coordinates (b0, b1, b2) of a point p in the plane of a triangle T with vertices p0, p1, p2:\r\n * * 1 = b0 + b1 + b2\r\n * * p = b0 * p0 + b1 * p1 + b2 * p2\r\n * * If T is spanned by the vectors U=p1-p0 and V=p2-p0, then the vector P=p-p0 can be written P = b1 * U + b2 * V.\r\n * * The coordinates are all nonnegative if and only if p is inside or on T.\r\n * * Exactly one coordinate is zero if and only if p lies on an (infinitely extended) edge of T.\r\n * * Exactly two coordinates are zero if and only if p coincides with a vertex of T.\r\n * @public\r\n */\r\nexport class TriangleLocationDetail {\r\n /** The Cartesian coordinates of the point p. */\r\n public world: Point3d;\r\n /** The barycentric coordinates of p with respect to the triangle. Assumed to sum to one. */\r\n public local: Point3d;\r\n /** Application-specific number */\r\n public a: number;\r\n /** Index of the triangle vertex at the base of the edge closest to p. */\r\n public closestEdgeIndex: number;\r\n /** The parameter along the closest edge of the projection of p. */\r\n public closestEdgeParam: number;\r\n\r\n private constructor() {\r\n this.world = new Point3d();\r\n this.local = new Point3d();\r\n this.a = 0.0;\r\n this.closestEdgeIndex = 0;\r\n this.closestEdgeParam = 0.0;\r\n }\r\n /** Invalidate this detail. */\r\n public invalidate() {\r\n this.world.setZero();\r\n this.local.setZero();\r\n this.a = 0.0;\r\n this.closestEdgeIndex = 0;\r\n this.closestEdgeParam = 0.0;\r\n }\r\n /** Create an invalid detail.\r\n * @param result optional pre-allocated object to fill and return\r\n */\r\n public static create(result?: TriangleLocationDetail): TriangleLocationDetail {\r\n if (undefined === result)\r\n result = new TriangleLocationDetail();\r\n else\r\n result.invalidate();\r\n return result;\r\n }\r\n /** Set the instance contents from the other detail.\r\n * @param other detail to clone\r\n */\r\n public copyContentsFrom(other: TriangleLocationDetail) {\r\n this.world.setFrom(other.world);\r\n this.local.setFrom(other.local);\r\n this.a = other.a;\r\n this.closestEdgeIndex = other.closestEdgeIndex;\r\n this.closestEdgeParam = other.closestEdgeParam;\r\n }\r\n /** Whether this detail is invalid. */\r\n public get isValid(): boolean {\r\n return !this.local.isZero;\r\n }\r\n /** Queries the barycentric coordinates to determine whether this instance specifies a location inside or on the triangle.\r\n * @see classify\r\n */\r\n public get isInsideOrOn(): boolean {\r\n return this.isValid && this.local.x >= 0.0 && this.local.y >= 0.0 && this.local.z >= 0.0;\r\n }\r\n /** Queries this detail to classify the location of this instance with respect to the triangle.\r\n * @returns location code\r\n * @see isInsideOrOn\r\n */\r\n public get classify(): PolygonLocation {\r\n if (!this.isValid)\r\n return PolygonLocation.Unknown;\r\n if (this.isInsideOrOn) {\r\n let numZero = 0;\r\n if (Math.abs(this.local.x) === 0.0)\r\n ++numZero;\r\n if (Math.abs(this.local.y) === 0.0)\r\n ++numZero;\r\n if (Math.abs(this.local.z) === 0.0)\r\n ++numZero;\r\n if (2 === numZero)\r\n return PolygonLocation.OnPolygonVertex;\r\n if (1 === numZero)\r\n return PolygonLocation.OnPolygonEdgeInterior;\r\n return PolygonLocation.InsidePolygonProjectsToEdgeInterior;\r\n }\r\n return (this.closestEdgeParam === 0.0) ? PolygonLocation.OutsidePolygonProjectsToVertex : PolygonLocation.OutsidePolygonProjectsToEdgeInterior;\r\n }\r\n}\r\n\r\n/**\r\n * 3 points defining a triangle to be evaluated with barycentric coordinates.\r\n * @public\r\n */\r\nexport class BarycentricTriangle {\r\n /** Array of 3 point coordinates for the triangle. */\r\n public points: Point3d[];\r\n\r\n /** Edge length squared cache, indexed by opposite vertex index */\r\n protected edgeLength2: number[];\r\n\r\n /** Constructor.\r\n * * Point references are CAPTURED\r\n */\r\n protected constructor(point0: Point3d, point1: Point3d, point2: Point3d) {\r\n this.points = [];\r\n this.points.push(point0);\r\n this.points.push(point1);\r\n this.points.push(point2);\r\n this.edgeLength2 = [];\r\n this.edgeLength2.push(point1.distanceSquared(point2));\r\n this.edgeLength2.push(point0.distanceSquared(point2));\r\n this.edgeLength2.push(point0.distanceSquared(point1));\r\n }\r\n\r\n /**\r\n * Return a `BarycentricTriangle` with coordinates given by enumerated x,y,z of the 3 points.\r\n * @param result optional pre-allocated triangle.\r\n */\r\n public static createXYZXYZXYZ(x0: number, y0: number, z0: number, x1: number, y1: number, z1: number, x2: number, y2: number, z2: number, result?: BarycentricTriangle): BarycentricTriangle {\r\n if (!result) return new this(Point3d.create(x0, y0, z0), Point3d.create(x1, y1, z1), Point3d.create(x2, y2, z2));\r\n result.points[0].set(x0, y0, z0);\r\n result.points[1].set(x1, y1, z1);\r\n result.points[2].set(x2, y2, z2);\r\n return result;\r\n }\r\n /** create a triangle with coordinates cloned from given points. */\r\n public static create(point0: Point3d, point1: Point3d, point2: Point3d, result?: BarycentricTriangle): BarycentricTriangle {\r\n if (!result)\r\n return new this(point0.clone(), point1.clone(), point2.clone());\r\n result.set(point0, point1, point2);\r\n return result;\r\n }\r\n /** Return a new `BarycentricTriangle` with the same coordinates. */\r\n public clone(result?: BarycentricTriangle): BarycentricTriangle {\r\n return BarycentricTriangle.create(this.points[0], this.points[1], this.points[2], result);\r\n }\r\n\r\n /** Return area divided by sum of squared lengths. */\r\n public get aspectRatio(): number {\r\n return Geometry.safeDivideFraction(this.area, this.edgeLengthSquared(0) + this.edgeLengthSquared(1) + this.edgeLengthSquared(2), 0);\r\n }\r\n /** Return the area of the triangle. */\r\n public get area(): number {\r\n return 0.5 * this.points[0].crossProductToPointsMagnitude(this.points[1], this.points[2]);\r\n }\r\n\r\n /** Return the perimeter of the triangle */\r\n public get perimeter(): number {\r\n return this.edgeLength(0) + this.edgeLength(1) + this.edgeLength(2);\r\n }\r\n\r\n /** Sum the points with given scales.\r\n * * If the scales sum to 1, they are barycentric coordinates, and hence the result point is in the plane of the triangle.\r\n * * If the scales do not sum to 1, the point is in the triangle scaled (by the scale sum) from the origin.\r\n * @param b0 scale to apply to vertex 0\r\n * @param b1 scale to apply to vertex 1\r\n * @param b2 scale to apply to vertex 2\r\n * @param result optional pre-allocated point to fill and return\r\n * @return linear combination of the vertices of this triangle\r\n * @see pointToFraction\r\n */\r\n public fractionToPoint(b0: number, b1: number, b2: number, result?: Point3d): Point3d {\r\n return Point3d.createAdd3Scaled(this.points[0], b0, this.points[1], b1, this.points[2], b2, result);\r\n }\r\n\r\n private static _workPoint?: Point3d;\r\n private static _workVector0?: Vector3d;\r\n private static _workVector1?: Vector3d;\r\n private static _workRay?: Ray3d;\r\n private static _workMatrix?: Matrix3d;\r\n\r\n /** Compute the projection of the given point onto the plane of this triangle.\r\n * @param point point p to project\r\n * @param result optional pre-allocated object to fill and return\r\n * @returns details d of the projection point P = `d.point`:\r\n * * `d.isValid` returns true if and only if `this.normal()` is defined.\r\n * * `d.classify` can be used to determine where P lies with respect to the triangle.\r\n * * `d.a` is the signed projection distance: P = p + a * `this.normal()`.\r\n * @see fractionToPoint\r\n */\r\n public pointToFraction(point: Point3d, result?: TriangleLocationDetail): TriangleLocationDetail {\r\n const normal = BarycentricTriangle._workVector0 = this.normal(BarycentricTriangle._workVector0);\r\n if (undefined === normal)\r\n return TriangleLocationDetail.create(result);\r\n const ray = BarycentricTriangle._workRay = Ray3d.create(point, normal, BarycentricTriangle._workRay);\r\n return this.intersectRay3d(ray, result); // is free to use workVector0\r\n }\r\n\r\n /** Convert from opposite-vertex to start-vertex edge indexing. */\r\n public static edgeOppositeVertexIndexToStartVertexIndex(edgeIndex: number): number {\r\n return Geometry.cyclic3dAxis(edgeIndex + 1);\r\n }\r\n\r\n /** Convert from start-vertex to opposite-vertex edge indexing. */\r\n public static edgeStartVertexIndexToOppositeVertexIndex(startVertexIndex: number): number {\r\n return Geometry.cyclic3dAxis(startVertexIndex - 1);\r\n }\r\n\r\n /** Examine a point's barycentric coordinates to determine if it lies inside the triangle but not on an edge/vertex.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns whether the point with barycentric coordinates is strictly inside the triangle.\r\n */\r\n public static isInsideTriangle(b0: number, b1: number, b2: number): boolean {\r\n return b0 > 0 && b1 > 0 && b2 > 0;\r\n }\r\n\r\n /** Examine a point's barycentric coordinates to determine if it lies inside the triangle or on an edge/vertex.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns whether the point with barycentric coordinates is inside or on the triangle.\r\n */\r\n public static isInsideOrOnTriangle(b0: number, b1: number, b2: number): boolean {\r\n return b0 >= 0 && b1 >= 0 && b2 >= 0;\r\n }\r\n\r\n /** Examine a point's barycentric coordinates to determine if it lies \"outside\" an edge of the triangle.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns index of vertex/edge i for which b_i < 0 and b_j >= 0 and b_k >= 0, or -1\r\n */\r\n private static isInRegionBeyondEdge(b0: number, b1: number, b2: number): number {\r\n if (b0 < 0 && b1 >= 0 && b2 >= 0)\r\n return 0;\r\n if (b0 >= 0 && b1 < 0 && b2 >= 0)\r\n return 1;\r\n if (b0 >= 0 && b1 >= 0 && b2 < 0)\r\n return 2;\r\n return -1;\r\n }\r\n\r\n /** Examine a point's barycentric coordinates to determine if it lies \"outside\" a vertex of the triangle.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns index of vertex i for which and b_j < 0 and b_k < 0, or -1\r\n */\r\n private static isInRegionBeyondVertex(b0: number, b1: number, b2: number): number {\r\n if (b1 < 0 && b2 < 0)\r\n return 0;\r\n if (b0 < 0 && b2 < 0)\r\n return 1;\r\n if (b0 < 0 && b1 < 0)\r\n return 2;\r\n return -1;\r\n }\r\n\r\n /** Examine a point's barycentric coordinates to determine if it lies on a vertex of the triangle.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns index of vertex i for which b_i = 1 and b_j = b_k = 0, or -1\r\n */\r\n private static isOnVertex(b0: number, b1: number, b2: number): number {\r\n if (b0 === 1 && b1 === 0 && b2 === 0)\r\n return 0;\r\n if (b0 === 0 && b1 === 1 && b2 === 0)\r\n return 1;\r\n if (b0 === 0 && b1 === 0 && b2 === 1)\r\n return 2;\r\n return -1;\r\n }\r\n\r\n /** Examine a point's barycentric coordinates to determine if it lies on a bounded edge of the triangle.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns index of vertex/edge i for which b_i = 0 and b_j > 0 and b_k > 0, or -1\r\n */\r\n private static isOnBoundedEdge(b0: number, b1: number, b2: number): number {\r\n if (b0 === 0 && b1 > 0 && b2 > 0)\r\n return 0;\r\n if (b0 > 0 && b1 === 0 && b2 > 0)\r\n return 1;\r\n if (b0 > 0 && b1 > 0 && b2 === 0)\r\n return 2;\r\n return -1;\r\n }\r\n\r\n /** @returns edge/vertex index (0,1,2) for which the function has a minimum value */\r\n private static indexOfMinimum(fn: (edgeIndex: number) => number): number {\r\n let i = 0;\r\n let min = fn(0);\r\n const val = fn(1);\r\n if (min > val) {\r\n i = 1;\r\n min = val;\r\n }\r\n if (min > fn(2))\r\n i = 2;\r\n return i;\r\n }\r\n\r\n /** Return the index of the closest triangle vertex to the point given by its barycentric coordinates. */\r\n public closestVertexIndex(b0: number, b1: number, b2: number): number {\r\n return BarycentricTriangle.indexOfMinimum((i: number) => {\r\n const a = BarycentricTriangle._workPoint = Point3d.createZero(BarycentricTriangle._workPoint);\r\n a.setAt(i, 1.0);\r\n return this.distanceSquared(a.x, a.y, a.z, b0, b1, b2);\r\n });\r\n }\r\n\r\n /** Compute the projection of barycentric point p onto the (unbounded) edge e_k(v_i,v_j) of the triangle T(v_i,v_j,v_k).\r\n * @param k vertex v_k is opposite the edge e_k\r\n * @param b barycentric coordinates of point to project\r\n * @returns parameter s along e_k, such that:\r\n * * the projection point is q = v_i + s * (v_j - v_i)\r\n * * the barycentric coords of the projection are q_ijk = (1 - s, s, 0)\r\n */\r\n private computeProjectionToEdge(k: number, b: number[]): number {\r\n // Let U=v_j-v_i and V=v_k-v_i. Then\r\n // 0 = (p-q).(v_j-v_i) = ((p-v_i)-(q-v_i)).(v_j-v_i) = (b[j]U + b[k]V - sU).U = b[j]U.U + b[k]U.V - sU.U\r\n // Thus s = b[j] + b[k]U.V/U.U\r\n k = Geometry.cyclic3dAxis(k);\r\n const i = Geometry.cyclic3dAxis(k + 1);\r\n const j = Geometry.cyclic3dAxis(i + 1);\r\n return b[j] + b[k] * this.dotProductOfEdgeVectorsAtVertex(i) / this.edgeLengthSquared(k);\r\n }\r\n\r\n /** Compute the projection of a barycentric point p to the triangle T(v_0,v_1,v_2).\r\n * @param b0 barycentric coordinate of p corresponding to v_0\r\n * @param b1 barycentric coordinate of p corresponding to v_1\r\n * @param b2 barycentric coordinate of p corresponding to v_2\r\n * @returns closest edge start vertex index i and projection parameter u such that the projection q = v_i + u * (v_j - v_i).\r\n */\r\n public closestPoint(b0: number, b1: number, b2: number): { closestEdgeIndex: number, closestEdgeParam: number } {\r\n const b: number[] = [b0, b1, b2];\r\n let edgeIndex = -1; // opposite-vertex index\r\n let edgeParam = 0.0;\r\n if (BarycentricTriangle.isInsideTriangle(b0, b1, b2)) { // projects to any edge\r\n edgeIndex = BarycentricTriangle.indexOfMinimum((i: number) => {\r\n // We want smallest projection distance d_i of p to e_i.\r\n // Since b[i]=d_i|e_i|/2A we can compare quantities b[i]/|e_i|.\r\n return b[i] * b[i] / this.edgeLengthSquared(i); // avoid sqrt\r\n });\r\n edgeParam = this.computeProjectionToEdge(edgeIndex, b);\r\n } else if ((edgeIndex = BarycentricTriangle.isInRegionBeyondVertex(b0, b1, b2)) >= 0) { // projects to other edges, or any vertex\r\n edgeIndex = Geometry.cyclic3dAxis(edgeIndex + 1);\r\n edgeParam = this.computeProjectionToEdge(edgeIndex, b);\r\n if (edgeParam < 0 || edgeParam > 1) {\r\n edgeIndex = Geometry.cyclic3dAxis(edgeIndex + 1);\r\n edgeParam = this.computeProjectionToEdge(edgeIndex, b);\r\n if (edgeParam < 0 || edgeParam > 1) {\r\n edgeParam = 0.0;\r\n edgeIndex = BarycentricTriangle.edgeStartVertexIndexToOppositeVertexIndex(this.closestVertexIndex(b0, b1, b2));\r\n }\r\n }\r\n } else if ((edgeIndex = BarycentricTriangle.isInRegionBeyondEdge(b0, b1, b2)) >= 0) { // projects to the edge or its vertices\r\n edgeParam = this.computeProjectionToEdge(edgeIndex, b);\r\n if (edgeParam < 0) {\r\n edgeParam = 0.0; // start of this edge\r\n } else if (edgeParam > 1) {\r\n edgeParam = 0.0;\r\n edgeIndex = Geometry.cyclic3dAxis(edgeIndex + 1); // end of this edge = start of next edge\r\n }\r\n } else if ((edgeIndex = BarycentricTriangle.isOnBoundedEdge(b0, b1, b2)) >= 0) {\r\n edgeParam = 1 - b[BarycentricTriangle.edgeOppositeVertexIndexToStartVertexIndex(edgeIndex)];\r\n } else if ((edgeIndex = BarycentricTriangle.isOnVertex(b0, b1, b2)) >= 0) {\r\n edgeParam = 0.0;\r\n edgeIndex = BarycentricTriangle.edgeStartVertexIndexToOppositeVertexIndex(edgeIndex);\r\n }\r\n // invalid edgeIndex shouldn't happen, but propagate it anyway\r\n assert(edgeIndex === 0 || edgeIndex === 1 || edgeIndex === 2);\r\n return {\r\n closestEdgeIndex: (edgeIndex < 0) ? -1 : BarycentricTriangle.edgeOppositeVertexIndexToStartVertexIndex(edgeIndex),\r\n closestEdgeParam: edgeParam,\r\n };\r\n }\r\n /** Compute the intersection of a line (parameterized as a ray) with the plane of this triangle.\r\n * @param ray infinite line to intersect, as a ray\r\n * @param result optional pre-allocated object to fill and return\r\n * @returns details d of the line-plane intersection `d.point`:\r\n * * `d.isValid` returns true if and only if the line intersects the plane.\r\n * * `d.classify` can be used to determine where the intersection lies with respect to the triangle.\r\n * * `d.a` is the intersection parameter. If `d.a` >= 0, the ray intersects the plane of the triangle.\r\n * @see pointToFraction\r\n */\r\n public intersectRay3d(ray: Ray3d, result?: TriangleLocationDetail): TriangleLocationDetail {\r\n result = TriangleLocationDetail.create(result);\r\n // Let r0 = ray.origin, d = ray.direction. Write intersection point p two ways for unknown scalars s,b0,b1,b2:\r\n // r0 + s*d = p = b0*p0 + b1*p1 + b2*p2\r\n // Subtract p0 from both ends, let u=p1-p0, v=p2-p0, c=r0-p0, and enforce b0+b1+b2=1:\r\n // b1*u + b2*v - s*d = c\r\n // This is a linear system Mx=c where M has columns u,v,d and solution x=(b1,b2,-s).\r\n const r0 = ray.origin;\r\n const d = ray.direction;\r\n const u = BarycentricTriangle._workVector0 = Vector3d.createStartEnd(this.points[0], this.points[1], BarycentricTriangle._workVector0);\r\n const v = BarycentricTriangle._workVector1 = Vector3d.createStartEnd(this.points[0], this.points[2], BarycentricTriangle._workVector1);\r\n const M = BarycentricTriangle._workMatrix = Matrix3d.createColumns(u, v, d, BarycentricTriangle._workMatrix);\r\n const c = Vector3d.createStartEnd(this.points[0], r0, BarycentricTriangle._workVector0); // reuse workVector0\r\n const solution = BarycentricTriangle._workVector1; // reuse workVector1\r\n if (undefined === M.multiplyInverse(c, solution))\r\n return result; // invalid\r\n result.a = -solution.z;\r\n ray.fractionToPoint(result.a, result.world);\r\n result.local.set(1.0 - solution.x - solution.y, solution.x, solution.y);\r\n const proj = this.closestPoint(result.local.x, result.local.y, result.local.z);\r\n result.closestEdgeIndex = proj.closestEdgeIndex;\r\n result.closestEdgeParam = proj.closestEdgeParam;\r\n return result;\r\n }\r\n\r\n /** Compute the intersection of a line (parameterized as a line segment) with the plane of this triangle.\r\n * @param point0 start point of segment on line to intersect\r\n * @param point1 end point of segment on line to intersect\r\n * @param result optional pre-allocated object to fill and return\r\n * @returns details d of the line-plane intersection `d.point`:\r\n * * `d.isValid` returns true if and only if the line intersects the plane.\r\n * * `d.classify` can be used to determine where the intersection lies with respect to the triangle.\r\n * * `d.a` is the intersection parameter. If `d.a` is in [0,1], the segment intersects the plane of the triangle.\r\n * @see intersectRay3d\r\n */\r\n public intersectSegment(point0: Point3d, point1: Point3d, result?: TriangleLocationDetail): TriangleLocationDetail {\r\n BarycentricTriangle._workRay = Ray3d.createStartEnd(point0, point1, BarycentricTriangle._workRay);\r\n return this.intersectRay3d(BarycentricTriangle._workRay, result);\r\n }\r\n\r\n /** Adjust the location to an edge of the triangle if within either given tolerance.\r\n * @param location details of a point in the plane of the triangle, `location.local` and `location.world` possibly updated to lie on a triangle edge\r\n * @param distanceTolerance absolute distance tolerance (or zero to ignore)\r\n * @param parameterTolerance barycentric coordinate fractional tolerance (or zero to ignore)\r\n * @return whether the location was adjusted\r\n */\r\n public snapLocationToEdge(location: TriangleLocationDetail, distanceTolerance: number = Geometry.smallMetricDistance, parameterTolerance: number = Geometry.smallFraction): boolean {\r\n if (!location.isValid)\r\n return false;\r\n // first try parametric tol to zero barycentric coordinate (no vertices or world distances used!)\r\n if (parameterTolerance > 0.0) {\r\n let numSnapped = 0;\r\n let newSum = 0.0;\r\n for (let i = 0; i < 3; i++) {\r\n const barycentricDist = Math.abs(location.local.at(i));\r\n if (barycentricDist > 0.0 && barycentricDist < parameterTolerance) {\r\n location.local.setAt(i, 0.0);\r\n numSnapped++;\r\n }\r\n newSum += location.local.at(i);\r\n }\r\n if (numSnapped > 0 && newSum > 0.0) {\r\n location.local.scaleInPlace(1.0 / newSum);\r\n if (1 === numSnapped) {\r\n location.closestEdgeIndex = BarycentricTriangle.edgeOppositeVertexIndexToStartVertexIndex(BarycentricTriangle.isOnBoundedEdge(location.local.x, location.local.y, location.local.z));\r\n location.closestEdgeParam = 1.0 - location.local.at(location.closestEdgeIndex);\r\n } else { // 2 snapped, at vertex\r\n location.closestEdgeIndex = BarycentricTriangle.isOnVertex(location.local.x, location.local.y, location.local.z);\r\n location.closestEdgeParam = 0.0;\r\n }\r\n this.fractionToPoint(location.local.x, location.local.y, location.local.z, location.world);\r\n return true;\r\n }\r\n }\r\n // failing that, try distance tol to closest edge projection\r\n if (distanceTolerance > 0.0) {\r\n const i = location.closestEdgeIndex;\r\n const j = (i + 1) % 3;\r\n const k = (j + 1) % 3;\r\n const edgeProjection = BarycentricTriangle._workPoint = this.points[i].interpolate(location.closestEdgeParam, this.points[j], BarycentricTriangle._workPoint);\r\n const dist = location.world.distance(edgeProjection);\r\n if (dist > 0.0 && dist < distanceTolerance) {\r\n location.local.setAt(i, 1.0 - location.closestEdgeParam);\r\n location.local.setAt(j, location.closestEdgeParam);\r\n location.local.setAt(k, 0.0);\r\n location.world.setFrom(edgeProjection);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /** Copy all values from `other`\r\n */\r\n public setFrom(other: BarycentricTriangle) {\r\n for (let i = 0; i < 3; ++i) {\r\n this.points[i].setFromPoint3d(other.points[i]);\r\n this.edgeLength2[i] = other.edgeLength2[i];\r\n }\r\n }\r\n /** Copy contents of (not pointers to) the given points. A vertex is zeroed if its corresponding input point is undefined. */\r\n public set(point0: Point3d | undefined, point1: Point3d | undefined, point2: Point3d | undefined) {\r\n this.points[0].setFromPoint3d(point0);\r\n this.points[1].setFromPoint3d(point1);\r\n this.points[2].setFromPoint3d(point2);\r\n this.edgeLength2[0] = this.points[1].distanceSquared(this.points[2]);\r\n this.edgeLength2[1] = this.points[0].distanceSquared(this.points[2]);\r\n this.edgeLength2[2] = this.points[0].distanceSquared(this.points[1]);\r\n }\r\n /**\r\n * * For `this` and `other` BarycentricTriangles, compute cross products of vectors from point0 to point1 and from point0 to point2.\r\n * * return the dot product of those two\r\n */\r\n public dotProductOfCrossProductsFromOrigin(other: BarycentricTriangle): number {\r\n BarycentricTriangle._workVector0 = this.points[0].crossProductToPoints(this.points[1], this.points[2], BarycentricTriangle._workVector0);\r\n BarycentricTriangle._workVector1 = other.points[0].crossProductToPoints(other.points[1], other.points[2], BarycentricTriangle._workVector1);\r\n return BarycentricTriangle._workVector0.dotProduct(BarycentricTriangle._workVector1);\r\n }\r\n /** Return the centroid of the 3 points. */\r\n public centroid(result?: Point3d): Point3d {\r\n // write it out to get single scale application.\r\n // Do the scale as true division (rather than multiply by precomputed 1/3). This might protect one bit of result.\r\n return Point3d.create(\r\n (this.points[0].x + this.points[1].x + this.points[2].x) / 3.0,\r\n (this.points[0].y + this.points[1].y + this.points[2].y) / 3.0,\r\n (this.points[0].z + this.points[1].z + this.points[2].z) / 3.0,\r\n result);\r\n }\r\n\r\n /** Return the incenter of the triangle. */\r\n public incenter(result?: Point3d): Point3d {\r\n const a = this.edgeLength(0);\r\n const b = this.edgeLength(1);\r\n const c = this.edgeLength(2);\r\n const scale = Geometry.safeDivideFraction(1.0, a + b + c, 0.0);\r\n return this.fractionToPoint(scale * a, scale * b, scale * c, result);\r\n }\r\n\r\n /** Return the circumcenter of the triangle. */\r\n public circumcenter(result?: Point3d): Point3d {\r\n const a2 = this.edgeLengthSquared(0);\r\n const b2 = this.edgeLengthSquared(1);\r\n const c2 = this.edgeLengthSquared(2);\r\n const x = a2 * (b2 + c2 - a2);\r\n const y = b2 * (c2 + a2 - b2);\r\n const z = c2 * (a2 + b2 - c2);\r\n const scale = Geometry.safeDivideFraction(1.0, x + y + z, 0.0);\r\n return this.fractionToPoint(scale * x, scale * y, scale * z, result);\r\n }\r\n\r\n /** Return the unit normal of the triangle.\r\n * @param result optional pre-allocated vector to fill and return.\r\n * @returns unit normal, or undefined if cross product length is too small.\r\n */\r\n public normal(result?: Vector3d): Vector3d | undefined {\r\n const cross = this.points[0].crossProductToPoints(this.points[1], this.points[2], result);\r\n if (cross.tryNormalizeInPlace())\r\n return cross;\r\n return undefined;\r\n }\r\n\r\n /** test for point-by-point `isAlmostEqual` relationship. */\r\n public isAlmostEqual(other: BarycentricTriangle): boolean {\r\n return this.points[0].isAlmostEqual(other.points[0])\r\n && this.points[1].isAlmostEqual(other.points[1])\r\n && this.points[2].isAlmostEqual(other.points[2]);\r\n }\r\n\r\n /** Compute length of the triangle edge opposite the vertex with the given index.\r\n * @see edgeStartVertexIndexToOppositeVertexIndex\r\n */\r\n public edgeLength(oppositeVertexIndex: number): number {\r\n return Math.sqrt(this.edgeLengthSquared(oppositeVertexIndex));\r\n }\r\n\r\n /** Compute squared length of the triangle edge opposite the vertex with the given index.\r\n * @see edgeStartVertexIndexToOppositeVertexIndex\r\n */\r\n public edgeLengthSquared(oppositeVertexIndex: number): number {\r\n return this.edgeLength2[Geometry.cyclic3dAxis(oppositeVertexIndex)];\r\n }\r\n\r\n /** Compute dot product of the edge vectors based at the vertex with the given index. */\r\n public dotProductOfEdgeVectorsAtVertex(baseVertexIndex: number): number {\r\n const i = Geometry.cyclic3dAxis(baseVertexIndex);\r\n const j = Geometry.cyclic3dAxis(i + 1);\r\n const k = Geometry.cyclic3dAxis(j + 1);\r\n return Geometry.dotProductXYZXYZ(this.points[j].x - this.points[i].x, this.points[j].y - this.points[i].y, this.points[j].z - this.points[i].z,\r\n this.points[k].x - this.points[i].x, this.points[k].y - this.points[i].y, this.points[k].z - this.points[i].z);\r\n }\r\n\r\n /** Compute the squared distance between two points given by their barycentric coordinates.\r\n * * It is assumed that a0 + a1 + a2 = b0 + b1 + b2 = 1.\r\n */\r\n public distanceSquared(a0: number, a1: number, a2: number, b0: number, b1: number, b2: number): number {\r\n // the barycentric displacement vector distance formula\r\n return -this.edgeLengthSquared(0) * (b1 - a1) * (b2 - a2) - this.edgeLengthSquared(1) * (b2 - a2) * (b0 - a0) - this.edgeLengthSquared(2) * (b0 - a0) * (b1 - a1);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BarycentricTriangle.js","sourceRoot":"","sources":["../../../src/geometry3d/BarycentricTriangle.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/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\n\r\nimport { Geometry, PolygonLocation } from \"../Geometry\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Ray3d } from \"./Ray3d\";\r\n\r\n/**\r\n * Carries data about a location in the plane of a triangle.\r\n * * Each instance carries both world and barycentric coordinates for the point, and provides query\r\n * services on the latter.\r\n * * No tolerance is used when querying barycentric coordinates (e.g., `isInsideOrOn`, `classify`). Use\r\n * [[BarycentricTriangle.snapLocationToEdge]] to adjust the barycentric coordinates to a triangle edge\r\n * if they lie within a distance or parametric tolerance.\r\n *\r\n * Properties of the barycentric coordinates `(b0, b1, b2)` of a point `p` in the plane of a triangle\r\n * `T` with vertices `v0, v1, v2`:\r\n * * `1 = b0 + b1 + b2`\r\n * * `p = b0 * v0 + b1 * v1 + b2 * v2`\r\n * * If T is spanned by the vectors `U = v1 - v0` and `V = v2 - v0`, then the vector `P = p - v0` can\r\n * be written `P = b1 * U + b2 * V`.\r\n * * The coordinates are all nonnegative if and only if `p` is inside or on `T`.\r\n * * Exactly one coordinate is zero if and only if `p` lies on an (infinitely extended) edge of `T`.\r\n * * Exactly two coordinates are zero if and only if `p` coincides with a vertex of `T`.\r\n * * Note that if `p` can be written as a linear combination of the vertices of `T` using scales that do\r\n * NOT sum to 1, then `p` is not coplanar with `T`\r\n * @public\r\n */\r\nexport class TriangleLocationDetail {\r\n /** The Cartesian coordinates of the point p. */\r\n public world: Point3d;\r\n /** The barycentric coordinates of p with respect to the triangle. Assumed to sum to one. */\r\n public local: Point3d;\r\n /** Application-specific number */\r\n public a: number;\r\n /** Index of the triangle vertex at the start of the closest edge to p. */\r\n public closestEdgeIndex: number;\r\n /**\r\n * The parameter f along the closest edge to p of its projection q.\r\n * * We have q = v_i + f * (v_j - v_i) where i = closestEdgeIndex and j = (i + 1) % 3 are the indices\r\n * of the start vertex v_i and end vertex v_j of the closest edge to p.\r\n * * Note that 0 <= f <= 1.\r\n */\r\n public closestEdgeParam: number;\r\n\r\n private constructor() {\r\n this.world = new Point3d();\r\n this.local = new Point3d();\r\n this.a = 0.0;\r\n this.closestEdgeIndex = 0;\r\n this.closestEdgeParam = 0.0;\r\n }\r\n /** Invalidate this detail (set all attributes to zero) . */\r\n public invalidate() {\r\n this.world.setZero();\r\n this.local.setZero();\r\n this.a = 0.0;\r\n this.closestEdgeIndex = 0;\r\n this.closestEdgeParam = 0.0;\r\n }\r\n /**\r\n * Create an invalid detail.\r\n * @param result optional pre-allocated object to fill and return\r\n */\r\n public static create(result?: TriangleLocationDetail): TriangleLocationDetail {\r\n if (undefined === result)\r\n result = new TriangleLocationDetail();\r\n else\r\n result.invalidate();\r\n return result;\r\n }\r\n /**\r\n * Set the instance contents from the `other` detail.\r\n * @param other detail to clone\r\n */\r\n public copyContentsFrom(other: TriangleLocationDetail) {\r\n this.world.setFrom(other.world);\r\n this.local.setFrom(other.local);\r\n this.a = other.a;\r\n this.closestEdgeIndex = other.closestEdgeIndex;\r\n this.closestEdgeParam = other.closestEdgeParam;\r\n }\r\n /** Whether this detail is invalid. */\r\n public get isValid(): boolean {\r\n return !this.local.isZero;\r\n }\r\n /**\r\n * Queries the barycentric coordinates to determine whether this instance specifies a location inside or\r\n * on the triangle.\r\n * @see classify\r\n */\r\n public get isInsideOrOn(): boolean {\r\n return this.isValid && this.local.x >= 0.0 && this.local.y >= 0.0 && this.local.z >= 0.0;\r\n }\r\n /**\r\n * Queries this detail to classify the location of this instance with respect to the triangle.\r\n * @returns location code\r\n * @see isInsideOrOn\r\n */\r\n public get classify(): PolygonLocation {\r\n if (!this.isValid)\r\n return PolygonLocation.Unknown;\r\n if (this.isInsideOrOn) {\r\n let numZero = 0;\r\n if (Math.abs(this.local.x) === 0.0)\r\n ++numZero;\r\n if (Math.abs(this.local.y) === 0.0)\r\n ++numZero;\r\n if (Math.abs(this.local.z) === 0.0)\r\n ++numZero;\r\n if (2 === numZero)\r\n return PolygonLocation.OnPolygonVertex;\r\n if (1 === numZero)\r\n return PolygonLocation.OnPolygonEdgeInterior;\r\n return PolygonLocation.InsidePolygonProjectsToEdgeInterior;\r\n }\r\n return (this.closestEdgeParam === 0.0) ?\r\n PolygonLocation.OutsidePolygonProjectsToVertex :\r\n PolygonLocation.OutsidePolygonProjectsToEdgeInterior;\r\n }\r\n}\r\n\r\n/**\r\n * 3 points defining a triangle to be evaluated with barycentric coordinates.\r\n * @public\r\n */\r\nexport class BarycentricTriangle {\r\n /** Array of 3 point coordinates for the triangle. */\r\n public points: Point3d[];\r\n /** Edge length squared cache, indexed by opposite vertex index */\r\n protected edgeLength2: number[];\r\n // private attributes\r\n private static _workPoint?: Point3d;\r\n private static _workVector0?: Vector3d;\r\n private static _workVector1?: Vector3d;\r\n private static _workRay?: Ray3d;\r\n private static _workMatrix?: Matrix3d;\r\n /**\r\n * Constructor.\r\n * * Point references are CAPTURED\r\n */\r\n protected constructor(point0: Point3d, point1: Point3d, point2: Point3d) {\r\n this.points = [];\r\n this.points.push(point0);\r\n this.points.push(point1);\r\n this.points.push(point2);\r\n this.edgeLength2 = [];\r\n this.edgeLength2.push(point1.distanceSquared(point2));\r\n this.edgeLength2.push(point0.distanceSquared(point2));\r\n this.edgeLength2.push(point0.distanceSquared(point1));\r\n }\r\n /**\r\n * Copy contents of (not pointers to) the given points. A vertex is zeroed if its corresponding input point\r\n * is undefined.\r\n */\r\n public set(point0: Point3d | undefined, point1: Point3d | undefined, point2: Point3d | undefined) {\r\n this.points[0].setFromPoint3d(point0);\r\n this.points[1].setFromPoint3d(point1);\r\n this.points[2].setFromPoint3d(point2);\r\n this.edgeLength2[0] = this.points[1].distanceSquared(this.points[2]);\r\n this.edgeLength2[1] = this.points[0].distanceSquared(this.points[2]);\r\n this.edgeLength2[2] = this.points[0].distanceSquared(this.points[1]);\r\n }\r\n /** Copy all values from `other` */\r\n public setFrom(other: BarycentricTriangle) {\r\n for (let i = 0; i < 3; ++i) {\r\n this.points[i].setFromPoint3d(other.points[i]);\r\n this.edgeLength2[i] = other.edgeLength2[i];\r\n }\r\n }\r\n /**\r\n * Create a `BarycentricTriangle` with coordinates given by enumerated x,y,z of the 3 points.\r\n * @param result optional pre-allocated triangle.\r\n */\r\n public static createXYZXYZXYZ(\r\n x0: number, y0: number, z0: number,\r\n x1: number, y1: number, z1: number,\r\n x2: number, y2: number, z2: number,\r\n result?: BarycentricTriangle\r\n ): BarycentricTriangle {\r\n if (!result)\r\n return new this(Point3d.create(x0, y0, z0), Point3d.create(x1, y1, z1), Point3d.create(x2, y2, z2));\r\n result.points[0].set(x0, y0, z0);\r\n result.points[1].set(x1, y1, z1);\r\n result.points[2].set(x2, y2, z2);\r\n return result;\r\n }\r\n /** Create a triangle with coordinates cloned from given points. */\r\n public static create(\r\n point0: Point3d, point1: Point3d, point2: Point3d, result?: BarycentricTriangle\r\n ): BarycentricTriangle {\r\n if (!result)\r\n return new this(point0.clone(), point1.clone(), point2.clone());\r\n result.set(point0, point1, point2);\r\n return result;\r\n }\r\n /** Return a new `BarycentricTriangle` with the same coordinates. */\r\n public clone(result?: BarycentricTriangle): BarycentricTriangle {\r\n return BarycentricTriangle.create(this.points[0], this.points[1], this.points[2], result);\r\n }\r\n /** Return the area of the triangle. */\r\n public get area(): number {\r\n // The magnitude of the cross product A × B is the area of the parallelogram spanned by A and B.\r\n return 0.5 * this.points[0].crossProductToPointsMagnitude(this.points[1], this.points[2]);\r\n }\r\n /**\r\n * Compute squared length of the triangle edge opposite the vertex with the given index.\r\n * @see [[edgeStartVertexIndexToOppositeVertexIndex]]\r\n */\r\n public edgeLengthSquared(oppositeVertexIndex: number): number {\r\n return this.edgeLength2[Geometry.cyclic3dAxis(oppositeVertexIndex)];\r\n }\r\n /**\r\n * Compute length of the triangle edge opposite the vertex with the given index.\r\n * @see [[edgeStartVertexIndexToOppositeVertexIndex]]\r\n */\r\n public edgeLength(oppositeVertexIndex: number): number {\r\n return Math.sqrt(this.edgeLengthSquared(oppositeVertexIndex));\r\n }\r\n /** Return area divided by sum of squared lengths. */\r\n public get aspectRatio(): number {\r\n return Geometry.safeDivideFraction(\r\n this.area, this.edgeLengthSquared(0) + this.edgeLengthSquared(1) + this.edgeLengthSquared(2), 0\r\n );\r\n }\r\n /** Return the perimeter of the triangle. */\r\n public get perimeter(): number {\r\n return this.edgeLength(0) + this.edgeLength(1) + this.edgeLength(2);\r\n }\r\n /**\r\n * Return the unit normal of the triangle.\r\n * @param result optional pre-allocated vector to fill and return.\r\n * @returns unit normal, or undefined if cross product length is too small.\r\n */\r\n public normal(result?: Vector3d): Vector3d | undefined {\r\n const cross = this.points[0].crossProductToPoints(this.points[1], this.points[2], result);\r\n if (cross.tryNormalizeInPlace())\r\n return cross;\r\n return undefined;\r\n }\r\n /**\r\n * Sum the triangle points with given scales.\r\n * * If the scales sum to 1, they are barycentric coordinates, and hence the result point is in the plane of\r\n * the triangle. If all coordinates are non-negative then the result point is inside the triangle.\r\n * * If the scales do not sum to 1, the point is inside the triangle scaled (by the scale sum) from the origin.\r\n * @param b0 scale to apply to vertex 0\r\n * @param b1 scale to apply to vertex 1\r\n * @param b2 scale to apply to vertex 2\r\n * @param result optional pre-allocated point to fill and return\r\n * @return linear combination of the vertices of this triangle\r\n * @see [[pointToFraction]]\r\n */\r\n public fractionToPoint(b0: number, b1: number, b2: number, result?: Point3d): Point3d {\r\n // p = b0 * v0 + b1 * v1 + b2 * v2\r\n return Point3d.createAdd3Scaled(this.points[0], b0, this.points[1], b1, this.points[2], b2, result);\r\n }\r\n /**\r\n * Compute the projection of the given `point` onto the plane of this triangle.\r\n * @param point point p to project\r\n * @param result optional pre-allocated object to fill and return\r\n * @returns details d of the projection point `P = d.world`:\r\n * * `d.isValid` returns true if and only if `this.normal()` is defined.\r\n * * `d.classify` can be used to determine where P lies with respect to the triangle.\r\n * * `d.a` is the signed projection distance: `P = p + a * this.normal()`.\r\n * @see [[fractionToPoint]]\r\n */\r\n public pointToFraction(point: Point3d, result?: TriangleLocationDetail): TriangleLocationDetail {\r\n const normal = BarycentricTriangle._workVector0 = this.normal(BarycentricTriangle._workVector0);\r\n if (undefined === normal)\r\n return TriangleLocationDetail.create(result);\r\n const ray = BarycentricTriangle._workRay = Ray3d.create(point, normal, BarycentricTriangle._workRay);\r\n return this.intersectRay3d(ray, result); // intersectRay3d is free to use workVector0\r\n }\r\n /** Convert from opposite-vertex to start-vertex edge indexing. */\r\n public static edgeOppositeVertexIndexToStartVertexIndex(edgeIndex: number): number {\r\n return Geometry.cyclic3dAxis(edgeIndex + 1);\r\n }\r\n /** Convert from start-vertex to opposite-vertex edge indexing. */\r\n public static edgeStartVertexIndexToOppositeVertexIndex(startVertexIndex: number): number {\r\n return Geometry.cyclic3dAxis(startVertexIndex - 1);\r\n }\r\n /**\r\n * Examine a point's barycentric coordinates to determine if it lies inside the triangle but not on an edge/vertex.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns whether the point with barycentric coordinates is strictly inside the triangle.\r\n */\r\n public static isInsideTriangle(b0: number, b1: number, b2: number): boolean {\r\n return b0 > 0 && b1 > 0 && b2 > 0;\r\n }\r\n /**\r\n * Examine a point's barycentric coordinates to determine if it lies inside the triangle or on an edge/vertex.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns whether the point with barycentric coordinates is inside or on the triangle.\r\n */\r\n public static isInsideOrOnTriangle(b0: number, b1: number, b2: number): boolean {\r\n return b0 >= 0 && b1 >= 0 && b2 >= 0;\r\n }\r\n /**\r\n * Examine a point's barycentric coordinates to determine if it lies outside an edge of the triangle.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns edge index i (opposite vertex i) for which b_i < 0 and b_j >= 0, and b_k >= 0. Otherwise, returns -1.\r\n */\r\n private static isInRegionBeyondEdge(b0: number, b1: number, b2: number): number {\r\n // Note: the 3 regions (specified by the following if statements) are defined by extending the triangle\r\n // edges to infinity and not by perpendicular lines to the edges (which gives smaller regions)\r\n if (b0 < 0 && b1 >= 0 && b2 >= 0)\r\n return 0;\r\n if (b0 >= 0 && b1 < 0 && b2 >= 0)\r\n return 1;\r\n if (b0 >= 0 && b1 >= 0 && b2 < 0)\r\n return 2;\r\n return -1;\r\n }\r\n /**\r\n * Examine a point's barycentric coordinates to determine if it lies outside a vertex of the triangle.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns index of vertex i for which b_j < 0 and b_k < 0. Otherwise, returns -1.\r\n */\r\n private static isInRegionBeyondVertex(b0: number, b1: number, b2: number): number {\r\n // Note: the 3 regions (specified by the following if statements) are defined by extending the triangle\r\n // edges to infinity and not by perpendicular lines to the edges (which gives larger regions)\r\n if (b1 < 0 && b2 < 0)\r\n return 0;\r\n if (b0 < 0 && b2 < 0)\r\n return 1;\r\n if (b0 < 0 && b1 < 0)\r\n return 2;\r\n return -1;\r\n }\r\n /**\r\n * Examine a point's barycentric coordinates to determine if it lies on a vertex of the triangle.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns index of vertex i for which b_i = 1 and b_j = b_k = 0. Otherwise, returns -1.\r\n */\r\n private static isOnVertex(b0: number, b1: number, b2: number): number {\r\n if (b0 === 1 && b1 === 0 && b2 === 0)\r\n return 0;\r\n if (b0 === 0 && b1 === 1 && b2 === 0)\r\n return 1;\r\n if (b0 === 0 && b1 === 0 && b2 === 1)\r\n return 2;\r\n return -1;\r\n }\r\n /**\r\n * Examine a point's barycentric coordinates to determine if it lies on a bounded edge of the triangle.\r\n * * No parametric tolerance is used.\r\n * * It is assumed b0 + b1 + b2 = 1.\r\n * @returns edge index i (opposite vertex i) for which b_i = 0, b_j > 0, and b_k > 0. Otherwise, returns -1.\r\n */\r\n private static isOnBoundedEdge(b0: number, b1: number, b2: number): number {\r\n if (b0 === 0 && b1 > 0 && b2 > 0)\r\n return 0;\r\n if (b0 > 0 && b1 === 0 && b2 > 0)\r\n return 1;\r\n if (b0 > 0 && b1 > 0 && b2 === 0)\r\n return 2;\r\n return -1;\r\n }\r\n /** @returns edge/vertex index (0,1,2) for which the function has a minimum value */\r\n private static indexOfMinimum(fn: (index: number) => number): number {\r\n let i = 0;\r\n let min = fn(0);\r\n const val = fn(1);\r\n if (min > val) {\r\n i = 1;\r\n min = val;\r\n }\r\n if (min > fn(2))\r\n i = 2;\r\n return i;\r\n }\r\n /**\r\n * Compute the squared distance between two points given by their barycentric coordinates.\r\n * * It is assumed that a0 + a1 + a2 = b0 + b1 + b2 = 1.\r\n */\r\n public distanceSquared(a0: number, a1: number, a2: number, b0: number, b1: number, b2: number): number {\r\n // The barycentric displacement vector distance formula\r\n // More details can be found at https://web.evanchen.cc/handouts/bary/bary-full.pdf\r\n return -this.edgeLengthSquared(0) * (b1 - a1) * (b2 - a2)\r\n - this.edgeLengthSquared(1) * (b2 - a2) * (b0 - a0)\r\n - this.edgeLengthSquared(2) * (b0 - a0) * (b1 - a1);\r\n }\r\n /** Return the index of the closest triangle vertex to the point given by its barycentric coordinates. */\r\n public closestVertexIndex(b0: number, b1: number, b2: number): number {\r\n return BarycentricTriangle.indexOfMinimum((i: number) => {\r\n const a = BarycentricTriangle._workPoint = Point3d.createZero(BarycentricTriangle._workPoint);\r\n a.setAt(i, 1.0); // \"a\" is (1,0,0) or (0,1,0) or (0,0,1) so \"a\" represents vertex i\r\n return this.distanceSquared(a.x, a.y, a.z, b0, b1, b2); // distance between the point and vertex i\r\n });\r\n }\r\n /** Compute dot product of the edge vectors based at the vertex with the given index. */\r\n public dotProductOfEdgeVectorsAtVertex(baseVertexIndex: number): number {\r\n const i = Geometry.cyclic3dAxis(baseVertexIndex);\r\n const j = Geometry.cyclic3dAxis(i + 1);\r\n const k = Geometry.cyclic3dAxis(j + 1);\r\n return Geometry.dotProductXYZXYZ(\r\n this.points[j].x - this.points[i].x, this.points[j].y - this.points[i].y, this.points[j].z - this.points[i].z,\r\n this.points[k].x - this.points[i].x, this.points[k].y - this.points[i].y, this.points[k].z - this.points[i].z\r\n );\r\n }\r\n /**\r\n * Compute the projection of barycentric point p onto the (unbounded) edge e_k(v_i,v_j) of the triangle T(v_i,v_j,v_k).\r\n * @param k vertex v_k is opposite the edge e_k\r\n * @param b barycentric coordinates of point to project\r\n * @returns parameter f along e_k, such that:\r\n * * the projection point is q = v_i + f * (v_j - v_i)\r\n * * the barycentric coords of the projection are q_ijk = (1 - f, f, 0)\r\n */\r\n private computeProjectionToEdge(k: number, b: number[]): number {\r\n /**\r\n * We know p = (b_i*v_i) + (b_j*v_j) + (b_k*v_k) and 1 = b_i + b_j + b_k.\r\n * Let U = v_j - v_i and V = v_k - v_i and P = p - v_i.\r\n * First we prove P = b_jU + b_kV.\r\n * P = (b_i * v_i) + (b_j * v_j) + (b_k * v_k) - v_i\r\n * = (b_i * v_i) + (b_j * (v_j-v_i)) + (b_j * v_i) + (b_k * (v_k-v_i)) + (b_k * v_i) - v_i\r\n * = (b_i * v_i) + (b_j * U) + (b_j * v_i) + (b_k * V) + (b_k * v_i) - v_i\r\n * = (b_j * U) + (b_k * V) + ((b_i + b_j + b_k) * v_i) - v_i\r\n * = (b_j * U) + (b_k * V) + v_i - v_i\r\n * = (b_j * U) + (b_k * V)\r\n * So we know p - v_i = b_jU + b_kV and q - v_i = fU\r\n * Therefore, 0 = (p - q).(v_j - v_i)\r\n * = ((p-v_i) - (q-v_i)).(v_j - v_i)\r\n * = (b_jU + b_kV - fU).U\r\n * = b_jU.U + b_kU.V - fU.U\r\n * Thus f = b_j + b_k(U.V/U.U)\r\n */\r\n k = Geometry.cyclic3dAxis(k);\r\n const i = Geometry.cyclic3dAxis(k + 1);\r\n const j = Geometry.cyclic3dAxis(i + 1);\r\n return b[j] + b[k] * this.dotProductOfEdgeVectorsAtVertex(i) / this.edgeLengthSquared(k);\r\n }\r\n /**\r\n * Compute the projection of a barycentric point p to the triangle T(v_0,v_1,v_2).\r\n * @param b0 barycentric coordinate of p corresponding to v_0\r\n * @param b1 barycentric coordinate of p corresponding to v_1\r\n * @param b2 barycentric coordinate of p corresponding to v_2\r\n * @returns closest edge start vertex index i and projection parameter f such that the projection\r\n * q = v_i + f * (v_j - v_i).\r\n */\r\n public closestPoint(b0: number, b1: number, b2: number): { closestEdgeIndex: number, closestEdgeParam: number } {\r\n const b: number[] = [b0, b1, b2];\r\n let edgeIndex = -1; // opposite-vertex index\r\n let edgeParam = 0.0;\r\n if (BarycentricTriangle.isInsideTriangle(b0, b1, b2)) { // projects to any edge\r\n edgeIndex = BarycentricTriangle.indexOfMinimum((i: number) => {\r\n // We want smallest projection distance d_i of p to e_i.\r\n // Since b_i=d_i|e_i|/2A we can compare quantities b_i/|e_i|.\r\n return b[i] * b[i] / this.edgeLengthSquared(i); // avoid sqrt\r\n });\r\n edgeParam = this.computeProjectionToEdge(edgeIndex, b);\r\n } else if ((edgeIndex = BarycentricTriangle.isInRegionBeyondVertex(b0, b1, b2)) >= 0) { // projects to other edges, or any vertex\r\n edgeIndex = Geometry.cyclic3dAxis(edgeIndex + 1);\r\n edgeParam = this.computeProjectionToEdge(edgeIndex, b);\r\n if (edgeParam < 0 || edgeParam > 1) {\r\n edgeIndex = Geometry.cyclic3dAxis(edgeIndex + 1);\r\n edgeParam = this.computeProjectionToEdge(edgeIndex, b);\r\n if (edgeParam < 0 || edgeParam > 1) {\r\n edgeParam = 0.0;\r\n edgeIndex = BarycentricTriangle.edgeStartVertexIndexToOppositeVertexIndex(this.closestVertexIndex(b0, b1, b2));\r\n }\r\n }\r\n } else if ((edgeIndex = BarycentricTriangle.isInRegionBeyondEdge(b0, b1, b2)) >= 0) { // projects to the edge or its vertices\r\n edgeParam = this.computeProjectionToEdge(edgeIndex, b);\r\n if (edgeParam < 0) {\r\n edgeParam = 0.0; // start of this edge\r\n } else if (edgeParam > 1) {\r\n edgeParam = 0.0;\r\n edgeIndex = Geometry.cyclic3dAxis(edgeIndex + 1); // end of this edge = start of next edge\r\n }\r\n } else if ((edgeIndex = BarycentricTriangle.isOnBoundedEdge(b0, b1, b2)) >= 0) {\r\n edgeParam = 1 - b[BarycentricTriangle.edgeOppositeVertexIndexToStartVertexIndex(edgeIndex)];\r\n } else if ((edgeIndex = BarycentricTriangle.isOnVertex(b0, b1, b2)) >= 0) {\r\n edgeParam = 0.0;\r\n edgeIndex = BarycentricTriangle.edgeStartVertexIndexToOppositeVertexIndex(edgeIndex);\r\n }\r\n // invalid edgeIndex shouldn't happen, but propagate it anyway\r\n assert(edgeIndex === 0 || edgeIndex === 1 || edgeIndex === 2);\r\n return {\r\n closestEdgeIndex: (edgeIndex < 0) ? -1 : BarycentricTriangle.edgeOppositeVertexIndexToStartVertexIndex(edgeIndex),\r\n closestEdgeParam: edgeParam,\r\n };\r\n }\r\n /**\r\n * Compute the intersection of a line (parameterized as a ray) with the plane of this triangle.\r\n * @param ray infinite line to intersect, as a ray\r\n * @param result optional pre-allocated object to fill and return\r\n * @returns details d of the line-plane intersection point `d.world`:\r\n * * `d.a` is the intersection parameter along the ray.\r\n * * The line intersects the plane of the triangle if and only if `d.isValid` returns true.\r\n * * The ray intersects the plane of the triangle if and only if `d.isValid` returns true and `d.a` >= 0.\r\n * * The ray intersects the triangle if and only if `d.isValid` returns true, `d.a` >= 0, and `d.isInsideOrOn`\r\n * returns true.\r\n * * `d.classify` can be used to determine where the intersection lies with respect to the triangle.\r\n * @see [[pointToFraction]]\r\n */\r\n public intersectRay3d(ray: Ray3d, result?: TriangleLocationDetail): TriangleLocationDetail {\r\n result = TriangleLocationDetail.create(result);\r\n // Let r0 = ray.origin, d = ray.direction. Write intersection point p two ways for unknown scalars s,b0,b1,b2:\r\n // r0 + s*d = p = b0*v0 + b1*v1 + b2*v2\r\n // Subtract v0 from both ends, let u=v1-v0, v=v2-v0, c=r0-v0, and enforce b0+b1+b2=1:\r\n // b1*u + b2*v - s*d = c\r\n // This is a linear system Mx=c where M has columns u,v,d and solution x=(b1,b2,-s).\r\n const r0 = ray.origin;\r\n const d = ray.direction;\r\n const u = BarycentricTriangle._workVector0 = Vector3d.createStartEnd(\r\n this.points[0], this.points[1], BarycentricTriangle._workVector0\r\n );\r\n const v = BarycentricTriangle._workVector1 = Vector3d.createStartEnd(\r\n this.points[0], this.points[2], BarycentricTriangle._workVector1\r\n );\r\n const M = BarycentricTriangle._workMatrix = Matrix3d.createColumns(u, v, d, BarycentricTriangle._workMatrix);\r\n const c = Vector3d.createStartEnd(this.points[0], r0, BarycentricTriangle._workVector0); // reuse workVector0\r\n const solution = BarycentricTriangle._workVector1; // reuse workVector1\r\n if (undefined === M.multiplyInverse(c, solution))\r\n return result; // invalid\r\n result.a = -solution.z;\r\n ray.fractionToPoint(result.a, result.world);\r\n result.local.set(1.0 - solution.x - solution.y, solution.x, solution.y);\r\n const proj = this.closestPoint(result.local.x, result.local.y, result.local.z);\r\n result.closestEdgeIndex = proj.closestEdgeIndex;\r\n result.closestEdgeParam = proj.closestEdgeParam;\r\n return result;\r\n }\r\n /**\r\n * Compute the intersection of a line (parameterized as a line segment) with the plane of this triangle.\r\n * @param point0 start point of segment on line to intersect\r\n * @param point1 end point of segment on line to intersect\r\n * @param result optional pre-allocated object to fill and return\r\n * @returns details d of the line-plane intersection point `d.world`:\r\n * * `d.isValid` returns true if and only if the line intersects the plane.\r\n * * `d.classify` can be used to determine where the intersection lies with respect to the triangle.\r\n * * `d.a` is the intersection parameter. If `d.a` is in [0,1], the segment intersects the plane of the triangle.\r\n * @see [[intersectRay3d]]\r\n */\r\n public intersectSegment(point0: Point3d, point1: Point3d, result?: TriangleLocationDetail): TriangleLocationDetail {\r\n BarycentricTriangle._workRay = Ray3d.createStartEnd(point0, point1, BarycentricTriangle._workRay);\r\n return this.intersectRay3d(BarycentricTriangle._workRay, result);\r\n }\r\n /**\r\n * Adjust the location to the closest edge of the triangle if within either given tolerance.\r\n * @param location details of a point in the plane of the triangle (note that `location.local` and\r\n * `location.world` possibly updated to lie on the triangle closest edge)\r\n * @param distanceTolerance absolute distance tolerance (or zero to ignore)\r\n * @param parameterTolerance barycentric coordinate fractional tolerance (or zero to ignore)\r\n * @return whether the location was adjusted\r\n */\r\n public snapLocationToEdge(\r\n location: TriangleLocationDetail,\r\n distanceTolerance: number = Geometry.smallMetricDistance,\r\n parameterTolerance: number = Geometry.smallFraction\r\n ): boolean {\r\n if (!location.isValid)\r\n return false;\r\n // first try parametric tol to zero barycentric coordinate (no vertices or world distances used!)\r\n if (parameterTolerance > 0.0) {\r\n let numSnapped = 0;\r\n let newSum = 0.0;\r\n for (let i = 0; i < 3; i++) {\r\n const barycentricDist = Math.abs(location.local.at(i));\r\n if (barycentricDist > 0.0 && barycentricDist < parameterTolerance) {\r\n location.local.setAt(i, 0.0);\r\n numSnapped++;\r\n }\r\n newSum += location.local.at(i);\r\n }\r\n if (numSnapped > 0 && newSum > 0.0) {\r\n location.local.scaleInPlace(1.0 / newSum);\r\n if (1 === numSnapped) {\r\n location.closestEdgeIndex = BarycentricTriangle.edgeOppositeVertexIndexToStartVertexIndex(\r\n BarycentricTriangle.isOnBoundedEdge(location.local.x, location.local.y, location.local.z)\r\n );\r\n location.closestEdgeParam = 1.0 - location.local.at(location.closestEdgeIndex);\r\n } else { // 2 snapped, at vertex\r\n location.closestEdgeIndex = BarycentricTriangle.isOnVertex(\r\n location.local.x, location.local.y, location.local.z\r\n );\r\n location.closestEdgeParam = 0.0;\r\n }\r\n this.fractionToPoint(location.local.x, location.local.y, location.local.z, location.world);\r\n return true;\r\n }\r\n }\r\n // failing that, try distance tol to closest edge projection\r\n if (distanceTolerance > 0.0) {\r\n const i = location.closestEdgeIndex;\r\n const j = (i + 1) % 3;\r\n const k = (j + 1) % 3;\r\n const edgeProjection = BarycentricTriangle._workPoint = this.points[i].interpolate(\r\n location.closestEdgeParam, this.points[j], BarycentricTriangle._workPoint\r\n );\r\n const dist = location.world.distance(edgeProjection);\r\n if (dist > 0.0 && dist < distanceTolerance) {\r\n location.local.setAt(i, 1.0 - location.closestEdgeParam);\r\n location.local.setAt(j, location.closestEdgeParam);\r\n location.local.setAt(k, 0.0);\r\n location.world.setFrom(edgeProjection);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Return the dot product of the scaled normals of the two triangles.\r\n * * The sign of the return value is useful for determining the triangles' relative orientation:\r\n * positive (negative) means the normals point into the same (opposite) half-space determined by\r\n * one of the triangles' planes; zero means the triangles are perpendicular.\r\n */\r\n public dotProductOfCrossProductsFromOrigin(other: BarycentricTriangle): number {\r\n BarycentricTriangle._workVector0 = this.points[0].crossProductToPoints(\r\n this.points[1], this.points[2], BarycentricTriangle._workVector0\r\n );\r\n BarycentricTriangle._workVector1 = other.points[0].crossProductToPoints(\r\n other.points[1], other.points[2], BarycentricTriangle._workVector1\r\n );\r\n return BarycentricTriangle._workVector0.dotProduct(BarycentricTriangle._workVector1);\r\n }\r\n /** Return the centroid of the 3 points. */\r\n public centroid(result?: Point3d): Point3d {\r\n // Do the scale as true division (rather than multiply by precomputed 1/3). This might protect one bit of result.\r\n return Point3d.create(\r\n (this.points[0].x + this.points[1].x + this.points[2].x) / 3.0,\r\n (this.points[0].y + this.points[1].y + this.points[2].y) / 3.0,\r\n (this.points[0].z + this.points[1].z + this.points[2].z) / 3.0,\r\n result\r\n );\r\n }\r\n /** Return the incenter of the triangle. */\r\n public incenter(result?: Point3d): Point3d {\r\n const a = this.edgeLength(0);\r\n const b = this.edgeLength(1);\r\n const c = this.edgeLength(2);\r\n const scale = Geometry.safeDivideFraction(1.0, a + b + c, 0.0);\r\n return this.fractionToPoint(scale * a, scale * b, scale * c, result);\r\n }\r\n /** Return the circumcenter of the triangle. */\r\n public circumcenter(result?: Point3d): Point3d {\r\n const a2 = this.edgeLengthSquared(0);\r\n const b2 = this.edgeLengthSquared(1);\r\n const c2 = this.edgeLengthSquared(2);\r\n const x = a2 * (b2 + c2 - a2);\r\n const y = b2 * (c2 + a2 - b2);\r\n const z = c2 * (a2 + b2 - c2);\r\n const scale = Geometry.safeDivideFraction(1.0, x + y + z, 0.0);\r\n return this.fractionToPoint(scale * x, scale * y, scale * z, result);\r\n }\r\n /** Test for point-by-point `isAlmostEqual` relationship. */\r\n public isAlmostEqual(other: BarycentricTriangle, tol?: number): boolean {\r\n return this.points[0].isAlmostEqual(other.points[0], tol)\r\n && this.points[1].isAlmostEqual(other.points[1], tol)\r\n && this.points[2].isAlmostEqual(other.points[2], tol);\r\n }\r\n}\r\n"]}
@@ -98,54 +98,58 @@ export declare class Ray3d implements BeJSONFunctions {
98
98
  /** Convert {origin:[x,y,z], direction:[u,v,w]} to a Ray3d. */
99
99
  setFromJSON(json?: any): void;
100
100
  /**
101
- * Try to scale the direction vector to a given magnitude.
102
- * * Returns false if ray direction is a zero vector.
101
+ * Construct a JSON object from this Ray3d.
102
+ * @return {*} [origin,normal]
103
+ */
104
+ toJSON(): any;
105
+ /** Create a new ray from json object. See `setFromJSON` for json structure; */
106
+ static fromJSON(json?: any): Ray3d;
107
+ /**
108
+ * Try to scale the direction vector to a given `magnitude`.
109
+ * * Returns `false` if the ray direction is a zero vector.
103
110
  */
104
111
  trySetDirectionMagnitudeInPlace(magnitude?: number): boolean;
105
112
  /**
113
+ * Normalize the ray direction in place.
106
114
  * * If parameter `a` is clearly nonzero and the direction vector can be normalized,
107
- * * save the parameter `a` as the optional `a` member of the ray.
108
- * * normalize the ray's direction vector
115
+ * * Save the parameter `a` as the optional `a` member of the ray.
116
+ * * Normalize the ray's direction vector.
109
117
  * * If parameter `a` is nearly zero,
110
- * * Set the `a` member to zero
111
- * * Set the ray's direction vector to zero.
112
- * @param a area to be saved.
118
+ * * Set the `a` member to zero.
119
+ * * Set the ray's direction vector to zero.
120
+ * @param a value to be saved (e.g,. area).
121
+ * @returns `true` if `a` is nonzero and normalization was successful. Otherwise, return `false`.
113
122
  */
114
123
  tryNormalizeInPlaceWithAreaWeight(a: number): boolean;
115
- /**
116
- * Construct a JSON object from this Ray3d.
117
- * @return {*} [origin,normal]
118
- */
119
- toJSON(): any;
120
- /** Create a new ray from json object. See `setFromJSON` for json structure; */
121
- static fromJSON(json?: any): Ray3d;
122
- /** return distance from the ray to point in space */
124
+ /** Return distance from the ray to point in space. */
123
125
  distance(spacePoint: Point3d): number;
124
126
  /**
125
- * Return the intersection of the unbounded ray with a plane.
126
- * Stores the point of intersection in the result point given as a parameter,
127
- * and returns the parameter along the ray where the intersection occurs.
128
- * Returns undefined if the ray and plane are parallel or coplanar.
127
+ * Return the intersection parameter of the line defined by the ray with a `plane`.
128
+ * * Stores the point of intersection in the `result` point (if passed as a parameter) and returns the parameter
129
+ * along the ray where the intersection occurs. If we call the parameter 'f' then the point of intersection would
130
+ * be `ray.origin + f * ray.direction`. Therefore:
131
+ * * if ray intersects the plane at its origin, the function returns f = 0.
132
+ * * if intersects at `ray.origin + ray.direction`, the function returns f = 1.
133
+ * * if intersects behind the ray origin, the function returns f < 0.
134
+ * * if intersects after `ray.origin + ray.direction`, the function returns f > 1.
135
+ * * Returns `undefined` if the ray and plane are parallel or coplanar.
129
136
  */
130
137
  intersectionWithPlane(plane: Plane3dByOriginAndUnitNormal, result?: Point3d): number | undefined;
131
138
  /**
132
- * Find intersection of the ray with a Range3d.
133
- * * return the range of fractions (on the ray) which are "inside" the range.
134
- * * Note that a range is always returned; if there is no intersection it is indicated by the test `result.sNull`
139
+ * Find the intersection of the line defined by the ray with a Range3d.
140
+ * * Return the range of parameters (on the ray) which are "inside" the range.
141
+ * * Note that a range is always returned; if there is no intersection it is indicated by the test `result.isNull`.
135
142
  */
136
143
  intersectionWithRange3d(range: Range3d, result?: Range1d): Range1d;
137
144
  /**
138
- * Construct a vector from `ray.origin` to target point.
139
- * * return the part of the vector that is perpendicular to `ray.direction`.
140
- * * i.e., return the shortest vector from the ray to the point.
145
+ * Return the shortest vector `v` to `targetPoint` from the line defined by this ray.
146
+ * * If the projection of `targetPoint` onto the line defined by this ray is q, then `v  = targetPoint - q`.
141
147
  */
142
148
  perpendicularPartOfVectorToTarget(targetPoint: XYAndZ, result?: Vector3d): Vector3d;
143
149
  /**
144
- * Determine if two rays intersect, are fully overlapped, parallel but no coincident, or skew
145
- * * Return a CurveLocationDetailPair which
146
- * * contains fraction and point on each ray.
147
- * * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of
148
- * these relationships
150
+ * Determine if two rays intersect, or are fully overlapped, or parallel but not coincident, or skew.
151
+ * * Return a CurveLocationDetailPair which contains fraction and point on each ray and has
152
+ * annotation (in member `approachType`) indicating one of these relationships:
149
153
  * * CurveCurveApproachType.Intersection -- the rays have a simple intersection, at fractions indicated
150
154
  * in detailA and detailB
151
155
  * * CurveCurveApproachType.PerpendicularChord -- there is pair of where the rays have closest approach.
@@ -157,11 +161,11 @@ export declare class Ray3d implements BeJSONFunctions {
157
161
  */
158
162
  static closestApproachRay3dRay3d(rayA: Ray3d, rayB: Ray3d): CurveLocationDetailPair;
159
163
  /**
160
- * Return a ray with `ray.origin` interpolated between pt1 and pt2 at the given fraction
161
- * and `ray.direction` set to the vector from pt1 to pt2 multiplied by the given scale factor.
162
- * @param pt1 start point of interpolation.
164
+ * Return a ray with `ray.origin` interpolated between `pt1` and `pt2` at the given `fraction`
165
+ * and `ray.direction` set to the vector from `pt1` to `pt2` multiplied by the given `tangentScale`.
166
+ * @param pt1 start point of the interpolation.
163
167
  * @param fraction fractional position between points.
164
- * @param pt2 endpoint of interpolation.
168
+ * @param pt2 end point of the interpolation.
165
169
  * @param tangentScale scale factor to apply to the startToEnd vector.
166
170
  * @param result optional receiver.
167
171
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Ray3d.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Ray3d.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Ray3d.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Ray3d.ts"],"names":[],"mappings":"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"}
@@ -240,8 +240,21 @@ class Ray3d {
240
240
  this.direction.setFromJSON(json.direction);
241
241
  }
242
242
  /**
243
- * Try to scale the direction vector to a given magnitude.
244
- * * Returns false if ray direction is a zero vector.
243
+ * Construct a JSON object from this Ray3d.
244
+ * @return {*} [origin,normal]
245
+ */
246
+ toJSON() {
247
+ return { origin: this.origin.toJSON(), direction: this.direction.toJSON() };
248
+ }
249
+ /** Create a new ray from json object. See `setFromJSON` for json structure; */
250
+ static fromJSON(json) {
251
+ const result = Ray3d.createXAxis();
252
+ result.setFromJSON(json);
253
+ return result;
254
+ }
255
+ /**
256
+ * Try to scale the direction vector to a given `magnitude`.
257
+ * * Returns `false` if the ray direction is a zero vector.
245
258
  */
246
259
  trySetDirectionMagnitudeInPlace(magnitude = 1.0) {
247
260
  if (this.direction.tryNormalizeInPlace()) {
@@ -253,17 +266,16 @@ class Ray3d {
253
266
  return false;
254
267
  }
255
268
  /**
269
+ * Normalize the ray direction in place.
256
270
  * * If parameter `a` is clearly nonzero and the direction vector can be normalized,
257
- * * save the parameter `a` as the optional `a` member of the ray.
258
- * * normalize the ray's direction vector
271
+ * * Save the parameter `a` as the optional `a` member of the ray.
272
+ * * Normalize the ray's direction vector.
259
273
  * * If parameter `a` is nearly zero,
260
- * * Set the `a` member to zero
261
- * * Set the ray's direction vector to zero.
262
- * @param a area to be saved.
274
+ * * Set the `a` member to zero.
275
+ * * Set the ray's direction vector to zero.
276
+ * @param a value to be saved (e.g,. area).
277
+ * @returns `true` if `a` is nonzero and normalization was successful. Otherwise, return `false`.
263
278
  */
264
- // input a ray and "a" understood as an area.
265
- // if a is clearly nonzero metric squared and the vector can be normalized, install those and return true.
266
- // otherwise set ray.z to zero and zero the vector of the ray and return false.
267
279
  tryNormalizeInPlaceWithAreaWeight(a) {
268
280
  const tolerance = Geometry_1.Geometry.smallMetricDistanceSquared;
269
281
  this.a = a;
@@ -273,20 +285,7 @@ class Ray3d {
273
285
  this.a = 0.0;
274
286
  return false;
275
287
  }
276
- /**
277
- * Construct a JSON object from this Ray3d.
278
- * @return {*} [origin,normal]
279
- */
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; */
284
- static fromJSON(json) {
285
- const result = Ray3d.createXAxis();
286
- result.setFromJSON(json);
287
- return result;
288
- }
289
- /** return distance from the ray to point in space */
288
+ /** Return distance from the ray to point in space. */
290
289
  distance(spacePoint) {
291
290
  const uu = this.direction.magnitudeSquared();
292
291
  const uv = this.dotProductToPoint(spacePoint);
@@ -297,10 +296,15 @@ class Ray3d {
297
296
  return Math.sqrt(this.origin.distanceSquared(spacePoint));
298
297
  }
299
298
  /**
300
- * Return the intersection of the unbounded ray with a plane.
301
- * Stores the point of intersection in the result point given as a parameter,
302
- * and returns the parameter along the ray where the intersection occurs.
303
- * Returns undefined if the ray and plane are parallel or coplanar.
299
+ * Return the intersection parameter of the line defined by the ray with a `plane`.
300
+ * * Stores the point of intersection in the `result` point (if passed as a parameter) and returns the parameter
301
+ * along the ray where the intersection occurs. If we call the parameter 'f' then the point of intersection would
302
+ * be `ray.origin + f * ray.direction`. Therefore:
303
+ * * if ray intersects the plane at its origin, the function returns f = 0.
304
+ * * if intersects at `ray.origin + ray.direction`, the function returns f = 1.
305
+ * * if intersects behind the ray origin, the function returns f < 0.
306
+ * * if intersects after `ray.origin + ray.direction`, the function returns f > 1.
307
+ * * Returns `undefined` if the ray and plane are parallel or coplanar.
304
308
  */
305
309
  intersectionWithPlane(plane, result) {
306
310
  const vectorA = Point3dVector3d_1.Vector3d.createStartEnd(plane.getOriginRef(), this.origin);
@@ -319,9 +323,9 @@ class Ray3d {
319
323
  return division;
320
324
  }
321
325
  /**
322
- * Find intersection of the ray with a Range3d.
323
- * * return the range of fractions (on the ray) which are "inside" the range.
324
- * * Note that a range is always returned; if there is no intersection it is indicated by the test `result.sNull`
326
+ * Find the intersection of the line defined by the ray with a Range3d.
327
+ * * Return the range of parameters (on the ray) which are "inside" the range.
328
+ * * Note that a range is always returned; if there is no intersection it is indicated by the test `result.isNull`.
325
329
  */
326
330
  intersectionWithRange3d(range, result) {
327
331
  if (range.isNull)
@@ -334,9 +338,8 @@ class Ray3d {
334
338
  return interval;
335
339
  }
336
340
  /**
337
- * Construct a vector from `ray.origin` to target point.
338
- * * return the part of the vector that is perpendicular to `ray.direction`.
339
- * * i.e., return the shortest vector from the ray to the point.
341
+ * Return the shortest vector `v` to `targetPoint` from the line defined by this ray.
342
+ * * If the projection of `targetPoint` onto the line defined by this ray is q, then `v  = targetPoint - q`.
340
343
  */
341
344
  perpendicularPartOfVectorToTarget(targetPoint, result) {
342
345
  const vectorV = Point3dVector3d_1.Vector3d.createStartEnd(this.origin, targetPoint);
@@ -346,11 +349,9 @@ class Ray3d {
346
349
  return vectorV.plusScaled(this.direction, -fraction, result);
347
350
  }
348
351
  /**
349
- * Determine if two rays intersect, are fully overlapped, parallel but no coincident, or skew
350
- * * Return a CurveLocationDetailPair which
351
- * * contains fraction and point on each ray.
352
- * * has (in the CurveLocationDetailPair structure, as member approachType) annotation indicating one of
353
- * these relationships
352
+ * Determine if two rays intersect, or are fully overlapped, or parallel but not coincident, or skew.
353
+ * * Return a CurveLocationDetailPair which contains fraction and point on each ray and has
354
+ * annotation (in member `approachType`) indicating one of these relationships:
354
355
  * * CurveCurveApproachType.Intersection -- the rays have a simple intersection, at fractions indicated
355
356
  * in detailA and detailB
356
357
  * * CurveCurveApproachType.PerpendicularChord -- there is pair of where the rays have closest approach.
@@ -370,25 +371,27 @@ class Ray3d {
370
371
  fractionB = intersectionFractions.y;
371
372
  pointA = rayA.fractionToPoint(fractionA);
372
373
  pointB = rayB.fractionToPoint(fractionB);
373
- pairType = pointA.isAlmostEqualMetric(pointB) ? CurveLocationDetail_1.CurveCurveApproachType.Intersection : CurveLocationDetail_1.CurveCurveApproachType.PerpendicularChord;
374
+ pairType = pointA.isAlmostEqualMetric(pointB) ?
375
+ CurveLocationDetail_1.CurveCurveApproachType.Intersection : CurveLocationDetail_1.CurveCurveApproachType.PerpendicularChord;
374
376
  }
375
377
  else {
376
378
  fractionB = 0.0;
377
379
  fractionA = rayA.pointToFraction(rayB.origin);
378
380
  pointA = rayA.fractionToPoint(fractionA);
379
381
  pointB = rayB.fractionToPoint(fractionB);
380
- pairType = pointA.isAlmostEqualMetric(pointB) ? CurveLocationDetail_1.CurveCurveApproachType.CoincidentGeometry : CurveLocationDetail_1.CurveCurveApproachType.ParallelGeometry;
382
+ pairType = pointA.isAlmostEqualMetric(pointB) ?
383
+ CurveLocationDetail_1.CurveCurveApproachType.CoincidentGeometry : CurveLocationDetail_1.CurveCurveApproachType.ParallelGeometry;
381
384
  }
382
385
  const pair = CurveLocationDetail_1.CurveLocationDetailPair.createCapture(CurveLocationDetail_1.CurveLocationDetail.createRayFractionPoint(rayA, fractionA, rayA.fractionToPoint(fractionA)), CurveLocationDetail_1.CurveLocationDetail.createRayFractionPoint(rayB, fractionB, rayB.fractionToPoint(fractionB)));
383
386
  pair.approachType = pairType;
384
387
  return pair;
385
388
  }
386
389
  /**
387
- * Return a ray with `ray.origin` interpolated between pt1 and pt2 at the given fraction
388
- * and `ray.direction` set to the vector from pt1 to pt2 multiplied by the given scale factor.
389
- * @param pt1 start point of interpolation.
390
+ * Return a ray with `ray.origin` interpolated between `pt1` and `pt2` at the given `fraction`
391
+ * and `ray.direction` set to the vector from `pt1` to `pt2` multiplied by the given `tangentScale`.
392
+ * @param pt1 start point of the interpolation.
390
393
  * @param fraction fractional position between points.
391
- * @param pt2 endpoint of interpolation.
394
+ * @param pt2 end point of the interpolation.
392
395
  * @param tangentScale scale factor to apply to the startToEnd vector.
393
396
  * @param result optional receiver.
394
397
  */