示例#1
0
        public bool ClosestPoint(int[] objectIndexArray, int firstIndex, int indexCount, V3d queryPoint, Func <IIntersectableObjectSet, int, bool> ios_index_objectFilter, Func <IIntersectableObjectSet, int, int, ObjectClosestPoint, bool> ios_index_part_ocp_pointFilter, ref ObjectClosestPoint closestPoint)
        {
            var minDist2 = closestPoint.DistanceSquared;
            var minIndex = -1;
            var minPos   = V3d.NaN;

            for (int i = 0; i < indexCount; i++)
            {
                var id = objectIndexArray[firstIndex + i];

                if (ios_index_objectFilter(this, id))
                {
                    GetTriangle(id, out V3d p0, out V3d p1, out V3d p2);
                    var p = queryPoint.GetClosestPointOnTriangle(p0, p1, p2);
                    var d = V3d.DistanceSquared(p, queryPoint);

                    if (d < minDist2)
                    {
                        d        = minDist2;
                        minIndex = id;
                        minPos   = p;
                    }
                }
            }

            if (minIndex >= 0)
            {
                closestPoint = new ObjectClosestPoint()
                {
                    Distance        = Fun.Sqrt(minDist2),
                    DistanceSquared = minDist2,
                    Point           = minPos,
                    SetObject       = new SetObject(this, minIndex),
                    ObjectStack     = new List <SetObject>(), // TODO
                    Coord           = V2d.Zero                // TODO
                };

                return(true);
            }
            else
            {
                return(false);
            }
        }
        public bool ClosestPoint(
            int[] objectIndexArray, int firstIndex, int indexCount,
            V3d query,
            Func <IIntersectableObjectSet, int, bool> ios_index_objectFilter,
            Func <IIntersectableObjectSet, int, int, ObjectClosestPoint, bool> ios_index_part_ocp_pointFilter,
            ref ObjectClosestPoint closest)
        {
            var  plist  = Position3dList;
            bool result = false;

            for (int i = firstIndex, e = firstIndex + indexCount; i < e; i++)
            {
                int index = objectIndexArray[i];
                int pi    = index * 3;
                V3d p     = query.GetClosestPointOnTriangle(
                    plist[pi], plist[pi + 1], plist[pi + 2]);
                double d2 = V3d.DistanceSquared(query, p);
                if (d2 < closest.DistanceSquared)
                {
                    result = closest.Set(d2, p, this, index);
                }
            }
            return(result);
        }
示例#3
0
        public bool ClosestPoint(
            int[] objectIndexArray, int firstIndex, int indexCount,
            V3d queryPoint,
            Func <IIntersectableObjectSet, int, bool> ios_index_objectFilter,
            Func <IIntersectableObjectSet, int, int, ObjectClosestPoint, bool> ios_index_part_ocp_pointFilter,
            ref ObjectClosestPoint closestPoint)
        {
            bool result = false;

            int[] fia = FirstIndexArray, via = VertexIndexArray;
            var   pa  = PositionArray;

            for (int i = firstIndex, e = firstIndex + indexCount; i < e; i++)
            {
                int oi = objectIndexArray[i];
                if (ios_index_objectFilter != null &&
                    !ios_index_objectFilter(this, oi))
                {
                    continue;
                }
                int fvi = fia[oi], fve = fia[oi + 1];
                V3d p0 = pa[via[fvi++]], p1 = pa[via[fvi++]];
                while (fvi < fve)
                {
                    var    p2 = pa[via[fvi++]];
                    V3d    p  = queryPoint.GetClosestPointOnTriangle(p0, p1, p2);
                    double d2 = V3d.DistanceSquared(queryPoint, p);
                    if (d2 < closestPoint.DistanceSquared)
                    {
                        result = closestPoint.Set(d2, p, this, oi);
                    }
                    p1 = p2;
                }
            }
            return(result);
        }