2012-01-26 14 views
2

Ok donc j'ai regardé dans l'interpolation ces derniers temps. Malheureusement, presque tous les articles que j'ai lus ne traitent que de l'interpolation à un niveau décimal de 0,0 à 1,0 pour être exact. Je voudrais interpoler des nombres entiers entiers indépendamment de leur taille ou de leur nombre négatif ou autre. J'ai accompli ceci avec l'interpolation linéaire:Interpolation de cosinus avec entiers

public int interpolate(int y1, int y2, int length, int x){ 
    return y1 + x * (y2 - y1)/(length-1); 
} 

Cependant je suis coincé avec l'interpolation de cosinus. This grand article parle d'interpolation de cosinus mais c'est sur un système de nombres de 0.0 à 1.0 comme indiqué ci-dessus. Voici ce que j'ai jusqu'à présent:

public int interpolate(int y1, int y2, int length, int x){ 
    int v = (int)(y2 - Mathf.Cos(x * 3.1415f))/2; 
    return (y1 + x * (y2 - y1)/(length-1)) * v; 
} 

Il ne fonctionne pas si elle retourne un nombre presque aléatoire sans direction réelle rendant pas lisse du tout. C'est ici que j'ai besoin de votre aide. Longue histoire courte: Comment faire une fonction d'interpolation de cosinus qui traite des nombres entiers?

+3

Vous semblez avoir mal compris l'article auquel vous avez lié. Il ne dit pas que son système de nombres est de 0.0 à 1.0; plutôt, il dit que vous devriez mettre mu = 0 quand vous êtes au premier point de terminaison et mu = 1 quand vous êtes au point de terminaison. Donc, si vos points d'extrémité sont (x1, y1) et (x2, y2), et que vous voulez interpoler à x, alors mu = x1 + (x-x1)/(x2-x1). – ruakh

+0

@ruakh ne devrait-il pas être mu = (x-x1)/(x2-x1)? – pkExec

+0

@pkExec: Oups, oui, merci. – ruakh

Répondre

1

Vous devez

(int) ((1+cos(pi*x/(length-1)))/2 * (y1-y2)+y2) 

Cosinus va de 1 à -1 comme l'angle passe de 0 à pi. Ajouter 1 et diviser par deux et vous obtenez une belle fonction qui va de 1 à 0. Le reste est en train de transformer l'argument.

+0

Cela fonctionne mais il semble renverser les chiffres. Si je règle y1 pour dire 20 et y2 à 50 alors le résultat sera une interpolation de 50 à 20 pas 20 à 50. – MrSplosion

+0

Ensuite, il suffit de basculer y1 et y2 autour. J'ai modifié la formule pour vous. – Joni