venerdì 26 novembre 2010

Mattia Clarissa

Esoneri:

NB: Per scaricare i file del programma bisogna:
1)cliccare sul link 
2)in alto a destra riempire lo spazio bianco con le lettere e i numeri suggeriti accanto
3)cliccare SCARICA FILE
4)attendere il conto alla rovescia di 45 secondi, e poi comparirà il pulsante DOWNLOAD STANDARD 

(all'interno del programma è possibile trovare eventuali errori di numerazione degli esercizi a seguito di una
successiva rinumerazione)



Esercizio 1: Parsing file di dati testuali 

Codice
Programma

Esercizio 2 : Immagini

Codice
Programma


Esercizio 3: Rappresentazione grafica di serie storiche di prezzi

Codice
Programma


Esercizio 4: Accesso a DBMS
Esercizio 5: Word Cloud

Esercizio 6: Trading Strategy
Programma
 

Esercizio 7: Trading Algorithm su random walks e performance assessment.


giovedì 25 novembre 2010

Carla Ferrara esercitazione word could


Imports System.Drawing.Drawing2D


Public Class Form1
Public b As Bitmap
Public g As Graphics

Dim listaparoleno As New Dictionary(Of String, Boolean)

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

listaparoleno.Add("il", Nothing)

listaparoleno.Add("la", Nothing)

listaparoleno.Add("lo", Nothing)

listaparoleno.Add("i", Nothing)

listaparoleno.Add("le", Nothing)

listaparoleno.Add("di", Nothing)

listaparoleno.Add("a", Nothing)

listaparoleno.Add("da", Nothing)

listaparoleno.Add("in", Nothing)

listaparoleno.Add("con", Nothing)

listaparoleno.Add("su", Nothing)

listaparoleno.Add("per", Nothing)

listaparoleno.Add("tra", Nothing)

listaparoleno.Add("fra", Nothing)

listaparoleno.Add("un", Nothing)

listaparoleno.Add("una", Nothing)

listaparoleno.Add("uno", Nothing)

listaparoleno.Add("del", Nothing)

listaparoleno.Add("dello", Nothing)

listaparoleno.Add("degli", Nothing)

listaparoleno.Add("dei", Nothing)

listaparoleno.Add("alle", Nothing)

listaparoleno.Add("agli", Nothing)

listaparoleno.Add("dai", Nothing)

listaparoleno.Add("fa", Nothing)

listaparoleno.Add("ci", Nothing)

listaparoleno.Add("si", Nothing)

listaparoleno.Add("e", Nothing)

listaparoleno.Add("o", Nothing)

Try

Dim Corpus As String = Me.RichTextBox1.Text

Dim corpus_N As String = Corpus.ToLower.Replace(",", " ").Replace(vbCrLf, " ").Replace(" ", " ").Replace(".", " ").Replace("!", " ").Replace("?", " ").Replace(")", " ").Replace("(", " ").Replace("-", " ").Replace("'", " ")

Dim nome() As String = corpus_N.Split((vbCrLf & " ").ToCharArray, StringSplitOptions.RemoveEmptyEntries)

Dim minimadimensionefont As Integer = 10

Dim massimadimensionefont As Integer = 50

Dim ListaParoleDiverse As New SortedList(Of String, Boolean)

For Each parola As String In nome

If Not listaparoleno.ContainsKey(parola) Then

If Not ListaParoleDiverse.ContainsKey(parola) Then ListaParoleDiverse.Add(parola, Nothing)

End If

Next

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

g = Graphics.FromImage(b)

g.SmoothingMode = SmoothingMode.HighQuality

g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias

'RANDOM

Dim RND As New Random

Dim NumeroCasuale0_1 As Double = RND.NextDouble

Dim Raggio As Double = b.Height / 3
Dim colorNames As String() = System.Enum.GetNames(GetType(KnownColor))

Dim lstColors As New List(Of String)(colorNames)

Dim PathRettangoli As New GraphicsPath

Do While ListaParoleDiverse.Count > 0
Dim Parola As String = ListaParoleDiverse.Keys.Item(0)

Dim frequenza As Integer = 1

For Each word As String In nome

If word = Parola Then

frequenza += 1

End If

Next

Dim dimensione As Single = 4 * frequenza

Dim ANgoloCasuale As Double = RND.NextDouble * 2 * Math.PI

Dim DIstanzaCasuale As Double = RND.NextDouble * Raggio

Dim x As Double = b.Width / 2 + Math.Cos(ANgoloCasuale) * DIstanzaCasuale

Dim y As Double = b.Height / 2 + Math.Sin(ANgoloCasuale) * DIstanzaCasuale

Dim IndiceCasuale As Integer = RND.Next(0, lstColors.Count - 1)

Dim COloreCasuale As Color = System.Drawing.Color.FromName(lstColors(IndiceCasuale))
Dim MyFont As Font = New Font("arial", dimensione, FontStyle.Italic)

Dim SIzeFString As SizeF = g.MeasureString(Parola, MyFont)

Dim RettangoloStringa As New Rectangle(New Point(x, y), SIzeFString.ToSize)
Dim R As New Region(PathRettangoli)

If Not R.IsVisible(RettangoloStringa) Then

g.DrawString(Parola, MyFont, New SolidBrush(COloreCasuale), x, y)

ListaParoleDiverse.RemoveAt(0)

PathRettangoli.AddRectangle(RettangoloStringa)

End If

Me.PictureBox1.Image = b

Application.DoEvents()
Loop

Catch exc As Exception

MsgBox("Errore non previsto" & vbCrLf & exc.Message)

End Try

Me.PictureBox1.Image = b



End Sub



Private Sub Form1_Load_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

End Class

sabato 20 novembre 2010

Carrieri Alessandra - Esercizio 1

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

venerdì 19 novembre 2010

Esercizio 2 (word cloud) - Enrico Scafà , Carlo Giustiniani

Imports System.Drawing.Drawing2D

Public Class Form1


    Public PaoleDaIgnorare As Dictionary(Of String, Boolean)

    Public ListaColori As List(Of Color)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        PaoleDaIgnorare = New Dictionary(Of String, Boolean)(StringComparer.InvariantCultureIgnoreCase)

        Me.PaoleDaIgnorare.Add(" I ", Nothing)
        Me.PaoleDaIgnorare.Add(" IL ", Nothing)
        Me.PaoleDaIgnorare.Add(" LA ", Nothing)
        Me.PaoleDaIgnorare.Add(" LE ", Nothing)
        Me.PaoleDaIgnorare.Add(" GLI ", Nothing)
        Me.PaoleDaIgnorare.Add(" IN ", Nothing)
        Me.PaoleDaIgnorare.Add(" CON ", Nothing)
        Me.PaoleDaIgnorare.Add(" SU ", Nothing)
        Me.PaoleDaIgnorare.Add(" PER ", Nothing)
        Me.PaoleDaIgnorare.Add(" TRA ", Nothing)
        Me.PaoleDaIgnorare.Add(" FRA ", Nothing)
        Me.PaoleDaIgnorare.Add(" UN ", Nothing)
        Me.PaoleDaIgnorare.Add(" UNO ", Nothing)
        Me.PaoleDaIgnorare.Add(" UNA ", Nothing)
        Me.PaoleDaIgnorare.Add(" O ", Nothing)
        Me.PaoleDaIgnorare.Add(" A ", Nothing)


        ListaColori = New List(Of Color)
        ListaColori.Add(Color.Beige)
        ListaColori.Add(Color.BlueViolet)
        ListaColori.Add(Color.Coral)
        ListaColori.Add(Color.CornflowerBlue)
        ListaColori.Add(Color.Aquamarine)
        ListaColori.Add(Color.DarkCyan)
        ListaColori.Add(Color.DarkRed)
        ListaColori.Add(Color.DodgerBlue)
        ListaColori.Add(Color.Firebrick)
        ListaColori.Add(Color.Chartreuse)
        ListaColori.Add(Color.DarkSlateBlue)
        ListaColori.Add(Color.Aquamarine)
        ListaColori.Add(Color.AliceBlue)
        ListaColori.Add(Color.Beige)
        ListaColori.Add(Color.BlueViolet)
        ListaColori.Add(Color.Coral)
        ListaColori.Add(Color.CornflowerBlue)
        ListaColori.Add(Color.Aquamarine)
        ListaColori.Add(Color.DarkCyan)
        ListaColori.Add(Color.BlueViolet)
        ListaColori.Add(Color.Coral)
        ListaColori.Add(Color.CornflowerBlue)
        ListaColori.Add(Color.Aquamarine)
        ListaColori.Add(Color.DarkCyan)
        ListaColori.Add(Color.DarkRed)
        ListaColori.Add(Color.DodgerBlue)
        ListaColori.Add(Color.Firebrick)
        ListaColori.Add(Color.Chartreuse)
        ListaColori.Add(Color.DarkSlateBlue)
        ListaColori.Add(Color.Aquamarine)
        ListaColori.Add(Color.AliceBlue)
        ListaColori.Add(Color.Beige)
        ListaColori.Add(Color.BlueViolet)
        ListaColori.Add(Color.Coral)
        ListaColori.Add(Color.CornflowerBlue)
        ListaColori.Add(Color.Aquamarine)
        ListaColori.Add(Color.DarkCyan)



    End Sub


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

        Dim Corpus As String = Me.RichTextBox1.Text
        Dim Corpus_Normalizzato As String = Corpus.ToUpper.Replace(",", " ").Replace(vbCrLf, " ").Replace("!", " ").Replace("  ", " ")

        For Each PaolaDaRimuovere As String In Me.PaoleDaIgnorare.Keys
            Corpus_Normalizzato = Corpus_Normalizzato.Replace(PaolaDaRimuovere, " ")
        Next PaolaDaRimuovere
        Corpus_Normalizzato = Corpus_Normalizzato.Replace("  ", " ")

        Me.RichTextBox2.Text = Corpus_Normalizzato

        Dim Parole As String() = Corpus_Normalizzato.Split((vbCrLf & " ").ToArray, StringSplitOptions.RemoveEmptyEntries)

        Dim ListaParoleDiverse As New Dictionary(Of String, InfoParola)(StringComparer.InvariantCultureIgnoreCase)

        For Each parola As String In Parole

            If Me.PaoleDaIgnorare.ContainsKey(parola) Then Continue For
            If parola.Trim = "" Then Continue For

            If ListaParoleDiverse.ContainsKey(parola) Then
                Dim InfoParola As InfoParola = ListaParoleDiverse(parola)
                InfoParola.FrequenzaAssoluta += 1
            Else
                Dim InfoParola As New InfoParola
                InfoParola.Parola = parola
                InfoParola.FrequenzaAssoluta = 1
                ListaParoleDiverse.Add(parola, InfoParola)
            End If

        Next parola

        Dim NumeroParoleTotale = Parole.Count
        Dim NumeroParoleDiverse = ListaParoleDiverse.Count

        Me.LabelCorpus.Text = "CORPUS [" & NumeroParoleDiverse & " / " & NumeroParoleTotale & "]"


        Me.CreaWordCloud(ListaParoleDiverse)

    End Sub


    Sub CreaWordCloud(ByVal ListaParoleDiverse As Dictionary(Of String, InfoParola))

        Dim rnd As New Random
        Dim b As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
        Dim g As Graphics = Graphics.FromImage(b)

        'Disegnare ...

        'Determiniamo l'ingombro di ciascuna parola se rappresentata con un font proporzionale alla frequenza

        Dim MinimaDimensioneFont As Integer = 8
        Dim MassimaDimensioneFont As Integer = 50
        Dim MinFrequenza = Integer.MaxValue
        Dim MaxFrequenza = Integer.MinValue

        'Determiniamo la minima e massima frequenza
        For Each InfoParola As InfoParola In ListaParoleDiverse.Values
            If MinFrequenza > InfoParola.FrequenzaAssoluta Then MinFrequenza = InfoParola.FrequenzaAssoluta
            If MaxFrequenza < InfoParola.FrequenzaAssoluta Then MaxFrequenza = InfoParola.FrequenzaAssoluta
        Next InfoParola

   
        Dim FontProporzionato As Font

        'Determiniamo la dimensione del font corrispondente alla frequenza
        Dim i As Integer = 0
        Dim stampata As Boolean
        Dim PathRettangoli As New GraphicsPath

        For Each InfoParola As InfoParola In ListaParoleDiverse.Values

            stampata = False

            With InfoParola
                .DimensioneDelFontCorrispondenteAllaFrequenza = CSng(MinimaDimensioneFont + (.FrequenzaAssoluta - MinFrequenza) * (MassimaDimensioneFont - MinimaDimensioneFont) / (MaxFrequenza - MinFrequenza))
                FontProporzionato = New Font("Arial", .DimensioneDelFontCorrispondenteAllaFrequenza, FontStyle.Regular, GraphicsUnit.Pixel)

                Dim Size As SizeF = g.MeasureString(.Parola, FontProporzionato, Point.Empty, StringFormat.GenericDefault)
                .LarghezzaParola = Size.Width
                .AltezzaPaola = Size.Height

                '--colore_casuale--
                Dim colorNames As String() = System.Enum.GetNames(GetType(KnownColor))
                Dim lstColors As New List(Of String)(colorNames)
                lstColors.Remove("Black")

                Dim IndiceCasuale As Integer = rnd.Next(0, lstColors.Count - 1)
                .Colore = System.Drawing.Color.FromName(lstColors(IndiceCasuale))

                'STAMPARE LE PAROLE

                Dim SIzeFString As SizeF = g.MeasureString(.Parola, FontProporzionato) 'misuar la grandezza della stringa con quel font

                'random
                Dim n_casuale As Double = rnd.NextDouble
                Dim raggio1 As Double = Math.Min(b.Width, b.Height) / 2
                Dim raggio2 As Double = Math.Min(b.Width, b.Height) / 3

                Do While stampata = False

                    Dim angoloCasuale As Double = rnd.NextDouble * 2 * Math.PI
                    Dim distanzaCasuale As Double = rnd.NextDouble * raggio1
                    Dim distanzaCasuale2 As Double = rnd.NextDouble * raggio2

                    Dim x As Double
                    Dim y As Double

                    If i Mod 3 = 0 Then
                        x = b.Width / 2 + Math.Cos(angoloCasuale) * distanzaCasuale
                        y = b.Height / 2 + Math.Sin(angoloCasuale) * distanzaCasuale
                        ' g.RotateTransform(rnd.Next(-3, 3))
                    End If
                    If i Mod 3 = 1 Then

                        x = b.Width / 4 + Math.Cos(angoloCasuale) * distanzaCasuale2
                        y = b.Height / 2 + Math.Sin(angoloCasuale) * distanzaCasuale2

                        ' g.RotateTransform(-rnd.Next(5, 30))
                    End If
                    If i Mod 3 = 2 Then

                        x = b.Width * 3 / 4 + Math.Cos(angoloCasuale) * distanzaCasuale2
                        y = b.Height / 2 + Math.Sin(angoloCasuale) * distanzaCasuale2
                        ' g.RotateTransform(rnd.Next(5, 30))
                    End If

                    Dim RettangoloStringa As New Rectangle(New Point(x, y), SIzeFString.ToSize)

                    Dim R As New Region(PathRettangoli)

                    If Not R.IsVisible(RettangoloStringa) Then 'verifico se il nuovo rettangololstringa si sovrappone alla parte già esistente
                        g.DrawString(.Parola, FontProporzionato, New SolidBrush(.Colore), x, y)
                        stampata = True

                        PathRettangoli.AddRectangle(RettangoloStringa)
                    End If




                Loop


              
                ' g.ResetTransform()


            End With
            i += 1

        Next InfoParola

        Me.PictureBox1.Image = b

    End Sub


End Class

Public Class InfoParola

    Public x As Integer
    Public y As Integer

    Function RettangoloOccupato() As Rectangle
        Return New Rectangle(x, y, CInt(Me.LarghezzaParola), CInt(Me.AltezzaPaola))


    End Function

    Public Parola As String
    Public FrequenzaAssoluta As Integer

    Public DimensioneDelFontCorrispondenteAllaFrequenza As Single
    Public LarghezzaParola As Single
    Public AltezzaPaola As Single

    Public Colore As Color

    Dim r As Rectangle



End Class




Esercizio 1 (prezzi) - Enrico Scafà , Carlo Giustiniani

Public Class Form1

    Private b As Bitmap
    Private g As Graphics

    Private MargineSinistro As Integer = 60
    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("lucida", 9, FontStyle.Bold)

    Dim ListaOsservazioni_BID As List(Of Osservazione)
    Dim ListaOsservazioni_ASK As List(Of Osservazione)
    Dim ListaMedieMobili_BID As List(Of Osservazione)
    Dim ListaMedieMobili_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)

        ListaMedieMobili_BID = New List(Of Osservazione)
        ListaMedieMobili_ASK = New List(Of Osservazione)

        ' Scorre ogni riga del file di prezzi e memorizza le oss. Bid ed Asl
        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

        ' Media mobili _BID


        For i As Integer = k + 1 To ListaOsservazioni_BID.Count - k - 2
            Dim mm_BID As Double = Me.MediaMobile(ListaOsservazioni_BID, i)

            Dim oss_BID As New Osservazione

            With oss_BID
                .Prezzo = mm_BID
                .Istante = ListaOsservazioni_BID(i).Istante
            End With

            ListaMedieMobili_BID.Add(oss_BID)
        Next


        ' Media mobili _ASK


        For i As Integer = k + 1 To ListaOsservazioni_ASK.Count - k - 2

            Dim mm_ASK As Double = Me.MediaMobile(ListaOsservazioni_ASK, i)
            Dim oss_ASK As New Osservazione

            With oss_ASK
                .Prezzo = mm_ASK
                .Istante = ListaOsservazioni_ASK(i).Istante
            End With

            ListaMedieMobili_ASK.Add(oss_ASK)


        Next






        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 listaDiPunti_MEDIA_ASK As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaMedieMobili_ASK)
        Dim listaDiPunti_MEDIA_BID As List(Of Point) = Me.CreaListaPuntiDaListaOsservazioni(ListaMedieMobili_BID)



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


        'Curve dei prezzi

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

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


        ' Media_BID

        Dim p_MEDIA_BID As New Pen(Color.DarkOliveGreen, 1)
        g.DrawLines(p_MEDIA_BID, listaDiPunti_MEDIA_BID.ToArray)

        ' Media_ASK

        Dim p_MEDIA_ASK As New Pen(Color.DarkGray, 1)
        g.DrawLines(p_MEDIA_ASK, listaDiPunti_MEDIA_ASK.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)


        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

        'Trovo il minimo ed il massimo per gestire la grafica
        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)
                Dim Y_Sul_Bitmap As Integer = Me.Trasforma_Y(y, MinimoPrezzo, MassimoPrezzo, MargineAlto, MargineBasso)


                Dim p As New Point(X_Sul_Bitmap, Y_Sul_Bitmap)


                ListaPunti.Add(p)

            End With

        Next Osservazione

        Return ListaPunti

    End Function

    'rende la X relativa per usarla nel grafico   
    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

    'rende la Y relativa per usarla nel grafico   
    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

            Dim Y_Bitmap = Me.Trasforma_Y(Prezzo, Me.MinimoPrezzo, Me.MassimoPrezzo, Me.MargineAlto, Me.MargineBasso)
            Me.g.DrawString(Prezzo.ToString, Me.FontPrezzi, Brushes.Red, 0, 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

    Public k As Integer

    Function MediaMobile(ByVal v As List(Of Osservazione), ByVal posizione As Integer)

        Dim somma As Double
        Dim media As Double
        Dim conta As Double

        For i As Integer = posizione - k To posizione + k
            somma += v(i).Prezzo
            conta += 1
        Next

        media = somma / conta

        Return media

    End Function


End Class


Public Class Osservazione

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

End Class