Developpement Empirium Index du Forum Developpement Empirium



@landovan

 
Poster un nouveau sujet   Répondre au sujet    Developpement Empirium Index du Forum -> Presque tout et n'importe quoi
Voir le sujet précédent :: Voir le sujet suivant  
Leamas
Mais faites le taire !!!


Inscrit le: 05 Jan 2010
Messages: 632

 MessagePosté le: Ven 19 Avr 2013, 16:44    Sujet du message: @landovan Répondre en citant Back to top

bon, voila ma première idée:
Code:
int settrajectories (int xd, int yd, int xa, int ya, int speed) // using a char is impossible :-(((
{
    if (speed==0)
    {
        printf("A planet does not move!");
        return (-1);
    }
    int dx=xa-xd, dy=ya-yd;
    int distance=sqrtf(dx*dx+dy*dy);//the ^ symbol is a binary operator!!!
    int nbstops=ceil((float)distance/(float)speed);
    printf("%f\n",(float)distance/(float)speed);
    int stops_x[nbstops],stops_y[nbstops];//stops is not a struct because I am lasy today
    int i=0;
    while((distance>speed)&(i<nbstops-1))
    {
        stops_x[i]=xd+trunc(speed*dx/distance);
        stops_y[i]=yd+trunc(speed*dy/distance);
        xd=stops_x[i];yd=stops_y[i];distance=sqrtf(dx*dx+dy*dy);
        i++;
    }
    stops_x[i]=xa;
    stops_y[i]=ya;
    i=0;
    while(i<nbstops)
    {
        printf("%d|", stops_x[i]);
        i++;
    }i=0; printf("\n");
    while(i<nbstops)
    {
        printf("%d|", stops_y[i]);
        i++;
    }i=0; printf("\n");
    while(i<nbstops-1)
    {
        i++;
        printf("%f|", sqrtf((stops_y[i]-stops_y[i-1])*(stops_y[i]-stops_y[i-1])+(stops_x[i]-stops_x[i-1])*(stops_x[i]-stops_x[i-1])));

    }
    return (0);
}

elle n'est pas fonctionnelle, car il y a des effets de seuil... essaye:
settrajectories(0,0,56,135,10)... on obtiens:
Code:
14.600000
3|6|9|12|15|18|21|24|27|30|33|36|39|42|56|
9|18|27|36|45|54|63|72|81|90|99|108|117|126|135|
9.486833|9.486833|9.486833|9.486833|9.486833|9.486833|9.486833|9.486833|9.486833|9.486833|9.486833|9.486833|9.486833|16.643317|


tu comprendra ce dont je parle... d'ailleurs, on remarque sur cet exemple que la vitesse du vaisseau est sous employée (il se déplace systématiquement de 9du)... prochaine mouture sous peu...
 
Voir le profil de l'utilisateur Envoyer un message privé
Leamas
Mais faites le taire !!!


Inscrit le: 05 Jan 2010
Messages: 632

 MessagePosté le: Ven 19 Avr 2013, 17:16    Sujet du message: Répondre en citant Back to top

Hops, voila l'amélioration pensée:
Si l'on se déplace de moins de 9,5 DU par cycle, alors on demande a ce déplacer d'un DU de plus... dans la direction prédominante.

Le temps de calcul est aussi probablement plus faible:

Code:
int settrajectories (int xd, int yd, int xa, int ya, int speed)
{
    if (speed==0)
    {
        printf("A planet does not move!");
        return (-1);
    }
    int dx=xa-xd, dy=ya-yd;
    int distance=sqrtf(dx*dx+dy*dy);//the ^ symbol is a binary operator!!!
    int nbstops=ceil((float)distance/(float)speed);
    printf("%f, %d\n",(float)distance/(float)speed, nbstops);
    int stops_x[nbstops],stops_y[nbstops];//stops is not a struct because I am lasy today
    int i=0;
    int stepx=trunc(speed*dx/distance), stepy=trunc(speed*dy/distance), im=0;//im: is modified
    if (stepx*stepx+stepy*stepy<9.5*9.5)
    {
        im=1;
        if(stepx*stepx>=stepy*stepy)
        {
            if(stepx>0)
            {
                stepx++;
            }
            else
            {
                stepx--;
            }
        }
        else
        {
            if(stepy>0)
            {
                stepy++;
            }
            else
            {
                stepy--;
            }
        }
    }
    while(i<nbstops-1)
    {
        stops_x[i]=xd+stepx;
        stops_y[i]=yd+stepy;
        xd=stops_x[i];
        yd=stops_y[i];
        if (im)
        {
            dx-=stepx;
            dy-=stepy;
            distance=sqrtf(dx*dx+dy*dy);
            stepx=trunc(speed*dx/distance); stepy=trunc(speed*dy/distance); im=0;
            if (stepx*stepx+stepy*stepy<9.5*9.5)
            {
                im=1;
                if(stepx*stepx>=stepy*stepy)
                {
                    if(stepx>0)
                    {
                        stepx++;
                    }
                    else
                    {
                        stepx--;
                    }
                }
                else
                {
                    if(stepy>0)
                    {
                        stepy++;
                    }
                    else
                    {
                        stepy--;
                    }
                }
            }
        }
        i++;
    }
    stops_x[i]=xa;
    stops_y[i]=ya;
    i=0;
    while(i<nbstops)
    {
        printf("%d|", stops_x[i]);
        i++;
    }
    i=0;
    printf("\n");
    while(i<nbstops)
    {
        printf("%d|", stops_y[i]);
        i++;
    }
    i=0;
    printf("\n");
    while(i<nbstops-1)
    {
        i++;
        printf("%f|", sqrtf((stops_y[i]-stops_y[i-1])*(stops_y[i]-stops_y[i-1])+(stops_x[i]-stops_x[i-1])*(stops_x[i]-stops_x[i-1])));

    }
    return (0);
}


Bon, maintenant je vais tester le fonctionnement sur tout les déplacements possibles: de -1000-1000DU a +1000+1000DU... si l'un d'eux merde, je le dézingue...
 
Voir le profil de l'utilisateur Envoyer un message privé
Landovan
Mais faites le taire !!!


Inscrit le: 17 Sep 2009
Messages: 522
Localisation: Prima Ivee

 MessagePosté le: Ven 19 Avr 2013, 20:42    Sujet du message: Répondre en citant Back to top

Merci Leamas
mais en fait, ca s adresse plutot a Max, et la je sais pas s il va voir le resultat de tes recherches Sourire

faudrait le mettre dans evolutions/nouveautes
genre "@Max : Deplacement automatique - calculs de coordonnees"

en ts cas bravo a toi !
 
Voir le profil de l'utilisateur Envoyer un message privé
Leamas
Mais faites le taire !!!


Inscrit le: 05 Jan 2010
Messages: 632

 MessagePosté le: Ven 19 Avr 2013, 22:07    Sujet du message: Répondre en citant Back to top

oui...mais j'irai polluer cette section du fofo quand j'aurais un truc qui tourne au moins en C (mais peut être aussi en js et en php)...


j'ai patché quelques problèmes mais pour pousuivre mes tests, je dois résoudre mon bug de linker... et comprendre le truc vachement spé que me pond mon IDE:
je peut utiliser
Code:
settrajectories (0, 0, 360, 360, 7);

mais pas:
Code:

int s=7;
settrajectories (0, 0, 360, 360, s);


et sa... il me semble que, pour une raison qui lui est propre, il considère qu'on a toujours: speed==10...
d'ailleurs, quand je lui demande de me dire
Citation:
printf("%d", speed);
il semble qu'il parte dans une boucle infinie!

La morale (temporaire): les IDE, c'est le mal.

L'étape d'après, celle qui est drôle c'est de recoder sqrtf (avec l'algorithme de Newton, qui dans ce cas précis date de l'antiquité égyptienne et grecque) pour accélérer notablement la convergence en amoindrissant la précision et en choisissant astucieusement le point de départ (soit du fait que l'on sait que l'on c'est déplacé de 10DU soit par la majoration de la norme 2 par la norme 1). Mais je ferait sa une fois que j'aurais une version stable...
 
Voir le profil de l'utilisateur Envoyer un message privé
Leamas
Mais faites le taire !!!


Inscrit le: 05 Jan 2010
Messages: 632

 MessagePosté le: Ven 19 Avr 2013, 22:09    Sujet du message: Répondre en citant Back to top

voila la dernière version... si qqn comprend le bug:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int setsteps(int* stepx, int* stepy,int speed);
int settrajectories (int xd, int yd, int xa, int ya, int speed);
void giveresults(int abs[], int ord[] ,int size);
char checkresults(int abs[], int ord[], int size,int speed);

inline int c (int x)
{
    return(x*x);
}

int settrajectories (int xd, int yd, int xa, int ya, int speed)
{
    if (speed==0)
    {
        printf("A planet does not move!");
        return (-1);
    }
    int dx=xa-xd, dy=ya-yd;
    float distance=sqrtf(dx*dx+dy*dy);//the ^ symbol is a binary operator!!!
    int i=0;
    int stepx=trunc(speed*dx/distance), stepy=trunc(speed*dy/distance), im=0;//im: is modified
    int nbstops=ceil(distance/sqrtf(stepx*stepx+stepy*stepy));
    int stops_x[nbstops],stops_y[nbstops];//stops is not a struct because I am lasy today
    im=setsteps(&stepx,&stepy, speed);
    while(i<nbstops-1)
    {
        stops_x[i]=xd+stepx;
        stops_y[i]=yd+stepy;
        xd=stops_x[i];
        yd=stops_y[i];
        if (im)
        {
            dx=xa-xd;
            dy=ya-yd;
            distance=sqrtf(dx*dx+dy*dy);
            stepx=trunc(((float)(speed*dx))/distance);
            stepy=trunc(((float)(speed*dy))/distance);
            im=setsteps(&stepx,&stepy, speed);
        }
        i++;
    }
    stops_x[i]=xa;
    stops_y[i]=ya;
    giveresults(stops_x,stops_y, nbstops);
    i=checkresults(stops_x,stops_y, nbstops, speed);
    return (i);
}

char checkresults(int abs[], int ord[], int size,int speed)
{
    int i=1;
    while (i<size)
    {
        if(c(abs[i]-abs[i-1])+c(ord[i]-ord[i-1])>c(speed+0.5))
        {
            return(0);
        }
        i++;
    }
    return(1);
}

void giveresults(int abs[], int ord[],int size)
{
    int i=0;
    while(i<size)
    {
        printf("%d|", abs[i]);
        i++;
    }
    i=0;
    printf("\n");
    while(i<size)
    {
        printf("%d|", abs[i]);
        i++;
    }
}

int setsteps(int* stepx, int* stepy, int speed)
{
    if (c(*stepx)>=c(*stepy))
    {
        if(c(*stepx+1)+c(*stepy)<c(speed+0.5))
        {
            if(*stepx>0)
            {
                *stepx=*stepx+1;
            }
            else
            {
                *stepx=*stepx-1;
            }
            return(1);
        }
        else if(c(*stepx)+c(*stepy+1)<c(speed+0.5))
        {
            if(*stepy>0)
            {
                *stepy=*stepy+1;
            }
            else
            {
                *stepy=*stepy-1;
            }
            return(1);
        }
    }
    else
    {
        if(c(*stepx)+c(*stepy+1)<c(speed+0.5))
        {
            if(*stepy>0)
            {
                *stepy=*stepy+1;
            }
            else
            {
                *stepy=*stepy-1;
            }
            return(1);
        }
        else if(c(*stepx+1)+c(*stepy)<c(speed+0.5))
        {
            if(*stepx>0)
            {
                *stepx=*stepx+1;
            }
            else
            {
                *stepx=*stepx-1;
            }
            return(1);
        }
    }
    return(0);
}


Je vais dormir... je reprend demain (normalement)
 
Voir le profil de l'utilisateur Envoyer un message privé
Leamas
Mais faites le taire !!!


Inscrit le: 05 Jan 2010
Messages: 632

 MessagePosté le: Ven 19 Avr 2013, 22:45    Sujet du message: Répondre en citant Back to top

bug de linker résolu:
utiliser l'option -lm dans gcc pour pouvoir utiliser math.h... par contre le truc chelou vient pas de l'IDE...[/code]
 
Voir le profil de l'utilisateur Envoyer un message privé
Leamas
Mais faites le taire !!!


Inscrit le: 05 Jan 2010
Messages: 632

 MessagePosté le: Sam 20 Avr 2013, 18:29    Sujet du message: Répondre en citant Back to top

bon, j'ai trouvé mon effet de louvoiement chelou qui me cassait les couilles pour les CC qui vont de A8 en F0... sa devrait marcher...
 
Voir le profil de l'utilisateur Envoyer un message privé
Leamas
Mais faites le taire !!!


Inscrit le: 05 Jan 2010
Messages: 632

 MessagePosté le: Sam 20 Avr 2013, 18:42    Sujet du message: Répondre en citant Back to top

tests lancés...
 
Voir le profil de l'utilisateur Envoyer un message privé
Leamas
Mais faites le taire !!!


Inscrit le: 05 Jan 2010
Messages: 632

 MessagePosté le: Sam 20 Avr 2013, 18:45    Sujet du message: Répondre en citant Back to top

tests valides!
second benchmark bientot...
 
Voir le profil de l'utilisateur Envoyer un message privé
Leamas
Mais faites le taire !!!


Inscrit le: 05 Jan 2010
Messages: 632

 MessagePosté le: Sam 20 Avr 2013, 18:58    Sujet du message: Répondre en citant Back to top

second benchmark ok...

il semble que la fonction si dessous soit efficace (1 000 000 de calculs de trajectoires sur une map de 2000 par 2000 en 47s) et fonctionne pour tout s>=2.

Il est possible de la faire fonctionner pour s=1, mais on rique alors des core dump dus a des stack overflow...

Code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int setsteps(int* stepx, int* stepy,int speed, int dx, int dy);
int settrajectories (int xd, int yd, int xa, int ya, int speed);
void giveresults(int abs[], int ord[] ,int size);
char checkresults(int abs[], int ord[], int size,int speed);

inline int c (float x)
{
    return(x*x);
}
inline float min (float a, float b)
{
    if (a<b)
    {
        return(a);
    }
    return(b);
}
int settrajectories (int xd, int yd, int xa, int ya, int speed)
{
    if (speed<2)
    {
        printf("you are slower than a planet!!");
        return (-1);
    }
    int dx=xa-xd, dy=ya-yd;
    if ((dx==0)&(dy==0))
    {
        printf("don't move!");
    }
    float distance=sqrtf(dx*dx+dy*dy);//the ^ symbol is a binary operator!!!
    int i=0;
    int stepx=trunc(speed*dx/distance), stepy=trunc(speed*dy/distance), im=0;//im: is modified
    im=setsteps(&stepx,&stepy, speed, dx, dy);
    int nbstops=ceil((distance/(speed-1.5)));
    //printf("  %d %f\n\n", nbstops, distance);
    int stops_x[nbstops],stops_y[nbstops];//stops is not a struct because I am lasy today
    setsteps(&stepx,&stepy, speed, dx, dy);
    setsteps(&stepx,&stepy, speed, dx, dy);
    setsteps(&stepx,&stepy, speed, dx, dy);
    while(i<nbstops-1)
    {
        stops_x[i]=xd+stepx;
        stops_y[i]=yd+stepy;
        xd=stops_x[i];
        yd=stops_y[i];

        dx=xa-xd;
        dy=ya-yd;
        distance=sqrtf(dx*dx+dy*dy);
        if(distance==0)
        {
            stepx=0;
            stepy=0;
        }
        else
        {
            stepx=trunc(((speed*dx))/distance);
            stepy=trunc(((speed*dy))/distance);
            //printf("%d, %d", stepx, stepy);
            im=setsteps(&stepx,&stepy, speed, dx, dy);
            if(im)
            {
                setsteps(&stepx,&stepy, speed, dx, dy);
                setsteps(&stepx,&stepy, speed, dx, dy);
                setsteps(&stepx,&stepy, speed, dx, dy);
            }
            //printf("      %d, %d\n", stepx, stepy);
        }
        if(c(stepx)>c(dx))
        {
            stepx=dx;
        }
        if(c(stepy)>c(dy))
        {
            stepy=dy;
        }
        i++;
    }
    stops_x[i]=xa;
    stops_y[i]=ya;
    //giveresults(stops_x,stops_y, nbstops);
    i=checkresults(stops_x,stops_y, nbstops, speed);
    /*if (!i)
    {
        printf("an error occured");
    }*/
    return (i);
}

char checkresults(int abs[], int ord[], int size,int speed)
{
    int i=1;
    while (i<size)
    {
        if(c(abs[i]-abs[i-1])+c(ord[i]-ord[i-1])>c(speed+0.5))
        {
            return(0);
        }
        i++;
    }
    return(1);
}

void giveresults(int abs[], int ord[],int size)
{
    int i=0;
    while(i<size)
    {
        printf("%d|", abs[i]);
        i++;
    }
    i=0;
    printf("\n");
    while(i<size)
    {
        printf("%d|", ord[i]);
        i++;
    }
}
int setsteps(int* stepx, int* stepy, int speed, int dx, int dy)
{
    if (dx>0)
    {
        if(dy>0)
        {
            if(dx>dy)
            {
                if(c((*stepx)+1)+c((*stepy))<c(speed+0.5))
                {
                    (*stepx)=(*stepx)+1;
                    return(1);
                }
                else if(c((*stepx))+c((*stepy)+1)<c(speed+0.5))
                {
                    (*stepy)=(*stepy)+1;
                    return(1);
                }
            }
            else
            {
                if(c((*stepy)+1)+c((*stepx))<c(speed+0.5))
                {
                    (*stepy)=(*stepy)+1;
                    return(1);
                }
                else if(c((*stepy))+c((*stepx)+1)<c(speed+0.5))
                {
                    (*stepx)=(*stepx)+1;
                    return(1);
                }

            }
        }
        else if (dy<0)
        {
            if((*stepx)>-(*stepy))
            {
                if(c((*stepx)+1)+c((*stepy))<c(speed+0.5))
                {
                    (*stepx)=(*stepx)+1;
                    return(1);
                }
                else if(c((*stepx))+c((*stepy)-1)<c(speed+0.5))
                {
                    (*stepy)=(*stepy)-1;
                    return(1);
                }
            }
            else
            {
                if(c((*stepy)-1)+c((*stepx))<c(speed+0.5))
                {
                    (*stepy)=(*stepy)-1;
                    return(1);
                }
                else if(c((*stepy))+c((*stepx)+1)<c(speed+0.5))
                {
                    (*stepx)=(*stepx)+1;
                    return(1);
                }

            }
        }
    }
    else if (dx<0)
    {
        if(dy>0)
        {
            if(-dx>dy)
            {
                if(c((*stepx)-1)+c((*stepy))<c(speed+0.5))
                {
                    (*stepx)=(*stepx)-1;
                    return(1);
                }
                else if(c((*stepx))+c((*stepy)+1)<c(speed+0.5))
                {
                    (*stepy)=(*stepy)+1;
                    return(1);
                }
            }
            else
            {
                if(c((*stepy)+1)+c((*stepx))<c(speed+0.5))
                {
                    (*stepy)=(*stepy)+1;
                    return(1);
                }
                else if(c((*stepy))+c((*stepx)-1)<c(speed+0.5))
                {
                    (*stepx)=(*stepx)-1;
                    return(1);
                }

            }
        }
        else if (dy<0)
        {
            if(dx<dy)
            {
                if(c((*stepx)-1)+c((*stepy))<c(speed+0.5))
                {
                    (*stepx)=(*stepx)-1;
                    return(1);
                }
                else if(c((*stepx))+c((*stepy)-1)<c(speed+0.5))
                {
                    (*stepy)=(*stepy)-1;
                    return(1);
                }
            }
            else
            {
                if(c((*stepy)-1)+c((*stepx))<c(speed+0.5))
                {
                    (*stepy)=(*stepy)-1;
                    return(1);
                }
                else if(c((*stepy))+c((*stepx)-1)<c(speed+0.5))
                {
                    (*stepx)=(*stepx)-1;
                    return(1);
                }

            }
        }
    }
    return(0);
}


je vais donc polluer un autre fofo pour avoir des détails sur les souhaits de max...
 
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Developpement Empirium Index du Forum -> Presque tout et n'importe quoi Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum