示例#1
0
        void BuildRecursivly(BinNode <List <Triangle3D> > node)
        {
            if (node.data.Count <= 1)
            {
                return;
            }

            Triangle3D main  = node.data[0];
            Plane      plane = new Plane(main.a, main.normal);

            for (int i = 1; i < node.data.Count; i++)
            {
                Triangle3D go = node.data[i];

                float fa = Helper.SnapToZero(plane.Point(go.a));
                float fb = Helper.SnapToZero(plane.Point(go.b));
                float fc = Helper.SnapToZero(plane.Point(go.c));

                if (fa >= 0 && fb >= 0 && fc >= 0)
                {
                    if (node.right == null)
                    {
                        node.right      = new BinNode <List <Triangle3D> >(new List <Triangle3D>());
                        node.right.data = new List <Triangle3D>();
                    }

                    node.right.data.Add(go);
                }
                else if (fa <= 0 && fb <= 0 && fc <= 0)
                {
                    if (node.left == null)
                    {
                        node.left      = new BinNode <List <Triangle3D> >(new List <Triangle3D>());
                        node.left.data = new List <Triangle3D>();
                    }

                    node.left.data.Add(go);
                }
                else
                {
                    List <Triangle3D> ts = Rasterizer.ClipTriangle(go, plane);
                    node.data.AddRange(ts);
                    node.data.RemoveAt(i);
                    i--;
                }
            }

            node.data.RemoveRange(1, node.data.Count - 1);

            if (node.left != null)
            {
                BuildRecursivly(node.left);
            }

            if (node.right != null)
            {
                BuildRecursivly(node.right);
            }
        }