Istruzioni all'uso

 
Utilizzo del Tool

Il tool permette di visualizzare la funzione matematica desiderata definibile liberamente dall'utente

funzionalità

 

Formula

casella di testo

Nella parte superiore è presente un campo di input testuale in tramite il quale è possibile specificare la funzione da visualizzare:
non è necessario scrivere "y =" e la funzione deve essere scritta in modo matematico (naturale).
Alcuni esempi sono illustrati nelle righe seguenti:
- 3x
- 3x*x
- sin(x)
- cos(x)
- tan(x)
- asin(x)
- acos(x)
- atan(x)
- abs(x)
- floor(x) (arrotondamento all'intero inferiore)
- ceiling(x) (arrotondamento all'intero superiore)
- pow(x,2)
- log(x)
- logn(x)
- log10(x)
- rad(x)
- sqr(x)
(int) *
(double) *
(float) *
(decimal) *

Per i campi contrassegnati con * è necessario inserire (double) all'inizio dell'espressione: es: (double) (int) x / (double) x
In ogni caso è possibile evitare la scrittura dell'operatore "*" tra i termini numerici e operatori: es: 3sin(4x)

Intervallo e campionamento

intervallo

Per impostare l'ascissa di inizio e di fine campionamento ed il passo utilizzare le caselle numeriche.
Naturalmente più il passo risulta piccolo in rapporto al cambiamento della funzione ed all'intervallo specificato, maggiore sarà la precisione del grafico e dei valori di massimo e minimo calcolati.
Ovvero il numero di campioni (stop - start)/passo dtermina la precisione del grafico della funzione. Deve essere compreso tra 1000 e 2 000 000. Il numero dei campioni viene calcolato automaticamente o al premere del tasto in basso a destra.

Un numero di campioni troppo scarso puo' essere causa di significativi errori di visualizzazione. Al contario un numero eccessivamente elevato di campioni potrebbe causare lentezza nella visualizzazione, ma assicura una maggiore precisione ed affidabilità.

Per visualizzare la funzione premere il tasto "Calcola" in alto a sinistra. Per resettare la visualizzazione allo stato iniziale premere "Disegna".


Preview e visione sinottica

Il pannello in alto mostra una rappresentazione della funzione nell'intervallo completo in cui è possibile visualizzarla.

Visualizzazione della funzione

Il riquadro a sinistra mostra in dettaglio la funzione specificata.
In colore blu è mostata la funzione specificata, in grigio la sua derivata (dy/dx).

Tramite la scrollbar orizzontale è possibile modificare l'intervallo di visualizzazione

mentre l'ampiezza dell'intervallo visualizzato, ovvero lo zoom, è modificabile attraverso i tasti "Zoom +" e "Zoom -".
Un livello di zoom troppo elevato rispetto alla precisione (numero di campioni) della funzione puo' causare una visualizzazione distorta.

E' possibile mostare o nascondere la griglia e mostare o nacondere la visualizzazione della derivata.



Informazioni

Il riquadro in basso ospita due schede: la prima permette di visualizzare i valori di ordinata massimi e minimi.
Con il nome di "valore locale" si intende il valore massimo o minimo relativo alla sola area visualizzata nel riquadro principale.
E' importante considerare che la dicitura "Globali" non rappresenta sempre il valore massimo o minimo della funzione, ma solo i valori di massimo e minimo nell'intervallo calcolato !!!.

I colori della scheda informativa riprendono i cerchietti colorati che mostrano nel riquadro principali i relativi punti.

La scheda "Informazioni" permette di modificare alcune impostazioni dell'applicazione.

Modificando il valore "Dettaglio griglia" si aumenta o si riduce la il dettaglio della griglia. Valori alti sono maggiormenti adati quando l'applicazione viene ingrandita: altrimenti le etichette relative possono risultare confuse.

 

Etichette

E' possibile applicare delle etichette cliccando sull'area di visualizzazione. Le etichette mostrano i valori di x ed y della funzione nel punto selezionato: possono essere di due tipi.

Tipo 1:
si inserisce clicando col tasto sinistro (singolo click). Se si clicca col tasto sinistro su un altro punto l'etichetta viene spostata.
Per eliminare l'etichetta è sufficiente cliccarci sopra o modificare il campo di visualizzazione o resettare la visualizzazione.
Questo tipo di etichetta è di colore azzurro.

Tipo 2:
si inserisce clicando col tasto destro (singolo click). Se si clicca col tasto destro su un altro punto viene istanziata una nuova etichetta e non vengono modificate o cancellate quelle inserite precedentemente..
Per eliminare l'etichetta è sufficiente cliccarci sopra o modificare il campo di visualizzazione o resettare la visualizzazione.
Questo tipo di etichetta è di colore rosso.

 

Note tecniche sulla realizzazione e sul funzionamento del tool

Il problema principale è il calcolo di una funzione definitadall'utente e quindi sconosciuta a priori.
E' possibile procedere in due modi:
- Interpetazione (parsing) della funzione
- Compilazione di codice contenete la funzione
Si è scelta l'ultima possibilità sfruttando le potenzialità di Visual Studio Net 2005 e C#.

L'idea di base è quella di scrivere dei parametri o i valori delle x in un file e di compilare una dll che scriva i valori delle y su un'altro file calcolandoli secondo la funzione definita dall'utente.

Il problema è che non appena si utilizza la funzione della dll compilata non è possibile cancellarla o sostituirla con un'altra (a seguito della richiesta di calcolo di un'altra funzione).
Questo problema è risolvibile in due modi:
- Tramite utilizzo di "AppDomain"
- Tramite l'utilizzo di un eseguibile lanciato in background che a sua volta utilizza la dll compilata dal programma principale.
Si è scelta la seconda soluzione.

L'applicazione secondaria viene lanciata da quella principale. Le appliazioni interagiscono attraverso "Windows Messages". Ad esempio di manda un codice all'applicativo chiamante quando l'operazione di calcolo è terminata, oppure si invoca la chiusura dell'applicativo secondario.

Lo schema di funzionamento è il seguente:

APPLICATIVO PRINCIPALE ---> APPLICATIVO SECONDARIO ----> DLL

Il codice che viene compilato è parametrizzabile. Tale codice è riportato nelle seguenti righe:

using System;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.IO;
using System.Text;
public class CalcBackgrounddll
{

[DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern int SendMessage(IntPtr hwnd, [MarshalAs(UnmanagedType.U4)] int Msg, IntPtr wParam, IntPtr lParam);


public static void sendm(int a)
{
Process proc = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName("SwohGraph");
if (processes.Length >= 1)
{
foreach (Process p in processes)
{
if (p.Id != proc.Id)
{
{
SendMessage(p.MainWindowHandle, 1029, IntPtr.Zero, IntPtr.Zero);
}
}
}
}
else
{
}
}

public static double calcolay(double x)
{
return STRINGA UTENTE PARSATA;
}
}

Un'altro problema è il parsing della stringa che contiene la funzione definita dall'utente in una porzione di codice compilabile.
Ad esempio l'espressione:
y = sin(x) deve essere convertita in y = Math.Sin(x)
Questa operazione viene svolta da una classe che rappresenta un semplicissimo e limitato parser che tramite un'operazione di "Find and Replace" effettua la trasformazione necessara.

// Trova e sostituisce
private string findandreplace(string from)
{
for (int i =0; i<arfrom.Count;i++)
{
string s = (string)arfrom[i];
int lungh = s.Length;
for (int f=0;f<from.Length-lungh;f++)
{
string confr = from.Substring(f,lungh);
if (confr == s)
{
string one = from.Substring(0,f);
string two = from.Substring(f+lungh,from.Length-f-lungh);
from = one+(string)arto[i]+two;
}
}

}
return from;
}

Per poter visualizzare la funzione solo nell'intervallo specificato ed effettuare lo zoom è necessario effettuare una decimazione (se i punti di partenza, grezzi, sono in numero maggiore di quelli desiderati) o una interpolazione.
Questa operazione viene svolta da una funzione della clase CPoints che permette inoltre di memorizzare i campioni sorhenti (grezzi) e quelli da visualizzare.
E' necessario inoltre operare semplici traformazioni come l'applicazione di un offsett e uno scalamento lineare per adattare i campioni alla visualizzaione nell'area di visualizzazione grafica (picturebox).

Per ogni altra considerazione si rimanda al codice sorgente.


Commenti degli utenti:


Scrivi un commento
 

Per inserire un commento è necessario essere loggati