2008-12-05 8 views
2

J'essaie de construire une fonction grapher,Algorithme 2D Référentiel traduction

L'utilisateur entre xmin, xmax, ymin, ymax, fonction. J'ai obtenu le x, y pour tous les points.

Maintenant, je veux traduire ce référentiel initial à un canevas à partir de 0,0 jusqu'à 250,250.

Y at-il un court chemin ou devrais-je vérifier

if x < 0 
new x = (x - xmin) * (250/(xmax - xmin)) ? 

etc ..

De plus, cette approche de base n'optimise pas l'échantillonnage. Par exemple si ma fonction f (x) = 5 je n'ai pas besoin d'échantillonner le xrange en 500 points, j'ai seulement besoin de deux points. Je pourrais faire des vérifications heuristiques.

Mais pour une fonction comme sin (2/x) j'ai besoin de plus d'échantillonnage autour de x (-1,1) comment auriez-vous une telle chose?

Merci

Répondre

0
  1. Vous pouvez estimer le dérivé (si vous en avez un).
  2. Vous pouvez utiliser une approche bidirectionnelle (dichotomique): estimez la différence et divisez le segment si nécessaire.
0

Je pense que je commencerais par raisonner à ce sujet en termes de transformations du canevas au contexte mathématique.

(canvas_x, canvas_y) -> (maths_x, maths_y) 
(maths_x, maths_y) -> (canvas_x, canvas_y) 

maths_x -> maths_y 

Vous itérez sur les points qui peuvent être affichés, en boucle sur canvas_x.

Cela se traduirait par des fonctions simples:

maths_x = maths_x_from_canvas_x(canvas_x, min_maths_x, max_maths_x) 
maths_y = maths_y_from_maths_x(maths_x) # this is the function to be plotted. 
canvas_y = canvas_y_from_maths_y(maths_y, min_maths_y, max_maths_y) 

if (canvas_y not out of bounds) plot(canvas_x, canvas_y) 

Une fois que vous obtenez ici, il est relativement simple d'écrire ces fonctions simples dans le code.

Optimisez à partir d'ici.

Je pense que pour cette approche, vous n'aurez pas besoin d'en savoir trop sur les fréquences d'échantillonnage, car vous échantillonnez à un débit approprié pour l'affichage. Ce ne serait pas optimal - votre exemple de y = 5 est un bon exemple, mais vous seriez sûr de ne pas en échantillonner plus que ce que vous pouvez afficher.

1

Au lieu de itérer sur x dans les coordonnées d'origine, itérer sur la toile, puis retransformer aux coordonnées d'origine:

for (int xcanvas = 0; xcanvas <= 250; i++) { 
    double x = ((xmax - xmin) * xcanvas/250.0) + xmin; 
    double y = f(x); 

    int ycanvas = 250 * (y - ymin)/(ymax - ymin) + .5; 

    // Plot (xcanvas, ycanvas) 
} 

Cela vous donne exactement une évaluation de la fonction pour chaque colonne de la toile.

+0

Qu'en est-il de la partie échantillonnage? – Shashwat

+0

Cela fait exactement un échantillon par pixel, ce qui devrait suffire pour la plupart des fonctions. Vous pouvez vérifier dynamiquement les pixels adjacents dans les colonnes adjacentes du canevas pour voir s'ils sont éloignés et ajouter d'autres échantillons si vous le souhaitez. –