示例#1
0
        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);
            }
示例#3
0
        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);
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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);
        }
示例#7
0
        // 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);
                    }
                }
            });
        }