public Vector3d Project(Vector3d vPoint, int identifier = -1) { int tNearestID = Spatial.FindNearestTriangle(vPoint); DistPoint3Triangle3 q = MeshQueries.TriangleDistance(Mesh, tNearestID, vPoint); return(q.TriangleClosest); }
public Vector3d FindNearestAndOffset(Vector3d pos) { int tNearestID = Spatial.FindNearestTriangle(pos); DistPoint3Triangle3 q = MeshQueries.TriangleDistance(Mesh, tNearestID, pos); Vector3d vHitNormal = (UseFaceNormal == false && Mesh.HasVertexNormals) ? Mesh.GetTriBaryNormal(tNearestID, q.TriangleBaryCoords.x, q.TriangleBaryCoords.y, q.TriangleBaryCoords.z) : Mesh.GetTriNormal(tNearestID); return(q.TriangleClosest + Distance * vHitNormal); }
public virtual Vector3d Project(Vector3d vPoint, int identifier = -1) { int tNearestID = Spatial.FindNearestTriangle(vPoint); var triangle = new Triangle3d(); Mesh.GetTriVertices(tNearestID, ref triangle.V0, ref triangle.V1, ref triangle.V2); Vector3d nearPt, bary; DistPoint3Triangle3.DistanceSqr(ref vPoint, ref triangle, out nearPt, out bary); return(nearPt); }
/// <summary> /// construct a DistPoint3Triangle3 object for a mesh triangle /// </summary> public static DistPoint3Triangle3 TriangleDistance(DMesh3 mesh, int ti, Vector3d point) { if (!mesh.IsTriangle(ti)) { return(null); } Triangle3d tri = new Triangle3d(); mesh.GetTriVertices(ti, ref tri.V0, ref tri.V1, ref tri.V2); DistPoint3Triangle3 q = new DistPoint3Triangle3(point, tri); q.GetSquared(); return(q); }
/// <summary> /// Find distance from point to mesh /// Returns interpolated vertex-normal frame if available, otherwise tri-normal frame. /// </summary> public static double NearestPointDistance(DMesh3 mesh, ISpatial spatial, Vector3d queryPoint, double maxDist = double.MaxValue) { int tid = spatial.FindNearestTriangle(queryPoint, maxDist); if (tid == DMesh3.InvalidID) { return(double.MaxValue); } Triangle3d tri = new Triangle3d(); mesh.GetTriVertices(tid, ref tri.V0, ref tri.V1, ref tri.V2); Vector3d closest, bary; double dist_sqr = DistPoint3Triangle3.DistanceSqr(ref queryPoint, ref tri, out closest, out bary); return(Math.Sqrt(dist_sqr)); }
public double GetSquared() { if (DistanceSquared >= 0) { return(DistanceSquared); } var line = new Line3d(segment.Center, segment.Direction); var queryLT = new DistLine3Triangle3(line, triangle); double sqrDist = queryLT.GetSquared(); SegmentParam = queryLT.LineParam; if (SegmentParam >= -segment.Extent) { if (SegmentParam <= segment.Extent) { SegmentClosest = queryLT.LineClosest; TriangleClosest = queryLT.TriangleClosest; TriangleBaryCoords = queryLT.TriangleBaryCoords; } else { SegmentClosest = segment.P1; var queryPT = new DistPoint3Triangle3(SegmentClosest, triangle); sqrDist = queryPT.GetSquared(); TriangleClosest = queryPT.TriangleClosest; SegmentParam = segment.Extent; TriangleBaryCoords = queryPT.TriangleBaryCoords; } } else { SegmentClosest = segment.P0; var queryPT = new DistPoint3Triangle3(SegmentClosest, triangle); sqrDist = queryPT.GetSquared(); TriangleClosest = queryPT.TriangleClosest; SegmentParam = -segment.Extent; TriangleBaryCoords = queryPT.TriangleBaryCoords; } DistanceSquared = sqrDist; return(DistanceSquared); }
// for each From[i], find closest point on TargetSurface void update_to() { double max_dist = double.MaxValue; bool bNormals = (UseNormals && Source.HasVertexNormals); var range = Interval1i.Range(From.Length); gParallel.ForEach(range, (vi) => { int tid = TargetSurface.FindNearestTriangle(From[vi], max_dist); if (tid == DMesh3.InvalidID) { Weights[vi] = 0; return; } DistPoint3Triangle3 d = MeshQueries.TriangleDistance(TargetSurface.Mesh, tid, From[vi]); if (d.DistanceSquared > MaxAllowableDistance * MaxAllowableDistance) { Weights[vi] = 0; return; } To[vi] = d.TriangleClosest; Weights[vi] = 1.0f; if (bNormals) { Vector3d fromN = Rotation * Source.GetVertexNormal(vi); Vector3d toN = TargetSurface.Mesh.GetTriNormal(tid); double fDot = fromN.Dot(toN); Debug.Assert(MathUtil.IsFinite(fDot)); if (fDot < 0) { Weights[vi] = 0; } else { Weights[vi] += Math.Sqrt(fDot); } } }); }