public WaterWave[] FindMostMeaningfulWaves(int waveCount)
        {
            Heap <WaterWave> heap = new Heap <WaterWave>();

            for (int i = this._SpectraDataList.Count - 1; i >= 0; i--)
            {
                WaterWavesSpectrumDataBase waterWavesSpectrumDataBase = this._SpectraDataList[i];
                waterWavesSpectrumDataBase.UpdateSpectralValues(this.WindDirection, this._WindWaves.SpectrumDirectionality);
                object obj = waterWavesSpectrumDataBase;
                lock (obj)
                {
                    float weight = waterWavesSpectrumDataBase.Weight;
                    foreach (WaterWave element in waterWavesSpectrumDataBase.CpuWaves)
                    {
                        element._Amplitude   *= weight;
                        element._CPUPriority *= weight;
                        heap.Insert(element);
                        if (heap.Count > waveCount)
                        {
                            heap.ExtractMax();
                        }
                    }
                }
            }
            return(heap.ToArray <WaterWave>());
        }
        public GerstnerWave[] SelectShorelineWaves(int waveCount, float angle, float coincidenceRange)
        {
            Heap <WaterWave> heap = new Heap <WaterWave>();

            for (int i = this._SpectraDataList.Count - 1; i >= 0; i--)
            {
                WaterWavesSpectrumDataBase waterWavesSpectrumDataBase = this._SpectraDataList[i];
                waterWavesSpectrumDataBase.UpdateSpectralValues(this.WindDirection, this._WindWaves.SpectrumDirectionality);
                object obj = waterWavesSpectrumDataBase;
                lock (obj)
                {
                    float weight = waterWavesSpectrumDataBase.Weight;
                    foreach (WaterWave element in waterWavesSpectrumDataBase.ShorelineCandidates)
                    {
                        element._Amplitude   *= weight;
                        element._CPUPriority *= weight;
                        float current = Mathf.Atan2(element._Nkx, element._Nky) * 57.29578f;
                        if (Mathf.Abs(Mathf.DeltaAngle(current, angle)) < coincidenceRange && element._Amplitude > 0.025f)
                        {
                            heap.Insert(element);
                            if (heap.Count > waveCount)
                            {
                                heap.ExtractMax();
                            }
                        }
                    }
                }
            }
            Vector2[] array = new Vector2[4];
            for (int k = 0; k < 4; k++)
            {
                float num = this._WindWaves.TileSizes[k];
                array[k].x = num + 0.5f / (float)this._WindWaves.FinalResolution * num;
                array[k].y = -num + 0.5f / (float)this._WindWaves.FinalResolution * num;
            }
            WaterWave[] array2 = heap.ToArray <WaterWave>();
            int         num2   = Mathf.Min(heap.Count, waveCount);

            GerstnerWave[] array3 = new GerstnerWave[num2];
            for (int l = 0; l < num2; l++)
            {
                array3[l] = new GerstnerWave(array2[heap.Count - l - 1], array);
            }
            return(array3);
        }