public void Sort(GrassDataChunkDataPerLM d) { if (d.count == 0) { Debug.LogError("No need to sort"); return; } SortAlgorithm(d); // for (int i = 0; i < d.count; i++) { // d.mas [i] = Matrix4x4.TRS (d.pos[i], Quaternion.identity, Vector3.one*0.05f*i); // } }
protected override void SortAlgorithm(GrassDataChunkDataPerLM d) { int count = d.count; float[] dis = new float[count]; for (int i = 0; i < count; i++) { dis[i] = Vector3.Distance(d.pos [i], GrassRenderer.playerPos); } for (int i = 0; i < dis.Length; i++) { float min = float.MaxValue; int minID = -1; for (int j = i; j < dis.Length; j++) { if (dis [j] < min) { min = dis [j]; minID = j; } } dis [minID] = dis [i]; dis [i] = min; var posMin = d.pos [minID]; d.pos [minID] = d.pos [i]; d.pos [i] = posMin; var uvMin = d.uv [minID]; d.uv [minID] = d.uv [i]; d.uv [i] = uvMin; var masMin = d.mas [minID]; d.mas [minID] = d.mas [i]; d.mas [i] = masMin; d.mas [i] = Matrix4x4.TRS(d.pos[i], Quaternion.identity, Vector3.one * 0.05f * i); } }
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(); }
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(); }
protected virtual void SortAlgorithm(GrassDataChunkDataPerLM d) { }