Beispiel #1
0
 public void PrepareFastSearch()
 {
     tree = new TopoTriangleNode(null);
     foreach (TopoTriangle triangle in triangles)
     {
         tree.AddTriangle(triangle);
     }
 }
Beispiel #2
0
        public bool RemoveTriangle(TopoTriangle triangle)
        {
            TopoTriangleNode node = FindNodeForTriangle(triangle);

            if (node != null)
            {
                return(node.triangles.Remove(triangle));
            }
            return(false);
        }
Beispiel #3
0
 public TopoTriangleNode(TopoTriangleNode _parent)
 {
     parent = _parent;
 }
Beispiel #4
0
 public void Clear()
 {
     tree = null;
     triangles.Clear();
 }
Beispiel #5
0
        private void TrySplit()
        {
            int newDim          = 0;
            int parentDimension = -1;

            if (parent != null)
            {
                parentDimension = parent.dimension;
            }
            RHVector3 size = box.Size;

            if (parentDimension != 0)
            {
                newDim = 0;
            }
            if (parentDimension != 1 && size.x < size.y)
            {
                newDim = 1;
            }
            if (parentDimension != 2 && size.z > size[newDim])
            {
                newDim = 2;
            }
            int    loop           = 0;
            int    maxLoop        = 4;
            double bestCenter     = 0;
            double bestPercentage = 3000;
            int    bestDim        = 0;

            for (int dim = 0; dim < 3; dim++)
            {
                if (dim == parentDimension)
                {
                    continue;
                }
                for (loop = 0; loop < maxLoop; loop++)
                {
                    int    count    = 0;
                    double testDist = box.minPoint[newDim] + size[newDim] * (1 + loop) / (maxLoop + 1);
                    foreach (TopoTriangle tri in triangles)
                    {
                        if (tri.boundingBox.maxPoint[newDim] < testDist)
                        {
                            count++;
                        }
                    }
                    double percent = 100.0 * (double)count / triangles.Count;
                    if (Math.Abs(50 - percent) < bestPercentage)
                    {
                        bestPercentage = percent;
                        bestCenter     = testDist;
                        bestDim        = dim;
                    }
                }
            }
            if (bestPercentage < 5)
            {
                nextTrySplit = (nextTrySplit * 3) / 2;
                return; // not effective enough
            }
            left           = new TopoTriangleNode(this);
            right          = new TopoTriangleNode(this);
            middle         = new TopoTriangleNode(this);
            dimension      = newDim;
            middlePosition = bestCenter;
            foreach (TopoTriangle tri in triangles)
            {
                if (tri.boundingBox.maxPoint[dimension] < middlePosition)
                {
                    left.AddTriangle(tri);
                }
                else if (tri.boundingBox.minPoint[dimension] > middlePosition)
                {
                    right.AddTriangle(tri);
                }
                else
                {
                    middle.AddTriangle(tri);
                }
            }
            triangles = null;
        }