private static BBNode Compute(IList <IPrimitive> primitiveList) { BBNode root = new BBNode(); root.AddPrimitives(primitiveList, 0); return(root); }
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); } } }