giovedì 28 ottobre 2010

LEZIONE DEL 2 NOVEMBRE 2010

Si avvisano i colleghi/ghe che si svolgeranno regolarmente le lezioni il giorno 2 Novembre a partire dalle ore 9:00

Saluti 

homework 1 di Angelo Spina

Public Class Form1

    Private b As Bitmap
    Private g As Graphics
    Private MargineSinistro As Integer = 40
    Private MargineDestro As Integer = 40
    Private MargineAlto As Integer = 40
    Private MargineBasso As Integer = 40
    Private MinimoPrezzo As Decimal
    Private MassimoPrezzo As Decimal
    Private MinimoTempo As Double
    Private MassimoTempo As Double
    Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
    Dim ListaOsservazioni_BID As List(Of Osservazione)
    Dim ListaOsservazioni_ASK As List(Of Osservazione)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim o As New OpenFileDialog
        Dim FileDeiPrezzi As String
        With o
            .ShowDialog()
            If .FileName = String.Empty Then Exit Sub
            FileDeiPrezzi = .FileName
        End With

        Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
        Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)

        '----------------------------------
        'Ogni riga diventa una osservazione
        '----------------------------------

        Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")

        ListaOsservazioni_BID = New List(Of Osservazione)
        ListaOsservazioni_ASK = New List(Of Osservazione)

        For Each Riga As String In RigheDelFile

            Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
            Dim Osservazione As New Osservazione
            With Osservazione
                Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
                Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
                Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
                Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))

                .Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
                .TipoPrezzo = CInt(ValoriInUnaRiga(4))
                .Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)

                If .TipoPrezzo = 1 Then
                    ListaOsservazioni_BID.Add(Osservazione)
                ElseIf .TipoPrezzo = 2 Then
                    ListaOsservazioni_ASK.Add(Osservazione)
                Else
                    'Throw New Exception("inatteso")
                End If

            End With

        Next Riga


        Me.DisegnaGRafico()
    End Sub


    Sub DisegnaGRafico()

        If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub

        b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
        g = Graphics.FromImage(b)


        '---------------------------------------------------------------
        ' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
        '---------------------------------------------------------------

        Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
        Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
        Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
        Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)

        'Visualizzo margini
        g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
                                                      b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))


        'Usare drawlines per il plot delle 2 curve

        'Curve dei prezzi

        'BID
        Dim p_BID As New Pen(Color.Red, 1)
        g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)

        'ASK
        Dim p_ASK As New Pen(Color.Blue, 1)
        g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)

        g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
        g.DrawLines(Pens.Black, mediamobile_bid.ToArray)

        'Disegno asse dei prezzi
        Me.DrawPriceRuler()

        Me.PictureBox1.Image = b
     


    End Sub


    Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
        'da fare

        'Determinazione del minimo e massimo prezzo

        'Dim MinPrezzo = 1075
        'Dim MaxPrezzo As Double = 1090
        Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)

        Me.MinimoPrezzo = Decimal.MaxValue
        Me.MassimoPrezzo = Decimal.MinValue

        Me.MinimoTempo = Double.MaxValue
        Me.MassimoTempo = Double.MinValue


        For Each Osservazione As Osservazione In ListaOsservazioni
            With Osservazione

                'prezzo
                If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
                If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo

                'tempo
                Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                If MinimoTempo > Tempo Then MinimoTempo = Tempo
                If MassimoTempo < Tempo Then MassimoTempo = Tempo

            End With
        Next Osservazione

        Dim ListaPunti As New List(Of Point)
      
        For Each Osservazione As Osservazione In ListaOsservazioni

            With Osservazione

                'Determinare il punto!
                Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                Dim y As Decimal = .Prezzo

                'Trasformare il punto per rappresentarlo sul bitmap!
                Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
                listaDiX.Add(X_Sul_Bitmap)
                Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
                listaDiY.Add(Y_Sul_Bitmap)
                Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)

                ListaPunti.Add(p)

            End With

        Next Osservazione

        Return ListaPunti

    End Function
    Private listaDiY As New List(Of Integer)
    Private listaDiX As New List(Of Integer)

    Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
                         ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer

        Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
        Return X_Trasformata

    End Function

    Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
                         ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer

        Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
        Return Y_Trasformata

    End Function
    Private mmobile As New List(Of Integer)

    Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)


        Dim puntmobili As New List(Of Integer)
        Dim somma As Integer = 0
        Dim i As Integer = 0
        Dim k As Integer = 0
        Dim passo As Integer = NumeroTerminiMediaMobile
        For i = 0 To lista.Count
            If (i = passo) Then
                For k = i - NumeroTerminiMediaMobile To i
                    somma += listaDiY.Item(k)
                Next k
                puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
                somma = 0
                passo += 1
            End If
        Next i
      

    'Dim indice As Integer = 0
    'Dim somma As Integer


    'For Each elemento As Integer In listaDiY
    '    If (indice + 1) >= NumeroTerminiMediaMobile Then
    '        For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
    '            somma += listaDiY(indice - j)



    '        Next j
    '        mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))


    '    Else : mmobile.Insert(indice, Nothing)
    '    End If
    '    somma = 0
    '    indice += 1
    'Next elemento
    Dim listaPuntiMobile As New List(Of Point)
        For a = 0 To (puntmobili.Count - 1)
            Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
            listaPuntiMobile.Add(nuovopunto)

        Next
        Return listaPuntiMobile




    End Function


    Sub DrawPriceRuler()

        Dim NumeroSuddivisioni As Integer = 10
        Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni

        Dim Prezzo As Double = Me.MinimoPrezzo

        Do
            Prezzo += Passo
            If Prezzo > Me.MassimoPrezzo Then Exit Do

            'Disegno della tacca e del prezzo
            '...

            Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)

            Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)

        Loop


    End Sub

    Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
        Me.DisegnaGRafico()
    End Sub

    Private NumeroTerminiMediaMobile As Integer

    Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged

        Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)

        Me.DisegnaGRafico()

    End Sub

End Class


Public Class Osservazione

    Public Istante As Date
    Public TipoPrezzo As Integer
    Public Prezzo As Decimal

End Class

homework 1 di Emilio Venditti

Public Class Form1

    Private b As Bitmap
    Private g As Graphics

    Private MargineSinistro As Integer = 40
    Private MargineDestro As Integer = 40

    Private MargineAlto As Integer = 40
    Private MargineBasso As Integer = 40

    Private MinimoPrezzo As Decimal
    Private MassimoPrezzo As Decimal

    Private MinimoTempo As Double
    Private MassimoTempo As Double

    Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)

    Dim ListaOsservazioni_BID As List(Of Osservazione)
    Dim ListaOsservazioni_ASK As List(Of Osservazione)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim o As New OpenFileDialog

        Dim FileDeiPrezzi As String
        With o
            .ShowDialog()
            If .FileName = String.Empty Then Exit Sub
            FileDeiPrezzi = .FileName
        End With

        Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)

        Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)

        '----------------------------------
        'Ogni riga diventa una osservazione
        '----------------------------------

        Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")

        ListaOsservazioni_BID = New List(Of Osservazione)
        ListaOsservazioni_ASK = New List(Of Osservazione)

        For Each Riga As String In RigheDelFile

            Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)

            Dim Osservazione As New Osservazione
            With Osservazione
                Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
                Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
                Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
                Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))

                .Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
                .TipoPrezzo = CInt(ValoriInUnaRiga(4))
                .Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)

                If .TipoPrezzo = 1 Then
                    ListaOsservazioni_BID.Add(Osservazione)
                ElseIf .TipoPrezzo = 2 Then
                    ListaOsservazioni_ASK.Add(Osservazione)
                Else
                    'Throw New Exception("inatteso")
                End If

            End With

        Next Riga


        Me.DisegnaGRafico()
    End Sub


    Sub DisegnaGRafico()

        If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub

        b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
        g = Graphics.FromImage(b)


        '---------------------------------------------------------------
        ' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
        '---------------------------------------------------------------

        Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
        Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)

        Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
        Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)




        'Visualizzo margini
        g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
                                                      b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))


        'Usare drawlines per il plot delle 2 curve

        'Curve dei prezzi

        'BID
        Dim p_BID As New Pen(Color.Red, 1)
        g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)

        'ASK
        Dim p_ASK As New Pen(Color.Blue, 1)
        g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)

        g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
        g.DrawLines(Pens.Black, mediamobile_bid.ToArray)

        'Disegno asse dei prezzi
        Me.DrawPriceRuler()

        Me.PictureBox1.Image = b
     


    End Sub


    Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
        'da fare

        'Determinazione del minimo e massimo prezzo

        'Dim MinPrezzo = 1075
        'Dim MaxPrezzo As Double = 1090

        Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)

        Me.MinimoPrezzo = Decimal.MaxValue
        Me.MassimoPrezzo = Decimal.MinValue

        Me.MinimoTempo = Double.MaxValue
        Me.MassimoTempo = Double.MinValue


        For Each Osservazione As Osservazione In ListaOsservazioni
            With Osservazione

                'prezzo
                If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
                If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo

                'tempo
                Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                If MinimoTempo > Tempo Then MinimoTempo = Tempo
                If MassimoTempo < Tempo Then MassimoTempo = Tempo

            End With
        Next Osservazione

        Dim ListaPunti As New List(Of Point)
      
        For Each Osservazione As Osservazione In ListaOsservazioni

            With Osservazione

                'Determinare il punto!
                Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                Dim y As Decimal = .Prezzo

                'Trasformare il punto per rappresentarlo sul bitmap!
                Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
                listaDiX.Add(X_Sul_Bitmap)
                Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
                listaDiY.Add(Y_Sul_Bitmap)
                Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)

                ListaPunti.Add(p)

            End With

        Next Osservazione

        Return ListaPunti

    End Function
    Private listaDiY As New List(Of Integer)
    Private listaDiX As New List(Of Integer)

    Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
                         ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer

        Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
        Return X_Trasformata

    End Function

    Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
                         ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer

        Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
        Return Y_Trasformata

    End Function
    Private mmobile As New List(Of Integer)

    Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)


        Dim puntmobili As New List(Of Integer)
        Dim somma As Integer = 0
        Dim i As Integer = 0
        Dim k As Integer = 0
        Dim passo As Integer = NumeroTerminiMediaMobile
        For i = 0 To lista.Count
            If (i = passo) Then
                For
                    somma += listaDiY.Item(k)
                Next k
                puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
                somma = 0
                passo += 1
            End If
        Next i
      

    'Dim indice As Integer = 0
    'Dim somma As Integer


    'For Each elemento As Integer In listaDiY
    '    If (indice + 1) >= NumeroTerminiMediaMobile Then
    '        For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
    '            somma += listaDiY(indice - j)



    '        Next j
    '        mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))


    '    Else : mmobile.Insert(indice, Nothing)
    '    End If
    '    somma = 0
    '    indice += 1
    'Next elemento
    Dim listaPuntiMobile As New List(Of Point)
        For a = 0 To (puntmobili.Count - 1)
            Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
            listaPuntiMobile.Add(nuovopunto)

        Next
        Return listaPuntiMobile




    End Function


    Sub DrawPriceRuler()

        Dim NumeroSuddivisioni As Integer = 10
        Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni

        Dim Prezzo As Double = Me.MinimoPrezzo

        Do
            Prezzo += Passo
            If Prezzo > Me.MassimoPrezzo Then Exit Do

            'Disegno della tacca e del prezzo
            '...

            Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)

            Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)

        Loop


    End Sub



    Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
        Me.DisegnaGRafico()
    End Sub

    Private NumeroTerminiMediaMobile As Integer

    Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged

        Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)

        Me.DisegnaGRafico()

    End Sub

End Class


Public Class Osservazione

    Public Istante As Date
    Public TipoPrezzo As Integer
    Public Prezzo As Decimal

End Class

Marco Orsi (Homework 1)

Public Class Form1
    Private b As Bitmap
    Private g As Graphics
    Private MargineSinistro As Integer = 40
    Private MargineDestro As Integer = 40
    Private MargineAlto As Integer = 40
    Private MargineBasso As Integer = 40
    Private MinimoPrezzo As Decimal
    Private MassimoPrezzo As Decimal
    Private MinimoTempo As Double
    Private MassimoTempo As Double
    Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
    Dim ListaOsservazioni_BID As List(Of Osservazione)
    Dim ListaOsservazioni_ASK As List(Of Osservazione)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim o As New OpenFileDialog
        Dim FileDeiPrezzi As String
        With o
            .ShowDialog()
            If .FileName = String.Empty Then Exit Sub
            FileDeiPrezzi = .FileName
        End With
        Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
        Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
        '----------------------------------
        'Ogni riga diventa una osservazione
        '----------------------------------
        Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
        ListaOsservazioni_BID = New List(Of Osservazione)
        ListaOsservazioni_ASK = New List(Of Osservazione)
        For Each Riga As String In RigheDelFile
            Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
            Dim Osservazione As New Osservazione
            With Osservazione
                Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
                Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
                Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
                Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
                .Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
                .TipoPrezzo = CInt(ValoriInUnaRiga(4))
                .Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
                If .TipoPrezzo = 1 Then
                    ListaOsservazioni_BID.Add(Osservazione)
                ElseIf .TipoPrezzo = 2 Then
                    ListaOsservazioni_ASK.Add(Osservazione)
                Else
                    'Throw New Exception("inatteso")
                End If
            End With
        Next Riga

        Me.DisegnaGRafico()
    End Sub

    Sub DisegnaGRafico()
        If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
        b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
        g = Graphics.FromImage(b)

        '---------------------------------------------------------------
        ' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
        '---------------------------------------------------------------
        Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
        Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
        Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
        Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)


        'Visualizzo margini
        g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
                                                      b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))

        'Usare drawlines per il plot delle 2 curve
        'Curve dei prezzi
        'BID
        Dim p_BID As New Pen(Color.Red, 1)
        g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
        'ASK
        Dim p_ASK As New Pen(Color.Blue, 1)
        g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
        g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
        g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
        'Disegno asse dei prezzi
        Me.DrawPriceRuler()
        Me.PictureBox1.Image = b

    End Sub

    Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
        'da fare
        'Determinazione del minimo e massimo prezzo
        Dim MinPrezzo = 1075
        Dim MaxPrezzo As Double = 1090
        Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
        Me.MinimoPrezzo = Decimal.MaxValue
        Me.MassimoPrezzo = Decimal.MinValue
        Me.MinimoTempo = Double.MaxValue
        Me.MassimoTempo = Double.MinValue

        For Each Osservazione As Osservazione In ListaOsservazioni
            With Osservazione
                'prezzo
                If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
                If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
                'tempo
                Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                If MinimoTempo > Tempo Then MinimoTempo = Tempo
                If MassimoTempo < Tempo Then MassimoTempo = Tempo
            End With
        Next Osservazione
        Dim ListaPunti As New List(Of Point)
        For Each Osservazione As Osservazione In ListaOsservazioni
            With Osservazione
                'Determinare il punto!
                Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                Dim y As Decimal = .Prezzo
                'Trasformare il punto per rappresentarlo sul bitmap!
                Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
                listaDiX.Add(X_Sul_Bitmap)
                Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
                listaDiY.Add(Y_Sul_Bitmap)
                Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
                ListaPunti.Add(p)
            End With
        Next Osservazione
        Return ListaPunti
    End Function
    Private listaDiY As New List(Of Integer)
    Private listaDiX As New List(Of Integer)
    Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
                         ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
        Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
        Return X_Trasformata
    End Function
    Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
                         ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
        Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
        Return Y_Trasformata
    End Function
    Private mmobile As New List(Of Integer)
    Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)

        Dim puntmobili As New List(Of Integer)
        Dim somma As Integer = 0
        Dim i As Integer = 0
        Dim k As Integer = 0
        Dim passo As Integer = NumeroTerminiMediaMobile
        For i = 0 To lista.Count
            If (i = passo) Then
                For k = i - NumeroTerminiMediaMobile To i
                    somma += listaDiY.Item(k)
                Next k
                puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
                somma = 0
                passo += 1
            End If
        Next i

        Dim indice As Integer = 0
        Dim somma As Integer

        For Each elemento As Integer In listaDiY
            If (indice + 1) >= NumeroTerminiMediaMobile Then
                For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
                    somma += listaDiY(indice - j)

                Next j
                mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))

            Else : mmobile.Insert(indice, Nothing)
            End If
            somma = 0
            indice += 1
        Next elemento
        Dim listaPuntiMobile As New List(Of Point)
        For a = 0 To (puntmobili.Count - 1)
            Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
            listaPuntiMobile.Add(nuovopunto)
        Next
        Return listaPuntiMobile


    End Function

    Sub DrawPriceRuler()
        Dim NumeroSuddivisioni As Integer = 10
        Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
        Dim Prezzo As Double = Me.MinimoPrezzo
        Do
            Prezzo += Passo
            If Prezzo > Me.MassimoPrezzo Then Exit Do
            'Disegno della tacca e del prezzo
            '...
            Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
            Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
        Loop

    End Sub

    Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
        Me.DisegnaGRafico()
    End Sub
    Private NumeroTerminiMediaMobile As Integer
    Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
        Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
        Me.DisegnaGRafico()
    End Sub
End Class

Public Class Osservazione
    Public Istante As Date
    Public TipoPrezzo As Integer
    Public Prezzo As Decimal
End Class

Homework di Carla Ferrara

Public Class Form1
    Private b As Bitmap
    Private g As Graphics
    Private MargineSinistro As Integer = 40
    Private MargineDestro As Integer = 40
    Private MargineAlto As Integer = 40
    Private MargineBasso As Integer = 40
    Private MinimoPrezzo As Decimal
    Private MassimoPrezzo As Decimal
    Private MinimoTempo As Double
    Private MassimoTempo As Double
    Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
    Dim ListaOsservazioni_BID As List(Of Osservazione)
    Dim ListaOsservazioni_ASK As List(Of Osservazione)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim o As New OpenFileDialog
        Dim FileDeiPrezzi As String
        With o
            .ShowDialog()
            If .FileName = String.Empty Then Exit Sub
            FileDeiPrezzi = .FileName
        End With
        Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
        Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
        '----------------------------------
        'Ogni riga diventa una osservazione
        '----------------------------------
        Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
        ListaOsservazioni_BID = New List(Of Osservazione)
        ListaOsservazioni_ASK = New List(Of Osservazione)
        For Each Riga As String In RigheDelFile
            Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
            Dim Osservazione As New Osservazione
            With Osservazione
                Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
                Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
                Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
                Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
                .Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
                .TipoPrezzo = CInt(ValoriInUnaRiga(4))
                .Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
                If .TipoPrezzo = 1 Then
                    ListaOsservazioni_BID.Add(Osservazione)
                ElseIf .TipoPrezzo = 2 Then
                    ListaOsservazioni_ASK.Add(Osservazione)
                Else
                    'Throw New Exception("inatteso")
                End If
            End With
        Next Riga

        Me.DisegnaGRafico()
    End Sub

    Sub DisegnaGRafico()
        If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
        b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
        g = Graphics.FromImage(b)

        '---------------------------------------------------------------
        ' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
        '---------------------------------------------------------------
        Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
        Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
        Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
        Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)


        'Visualizzo margini
        g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
                                                      b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))

        'Usare drawlines per il plot delle 2 curve
        'Curve dei prezzi
        'BID
        Dim p_BID As New Pen(Color.Red, 1)
        g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
        'ASK
        Dim p_ASK As New Pen(Color.Blue, 1)
        g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
        g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
        g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
        'Disegno asse dei prezzi
        Me.DrawPriceRuler()
        Me.PictureBox1.Image = b

    End Sub

    Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
        'da fare
        'Determinazione del minimo e massimo prezzo
        Dim MinPrezzo = 1075
        Dim MaxPrezzo As Double = 1090
        Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
        Me.MinimoPrezzo = Decimal.MaxValue
        Me.MassimoPrezzo = Decimal.MinValue
        Me.MinimoTempo = Double.MaxValue
        Me.MassimoTempo = Double.MinValue

        For Each Osservazione As Osservazione In ListaOsservazioni
            With Osservazione
                'prezzo
                If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
                If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
                'tempo
                Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                If MinimoTempo > Tempo Then MinimoTempo = Tempo
                If MassimoTempo < Tempo Then MassimoTempo = Tempo
            End With
        Next Osservazione
        Dim ListaPunti As New List(Of Point)
        For Each Osservazione As Osservazione In ListaOsservazioni
            With Osservazione
                'Determinare il punto!
                Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                Dim y As Decimal = .Prezzo
                'Trasformare il punto per rappresentarlo sul bitmap!
                Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
                listaDiX.Add(X_Sul_Bitmap)
                Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
                listaDiY.Add(Y_Sul_Bitmap)
                Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
                ListaPunti.Add(p)
            End With
        Next Osservazione
        Return ListaPunti
    End Function
    Private listaDiY As New List(Of Integer)
    Private listaDiX As New List(Of Integer)
    Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
                         ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
        Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
        Return X_Trasformata
    End Function
    Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
                         ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
        Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
        Return Y_Trasformata
    End Function
    Private mmobile As New List(Of Integer)
    Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)

        Dim puntmobili As New List(Of Integer)
        Dim somma As Integer = 0
        Dim i As Integer = 0
        Dim k As Integer = 0
        Dim passo As Integer = NumeroTerminiMediaMobile
        For i = 0 To lista.Count
            If (i = passo) Then
                For k = i - NumeroTerminiMediaMobile To i
                    somma += listaDiY.Item(k)
                Next k
                puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
                somma = 0
                passo += 1
            End If
        Next i

        Dim indice As Integer = 0
        Dim somma As Integer

        For Each elemento As Integer In listaDiY
            If (indice + 1) >= NumeroTerminiMediaMobile Then
                For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
                    somma += listaDiY(indice - j)

                Next j
                mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))

            Else : mmobile.Insert(indice, Nothing)
            End If
            somma = 0
            indice += 1
        Next elemento
        Dim listaPuntiMobile As New List(Of Point)
        For a = 0 To (puntmobili.Count - 1)
            Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
            listaPuntiMobile.Add(nuovopunto)
        Next
        Return listaPuntiMobile


    End Function

    Sub DrawPriceRuler()
        Dim NumeroSuddivisioni As Integer = 10
        Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
        Dim Prezzo As Double = Me.MinimoPrezzo
        Do
            Prezzo += Passo
            If Prezzo > Me.MassimoPrezzo Then Exit Do
            'Disegno della tacca e del prezzo
            '...
            Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
            Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
        Loop

    End Sub

    Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
        Me.DisegnaGRafico()
    End Sub
    Private NumeroTerminiMediaMobile As Integer
    Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
        Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
        Me.DisegnaGRafico()
    End Sub
End Class

Public Class Osservazione
    Public Istante As Date
    Public TipoPrezzo As Integer
    Public Prezzo As Decimal
End Class

Homework 1 di Plateroti Cinzia

Public Class Form1

Private b As Bitmap
Private g As Graphics

Private MargineSinistro As Integer = 10
Private MargineDestro As Integer = 10

Private MargineAlto As Integer = 10
Private MargineBasso As Integer = 10

Private MinimoPrezzo As Decimal
Private MassimoPrezzo As Decimal

Private MinimoTempo As Double
Private MassimoTempo As Double

Private Y_MM As New List(Of Integer)
Private X_MM As New List(Of Integer)

Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)

Dim ListaOsservazioni_BID As List(Of Osservazione)
Dim ListaOsservazioni_ASK As List(Of Osservazione)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim o As New OpenFileDialog
Dim FileDeiPrezzi As String
With o
.ShowDialog()

If .FileName = String.Empty Then Exit Sub
FileDeiPrezzi = .FileName

End With

Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)

'----------------------------------
'Ogni riga diventa una osservazione
'----------------------------------

Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")

ListaOsservazioni_BID = New List(Of Osservazione)
ListaOsservazioni_ASK = New List(Of Osservazione)

For Each Riga As String In RigheDelFile
Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
Dim Osservazione As New Osservazione
With Osservazione

Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))

.Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)

.TipoPrezzo = CInt(ValoriInUnaRiga(4))

.Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)

If .TipoPrezzo = 1 Then

ListaOsservazioni_BID.Add(Osservazione)

ElseIf .TipoPrezzo = 2 Then

ListaOsservazioni_ASK.Add(Osservazione)

Else

'Throw New Exception("inatteso")

End If

End With

Next Riga

Me.DisegnaGRafico()

End Sub


Sub DisegnaGRafico()

If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
g = Graphics.FromImage(b)



'---------------------------------------------------------------
' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
'---------------------------------------------------------------

Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)

Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)



'Visualizzo margini

g.DrawRectangle(Pens.Black, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))


'Usare drawlines per il plot delle 2 curve

'Curve dei prezzi

'BID

Dim p_BID As New Pen(Color.Red, 1)
g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)

'ASK

Dim p_ASK As New Pen(Color.Blue, 0.5)
g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)

'Medie mobili

g.DrawLines(New Pen(Color.Yellow, 3), Me.MediaMobile(ListaOsservazioni_ASK, NumeroTerminiMediaMobile).ToArray)
g.DrawLines(New Pen(Color.Chocolate, 1), Me.MediaMobile(ListaOsservazioni_BID, NumeroTerminiMediaMobile).ToArray)

'Disegno asse dei prezzi

Me.DrawPriceRuler()
Me.PictureBox1.Image = b



End Sub

Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)



'Determinazione del minimo e massimo prezzo

Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)

Me.MinimoPrezzo = Decimal.MaxValue
Me.MassimoPrezzo = Decimal.MinValue

Me.MinimoTempo = Double.MaxValue
Me.MassimoTempo = Double.MinValue

For Each Osservazione As Osservazione In ListaOsservazioni

With Osservazione

'prezzo

If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo

'tempo

Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds

If MinimoTempo > Tempo Then MinimoTempo = Tempo
If MassimoTempo < Tempo Then MassimoTempo = Tempo

End With

Next Osservazione

Dim ListaPunti As New List(Of Point)

For Each Osservazione As Osservazione In ListaOsservazioni

With Osservazione

'Determinare il punto!

Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
Dim y As Decimal = .Prezzo

'Trasformare il punto per rappresentarlo sul bitmap!

Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
X_MM.Add(X_Sul_Bitmap)
Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
Y_MM.Add(Y_Sul_Bitmap)
Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
ListaPunti.Add(p)

End With


Next Osservazione

Return ListaPunti

End Function


Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
Return X_Trasformata


End Function

Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))

Return Y_Trasformata

End Function

Sub DrawPriceRuler()
Dim NumeroSuddivisioni As Integer = 10
Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
Dim Prezzo As Double = Me.MinimoPrezzo

Do

Prezzo += Passo
If Prezzo > Me.MassimoPrezzo Then Exit Do

'Disegno della tacca e del prezzo

Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Black, Me.MargineSinistro + 5, Y_Bitmap)

Loop

End Sub
Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
Me.DisegnaGRafico()

End Sub

Private NumeroTerminiMediaMobile As Integer
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
Me.DisegnaGRafico()

End Sub

'Funzione per il calcolo della Media Mobile
Function MediaMobile(ByVal ListaTermini As List(Of Osservazione), ByVal NumTermMM As Integer) As List(Of Point)

Dim MMobili As New List(Of Integer)
Dim sum As Double = 0
Dim i As Integer = 0
Dim j As Integer = 0

For i = 0 To ListaTermini.Count
If (i = NumTermMM) Then
For j = i - NumeroTerminiMediaMobile To i
sum += Y_MM.Item(j)

Next j

MMobili.Add(CInt(sum / NumeroTerminiMediaMobile))
sum = 0
NumTermMM += 1

End If

Next i

Dim PuntiMediaMobile As New List(Of Point)

For i = 0 To (MMobili.Count - 1)
Dim InserisciPunto As New Point(X_MM.Item(i), MMobili.Item(i))
PuntiMediaMobile.Add(InserisciPunto)
    Next
            Return PuntiMediaMobile


End Function


End Class

Public Class Osservazione
Public Istante As Date
Public TipoPrezzo As Integer
Public Prezzo As Decimal

End Class

Di Salvo Rosanna - Homework 1

Public Class Form1
    Private b As Bitmap
    Private g As Graphics
    Private MargineSinistro As Integer = 40
    Private MargineDestro As Integer = 40
    Private MargineAlto As Integer = 40
    Private MargineBasso As Integer = 40
    Private MinimoPrezzo As Decimal
    Private MassimoPrezzo As Decimal
    Private MinimoTempo As Double
    Private MassimoTempo As Double
    Dim FontPrezzi As New Font("Arial", 10, FontStyle.Bold)
    Dim ListaOsservazioni_BID As List(Of Osservazione)
    Dim ListaOsservazioni_ASK As List(Of Osservazione)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim o As New OpenFileDialog
        Dim FileDeiPrezzi As String
        With o
            .ShowDialog()
            If .FileName = String.Empty Then Exit Sub
            FileDeiPrezzi = .FileName
        End With
        Dim DatiTxtContenutiInFile As String = My.Computer.FileSystem.ReadAllText(FileDeiPrezzi)
        Dim RigheDelFile As String() = DatiTxtContenutiInFile.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
        '----------------------------------
        'Ogni riga diventa una osservazione
        '----------------------------------
        Dim CulturaUSA As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("en-US")
        ListaOsservazioni_BID = New List(Of Osservazione)
        ListaOsservazioni_ASK = New List(Of Osservazione)
        For Each Riga As String In RigheDelFile
            Dim ValoriInUnaRiga As String() = Riga.Split(" ".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
            Dim Osservazione As New Osservazione
            With Osservazione
                Dim Ora As Integer = CInt(ValoriInUnaRiga(0))
                Dim Minuti As Integer = CInt(ValoriInUnaRiga(1))
                Dim Secondi As Integer = CInt(ValoriInUnaRiga(2))
                Dim Millisecs As Integer = CInt(ValoriInUnaRiga(3))
                .Istante = New Date(Now.Year, Now.Month, Now.Day, Ora, Minuti, Secondi, Millisecs)
                .TipoPrezzo = CInt(ValoriInUnaRiga(4))
                .Prezzo = Decimal.Parse(ValoriInUnaRiga(5), CulturaUSA)
                If .TipoPrezzo = 1 Then
                    ListaOsservazioni_BID.Add(Osservazione)
                ElseIf .TipoPrezzo = 2 Then
                    ListaOsservazioni_ASK.Add(Osservazione)
                Else
                    'Throw New Exception("inatteso")
                End If
            End With
        Next Riga

        Me.DisegnaGRafico()
    End Sub

    Sub DisegnaGRafico()
        If Me.ListaOsservazioni_ASK Is Nothing Then Exit Sub
        b = New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
        g = Graphics.FromImage(b)

        '---------------------------------------------------------------
        ' Adesso le 2 liste osservazioni diventano delle liste di punti da rappresentare su un bitmap
        '---------------------------------------------------------------
        Dim ListaDiPunti_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_BID)
        Dim ListaDiPunti_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaOsservazioni_ASK)
        Dim mediamobile_ask As List(Of Point) = Me.mediaMobile(ListaOsservazioni_ASK)
        Dim mediamobile_bid As List(Of Point) = Me.mediaMobile(ListaOsservazioni_BID)


        'Visualizzo margini
        g.DrawRectangle(Pens.LightGreen, New Rectangle(Me.MargineSinistro, Me.MargineAlto, _
                                                      b.Width - Me.MargineSinistro - Me.MargineDestro, b.Height - Me.MargineAlto - Me.MargineBasso))

        'Usare drawlines per il plot delle 2 curve
        'Curve dei prezzi
        'BID
        Dim p_BID As New Pen(Color.Red, 1)
        g.DrawLines(p_BID, ListaDiPunti_BID.ToArray)
        'ASK
        Dim p_ASK As New Pen(Color.Blue, 1)
        g.DrawLines(p_ASK, ListaDiPunti_ASK.ToArray)
        g.DrawLines(Pens.Aquamarine, mediamobile_ask.ToArray)
        g.DrawLines(Pens.Black, mediamobile_bid.ToArray)
        'Disegno asse dei prezzi
        Me.DrawPriceRuler()
        Me.PictureBox1.Image = b

    End Sub

    Function CreaListaPuntiDaListaOsservazioni(ByVal ListaOsservazioni As List(Of Osservazione)) As List(Of Point)
        'da fare
        'Determinazione del minimo e massimo prezzo
        Dim MinPrezzo = 1075
        Dim MaxPrezzo As Double = 1090
        Dim TempoOrigine As Date = New Date(Now.Year, Now.Month, Now.Day, 0, 0, 0)
        Me.MinimoPrezzo = Decimal.MaxValue
        Me.MassimoPrezzo = Decimal.MinValue
        Me.MinimoTempo = Double.MaxValue
        Me.MassimoTempo = Double.MinValue

        For Each Osservazione As Osservazione In ListaOsservazioni
            With Osservazione
                'prezzo
                If MinimoPrezzo > .Prezzo Then MinimoPrezzo = .Prezzo
                If MassimoPrezzo < .Prezzo Then MassimoPrezzo = .Prezzo
                'tempo
                Dim Tempo As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                If MinimoTempo > Tempo Then MinimoTempo = Tempo
                If MassimoTempo < Tempo Then MassimoTempo = Tempo
            End With
        Next Osservazione
        Dim ListaPunti As New List(Of Point)
        For Each Osservazione As Osservazione In ListaOsservazioni
            With Osservazione
                'Determinare il punto!
                Dim x As Double = .Istante.Subtract(TempoOrigine).TotalMilliseconds
                Dim y As Decimal = .Prezzo
                'Trasformare il punto per rappresentarlo sul bitmap!
                Dim X_Sul_Bitmap As Integer = Me.Trasforma_X(x, MinimoTempo, MassimoTempo, MargineSinistro, MargineDestro)
                listaDiX.Add(X_Sul_Bitmap)
                Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)
                listaDiY.Add(Y_Sul_Bitmap)
                Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)
                ListaPunti.Add(p)
            End With
        Next Osservazione
        Return ListaPunti
    End Function
    Private listaDiY As New List(Of Integer)
    Private listaDiX As New List(Of Integer)
    Function Trasforma_X(ByVal x As Double, ByVal MinX As Double, ByVal MaxX As Double, _
                         ByVal MarginLeft As Integer, ByVal MarginRight As Integer) As Integer
        Dim X_Trasformata As Integer = MarginLeft + CInt((Me.b.Width - MarginLeft - MarginRight) * (x - MinX) / (MaxX - MinX))
        Return X_Trasformata
    End Function
    Function Trasforma_Y(ByVal y As Double, ByVal MinY As Double, ByVal MaxY As Double, _
                         ByVal MarginTop As Integer, ByVal MarginBottom As Integer) As Integer
        Dim Y_Trasformata As Integer = Me.b.Height - MarginTop - CInt((Me.b.Height - MarginTop - MarginBottom) * (y - MinY) / (MaxY - MinY))
        Return Y_Trasformata
    End Function
    Private mmobile As New List(Of Integer)
    Function mediaMobile(ByVal lista As List(Of Osservazione)) As List(Of Point)

        Dim puntmobili As New List(Of Integer)
        Dim somma As Integer = 0
        Dim i As Integer = 0
        Dim k As Integer = 0
        Dim passo As Integer = NumeroTerminiMediaMobile
        For i = 0 To lista.Count
            If (i = passo) Then
                For k = i - NumeroTerminiMediaMobile To i
                    somma += listaDiY.Item(k)
                Next k
                puntmobili.Add(CInt(somma / NumeroTerminiMediaMobile))
                somma = 0
                passo += 1
            End If
        Next i

        Dim indice As Integer = 0
        Dim somma As Integer

        For Each elemento As Integer In listaDiY
            If (indice + 1) >= NumeroTerminiMediaMobile Then
                For j As Integer = 0 To (NumeroTerminiMediaMobile - 1)
                    somma += listaDiY(indice - j)

                Next j
                mmobile.Insert(indice, CInt(((somma) / NumeroTerminiMediaMobile)))

            Else : mmobile.Insert(indice, Nothing)
            End If
            somma = 0
            indice += 1
        Next elemento
        Dim listaPuntiMobile As New List(Of Point)
        For a = 0 To (puntmobili.Count - 1)
            Dim nuovopunto As New Point(listaDiX.Item(a), puntmobili.Item(a))
            listaPuntiMobile.Add(nuovopunto)
        Next
        Return listaPuntiMobile


    End Function

    Sub DrawPriceRuler()
        Dim NumeroSuddivisioni As Integer = 10
        Dim Passo As Double = (Me.MassimoPrezzo - Me.MinimoPrezzo) / NumeroSuddivisioni
        Dim Prezzo As Double = Me.MinimoPrezzo
        Do
            Prezzo += Passo
            If Prezzo > Me.MassimoPrezzo Then Exit Do
            'Disegno della tacca e del prezzo
            '...
            Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
            Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Green, Me.MargineSinistro + 5, Y_Bitmap)
        Loop

    End Sub

    Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
        Me.DisegnaGRafico()
    End Sub
    Private NumeroTerminiMediaMobile As Integer
    Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
        Me.NumeroTerminiMediaMobile = CInt(Me.NumericUpDown1.Value)
        Me.DisegnaGRafico()
    End Sub
End Class

Public Class Osservazione
    Public Istante As Date
    Public TipoPrezzo As Integer
    Public Prezzo As Decimal
End Class