Пример #1
0
        public void DrawFrequencyAxis()
        {
            freqTicks.Clear();
            frequencyLabels.Clear();

            float projectionHeight = this.Height - SpectrogramViewer.PADDING_BOTTOM;

            double[] freqRange = parent.GetFrequencyRangeInView();
            if (freqRange == null)
            {
                return;
            }
            double lowFreq  = freqRange[1];
            double highFreq = freqRange[0];

            if (lowFreq == highFreq)
            {
                return;
            }
            double        range       = highFreq - lowFreq;
            List <double> freqSamples = new List <double>();
            double        bandSize;

            if (range < 10)
            {
                bandSize = 1;
            }
            else if (range < 25)
            {
                bandSize = 2;
            }
            else if (range < 80)
            {
                bandSize = 5;
            }
            else if (range < 160)
            {
                bandSize = 10;
            }
            else if (range < 325)
            {
                bandSize = 25;
            }
            else if (range < 750)
            {
                bandSize = 50;
            }
            else if (range < 1500)
            {
                bandSize = 100;
            }
            else if (range < 4000)
            {
                bandSize = 250;
            }
            else
            {
                bandSize = 500;
            }

            int    numBands     = (int)(range / bandSize);
            double endRemainder = highFreq % bandSize;
            double currentFreq  = highFreq - endRemainder;

            freqSamples.Add(currentFreq);

            for (int i = 0; i < numBands; i++)
            {
                currentFreq -= bandSize;
                freqSamples.Add(currentFreq);
            }

            for (int i = 0; i < freqSamples.Count; i++)
            {
                double freqPos   = 1 - (double)(freqSamples[i] - lowFreq) / range;
                Label  freqLabel = new Label();
                freqLabel.TextAlign = ContentAlignment.MiddleCenter;
                freqLabel.Top       = (int)(projectionHeight * freqPos) - freqLabel.Height / 2;
                freqLabel.Left      = -freqLabel.Width / 4;
                freqLabel.Text      = freqSamples[i].ToString("0.##") + " Hz";
                freqLabel.Font      = new Font(Form1.fonts.Families[0], 7.8F, FontStyle.Regular, GraphicsUnit.Point);
                this.Controls.Add(freqLabel);
                frequencyLabels.Add(freqLabel);

                Rectangle primaryTick = new Rectangle(SpectrogramViewer.PADDING_LEFT - 2, freqLabel.Top + freqLabel.Height / 2, 2, 1);

                if (freqTicks.Count > 0)
                {
                    Rectangle secondaryTick = new Rectangle(SpectrogramViewer.PADDING_LEFT - 5, (freqTicks[i * 2 - 2].Y + primaryTick.Y) / 2, 5, 1);
                    freqTicks.Add(secondaryTick);
                }
                freqTicks.Add(primaryTick);
            }

            if (freqSamples.Count > 1)
            {
                if (freqSamples[0] - lowFreq >= (freqSamples[1] - freqSamples[0]) / 2)
                {
                    Rectangle secondaryTick = new Rectangle(SpectrogramViewer.PADDING_LEFT - 5, freqTicks[0].Y - (freqTicks[1].Y - freqTicks[0].Y), 5, 1);
                    freqTicks.Add(secondaryTick);
                }

                if (highFreq - freqSamples[freqSamples.Count - 1] >= (freqSamples[freqSamples.Count - 1] - freqSamples[freqSamples.Count - 2]) / 2)
                {
                    Rectangle secondaryTick = new Rectangle(SpectrogramViewer.PADDING_LEFT - 5, freqTicks[freqTicks.Count - 1].Y + (freqTicks[1].Y - freqTicks[0].Y), 5, 1);
                    freqTicks.Add(secondaryTick);
                }
            }

            if (parent.MySpectrogramHandler.Spectrogram.FrequencyScale.GetType().Name == "Func`2")
            {
                foreach (Label freqLabel in frequencyLabels)
                {
                    float  labelPos = (projectionHeight - freqLabel.Top + freqLabel.Height / 2) / projectionHeight;
                    double newFreq  = parent.GetFrequencyPoint(labelPos);
                    freqLabel.Text = newFreq.ToString("0") + " Hz";
                }
            }
        }