Example #1
0
        private static BBNode Compute(IList <IPrimitive> primitiveList)
        {
            BBNode root = new BBNode();

            root.AddPrimitives(primitiveList, 0);

            return(root);
        }
Example #2
0
        public void AddPrimitives(IList <IPrimitive> list, int depth)
        {
            if (list.Count == 1)
            {
                Left = new BBNode(list[0]);
                Box  = list[0].GetBoundingBox();
            }
            else if (list.Count == 2)
            {
                Left  = new BBNode(list[0]);
                Right = new BBNode(list[1]);
                Box   = BoundingBox.Merge(list[0].GetBoundingBox(), list[1].GetBoundingBox());
            }
            else
            {
                int k = 3; // 3 dimensions

                int axis   = depth % k;
                int median = list.Count / 2;

                IList <IPrimitive> axisSorted = list.OrderBy(p => p.GetBoundingBox().Middle(axis)).ToList();

                Box = BoundingBox.MergeAll(list);

                IList <IPrimitive> left  = list.Take(median).ToList();
                IList <IPrimitive> right = list.Skip(median).ToList();

                if (left.Any())
                {
                    Left = new BBNode();
                    Left.AddPrimitives(left, depth + 1);
                }
                if (right.Any())
                {
                    Right = new BBNode();
                    Right.AddPrimitives(right, depth + 1);
                }
            }
        }