2010-11-23 5 views
1

J'ai un ensemble de x coordonnées x = {0,32,64, ... 256} et y = {2,6,4 ....}, je vais tracer le graphique le long de l'axe x_y, alors je fais glisser le point 128 à 64 le long de l'axe des x, maintenant je veux que le côté gauche du point soit compressé et le côté droit soit agrandi. Comment puis-je recalculer les coordonnées du graphique en C. Toute aide est appréciée. voici mon code ...dessin de courbe interactif

int arr_x[]={32,64,96,128,160,192,224,256}; 
int arr_y[]={7,12,8,6,14,22,18,24}; 

int x1=64,x2=128; //drag x2 to x1 
int min_val=abs(arr_x[0]-x2); 
int idx=0; 

for (int i = 1; i < 8; i++) 
     { 
      if ((abs(arr_x[i] -x2)) < min_val) 
      { 
       min_val = abs(arr_x[i] - x2); 
       idx = i; 
      } 
     } 

float r;//ratio for compression and enlarge 

if(x2>x1) 
{ 
    arr_x[idx]=x2; 
    r=(float)x2/x1; 

     for(int i=0;i<=idx;i++) 
     { 
     arr_x[i]=arr_x[i]*r; 
     } 

    for(int i=idx+1;i<8;i++) 
    { 
     arr_x[i]=arr_x[i]/r; 
    } 
} 
else 
{ 
    arr_x[idx]=x2; 
    r=(float)x1/x2; 

     for(int i=0;i<=idx;i++) 
     { 
     arr_x[i]=arr_x[i]*r; 
     } 

    for(int i=idx+1;i<8;i++) 
    { 
     arr_x[i]=arr_x[i]/r; 
    } 
+0

Qu'avez-vous déjà fait? Quel est votre algorithme actuel? –

+0

@Alastair: veuillez trouver le code ci-dessus ... –

+0

@Javed: C# pour tracer le graphe et C (dll) pour calculer les coordonnées –

Répondre

1

Vous avez besoin de deux systèmes coodinate pour éviter toute confusion. Un sur l'écran (S), un sur vos axes (X). Les deux vont de {0 ... 256}

Vous devez calculer les coordonnées de l'écran lorsque vous déplacez un point d'axe. Supposons que vous déplacez le point X0 à la position S1.

So, if X < X0 the screen coordinate for X is (X * S1/X0) 

If X > X0 the screen coordinate for X is ((256-S1)/(256-X0))*(X-X0)+S1 

Dans votre exemple, remplacez X0 par 128 et S1 par 64.

Un exemple:

Avant:

alt text

Après:

alt text

HTH!

+0

thx .... qui fonctionne ... –