CHART per grafico

di il
3 risposte

CHART per grafico

Ciao

In VBnet usando CHART1 (se non c'è di meglio...) vorrei poter creare un grafico tipo questo:

equalizzatore.jpg
equalizzatore.jpg

Evidentemente creerebbe SOLO 3 linee nel grafico e non 24... una per F1 una per F2 e una per F3...

Per creare la prima... che poi potrei replicare essendo uguali, ho le tre variabili:
G1 => -20 / +10
F1 => 100Hz / 700Hz
Q1 => 0-10

Grafico X 100/3200
Grafico Y -20/+10

Premetto che non ho idea di come fare ste linee... ho solo i "numerici" di G1, F1, e Q1 che creo con tre HScrollBar.

Ho messo il controllo CHARTtype su SPLINE... e mi sono arenato ....

qualche consiglio per creare la prima che poi replicherei in CHART2,3 ecc...?

Grazie

3 Risposte

  • Re: CHART per grafico

    Cercando un po' qui e là, con questa creo la "curva di Glaus" che mi interesserebbe
    For x = -20 To 10 Step 1
    Chart1.Series(0).Points.AddXY(x, 1 / Math.Sqrt(6.28) * Math.Exp(-x ^ 2 / 2))
    Next x
    e ottengo questo grafico...

    equalizzatore2.jpg
    equalizzatore2.jpg

    Non so se possa tornarmi utile... ma onestamente non ne ho idea... e non saprei come o cosa modificare per rendere la curva visibile con le tre variabili conosciute.

  • Re: CHART per grafico

    Se devi calcolare i filtri FFT con tanto di Q riferito all'attenuazione per ottava, dovrai rivolgerti a qualche trattato sull'audio.
    Se invece cerchi solo di ottenere una rappresentazione grafica approssimata, sappi che la curava che hai postato si approssima con soli 5 punti, anzi 3 perché 2 sono speculari. Non hai bisogno di formule o chart che visualizzino una collezione di punti che rappresentino l'intera curva.


    FFT.gif
    FFT.gif


    Nell'esempio le curve vengono disegnate usando soli 5 punti, di cui solo 3 vengono variati dalle scrollbar.
    In Form1 aggiungi VScrollbar1 e HScrollBar1, è solo un esempio per farti partire...
    
    Public Class Form1
        ' parametri di costruzione dell'area lavoro
        Dim altezza As Integer = 340
        Dim larghezza As Integer = 480
        Dim setL As Integer = 50
        Dim setT As Integer = 50
        Dim zero As Integer = setT + altezza / 3 ' la coordinata y che vale zero
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            VScrollBar1.Minimum = setT
            VScrollBar1.Maximum = setT + altezza
            VScrollBar1.LargeChange = 1
            HScrollBar1.Minimum = 0
            HScrollBar1.Maximum = 50
            Me.Size = New Size(setL * 2 + larghezza, setT * 2 + altezza)
            Me.DoubleBuffered = True
        End Sub
    
        Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    
            e.Graphics.DrawLine(Pens.Black, setL, setT, setL, setT + altezza)
            e.Graphics.DrawLine(Pens.Black, setL, zero, setL + larghezza, zero)
    
            ' ************** punti della curva **************
            Dim curvePoints(4) As Point
            For off As Integer = 0 To 240 Step 120 ' disegna tre volte la stessa curva, spostata di 120 pixel
                curvePoints(0) = New Point(setL + off, zero) ' primo punto
                curvePoints(1) = New Point(setL + 60 + off - HScrollBar1.Value, VScrollBar1.Value * 0.16 + zero - setT / 2) ' escursione proporzionalmente ridotta
                curvePoints(2) = New Point(setL + 120 + off, VScrollBar1.Value) ' punto centrale
                curvePoints(3) = New Point(setL + 180 + off + HScrollBar1.Value, VScrollBar1.Value * 0.16 + zero - setT / 2) ' escursione proporzionalmente ridotta
                curvePoints(4) = New Point(setL + 240 + off, zero) ' ultimo punto
                e.Graphics.DrawCurve(New Pen(Color.Blue, 2), curvePoints) ' tracciamento
            Next off
            ' solo per controllo: punti sull'ultima curva
            'For p = 0 To 4
            '    e.Graphics.DrawEllipse(New Pen(Color.Red, 3), curvePoints(p).X - 1, curvePoints(p).Y - 1, 2, 2)
            'Next
        End Sub
    
        Private Sub VScrollBar1_Scroll(sender As Object, e As ScrollEventArgs) Handles VScrollBar1.Scroll
            Me.Invalidate() ' scatena il paint
        End Sub
    
        Private Sub HScrollBar1_Scroll(sender As Object, e As ScrollEventArgs) Handles HScrollBar1.Scroll
            Me.Invalidate() ' scatena il paint
        End Sub
    End Class
    
  • Re: CHART per grafico

    Rubik

    Proprio quello dell'immagine, grazie mille per lo spunto: sei super!
    Non ci sarei mai arrivato...

    Deve essere un'idea molto approssimativa che regola appunto i 3 livelli descritti... nulla di professionale, solo un'idea di cosa fa quello che sto "muovendo".

    Mi studio subito il tuo esempio che in pratica è proprio quello che dovrebbe fare:
    dovrei riuscire nell'intento e il tuo esempio è già un FANTASTICO punto di partenza...

    Provo subito!
    Grazie mille per l'idea/formula.
Devi accedere o registrarti per scrivere nel forum
3 risposte