Пример #1
0
    protected override void SortAlgorithm(GrassDataChunkDataPerLM d)
    {
        int           count   = d.count;
        List <float>  dis     = new List <float> (count);
        MaxHeap <int> minHeap = new MaxHeap <int>(count);

        for (int i = 0; i < count; i++)
        {
            dis.Add(Vector3.Distance(d.pos [i], GrassRenderer.playerPos));
            minHeap.PushObj(i, Vector3.Distance(d.pos [i], GrassRenderer.playerPos));
        }
        List <int> rs = new List <int> ();

        minHeap.FlushResult(rs);

        for (int i = 0; i < rs.Count; i++)
        {
            int indexInB = rs [i];
            d.posB [i] = d.pos [indexInB];
            d.masB [i] = d.mas [indexInB];
            d.uvB [i]  = d.uv [indexInB];
        }
        d.Swap();
    }
Пример #2
0
    protected override void SortAlgorithm(GrassDataChunkDataPerLM d)
    {
        int count = d.count;

        for (int i = 0; i < count; i++)
        {
            //d.dis[i] = (int)Vector3.Distance (d.pos [i], GrassRenderer.playerPos)*10;

            var x = d.pos [i];
            var y = GrassRenderer.playerPos;

            var xx = (x.x - y.x);
            var yy = (x.y - y.y);
            var zz = (x.z - y.z);

            d.dis[i] = (int)(xx * xx + yy * yy + zz * zz * 10);
        }
        var a = d.dis;


        //1 min max
        int max = int.MinValue;
        int min = int.MaxValue;

        for (int i = 0; i < a.Length; i++)
        {
            if (a [i] > max)
            {
                max = a [i];
            }
            if (a [i] < min)
            {
                min = a [i];
            }
        }

        //2 count
        int[] c = new int[max - min + 1];
        for (int i = 0; i < a.Length; i++)
        {
            int index = a [i] - min;
            c [index]++;
        }
        int cLength = c.Length;

        //3 accum
        for (int i = 1; i < cLength; i++)
        {
            c [i] += c [i - 1];
        }


        for (int i = 0; i < a.Length; i++)
        {
            int indexInB = (c [a [i] - min]--) - 1;
            d.posB [indexInB] = d.pos [i];
            d.masB [indexInB] = d.mas [i];
            d.uvB [indexInB]  = d.uv [i];
        }
        d.Swap();
    }