2011-01-15 14 views
5

Quindi sto scrivendo una calcolatrice grafica. Finora ho un grapher semi-funzionale, tuttavia, sto attraversando un periodo difficile per ottenere un buon equilibrio tra grafici accurati e curve dall'aspetto lineare.Come implementare un grapher in C#

L'implementazione corrente (-pseudo-codice semi) simile a questa:

for (float i = GraphXMin; i <= GraphXMax; i++) 
{ 
    PointF P = new PointF(i, EvaluateFunction(Function, i) 
    ListOfPoints.Add(P) 
} 
Graphics.DrawCurve(ListOfPoints) 

Il problema è dato che aggiunge solo un punto ad ogni valore intero, grafici finiscono distorta quando i loro punti di svolta non cadere su numeri interi (es. sin (x)^2).

alt text

ho cercato incrementando i da qualcosa di più piccolo (come 0.1), che funziona, ma il grafico sembra molto agitato.

alt text

Sto usando C# e GDI +. Ho SmoothingMethod impostato su AntiAlias, quindi non è questo il problema, come puoi vedere dal primo grafico. C'è qualche tipo di problema con le curve di disegno con molti punti? I punti potrebbero essere posizionati esattamente sui pixel?

Sono sicuro che alcuni di voi hanno già lavorato su qualcosa di molto simile, quindi qualche suggerimento? Mentre ci sei, hai qualche suggerimento per le funzioni grafiche con gli asintoti? per esempio. 1/x^2

P.S. Non sto cercando una libreria che faccia tutto questo, voglio scriverlo da solo.

+0

cosa intendi con "il grafico sembra molto approssimativo"? aumentare il numero di punti è la strada da percorrere, per farlo apparire più liscio. E rendendo più piccoli gli X-steps (1 -> 0.1) * li * aumentano. – user492238

+0

Inoltre non so, cosa intendi con "suggerimenti per la rappresentazione grafica delle funzioni con gli asintoti". Cosa ti aspetti? Come si gestiscono in modo diverso rispetto ad altri grafici? Non sono. – user492238

+0

Ho modificato per renderlo più chiaro. – ian93

risposta

1

OK, ho risolto il problema. Da qualche parte nel processo di disegno stavo usando int piuttosto che float.

2

Durante il rendering di un grafico si verificano sempre errori di arrotondamento perché una bitmap è discreta e il grafico non lo è.

Ci diversi modi di affrontare:

  1. uso di anti-aliasing; sta solo rendendo il grafico più agevole.
  2. utilizzare un'interpolazione non lineare. Disegnare dal punto a al punto b usando un'interpolazione di lineair causa angoli. Calcolare la pendenza del grafico (non del segmento di linea!) In ciascun punto e alimentare la pendenza al metodo di interpolazione (bicubico o bezier curva)

Utilizzando le API vettore come WPF o Silverlight rende le cose facili da strumento.

Prendersi cura degli asintoti è piuttosto difficile. Prima devi trovarli e poi saltare il valore in modo da poter fare il 'buco' nel grafico.