Le besoin pressant d'un univers logique et cohérent est profondément ancré dans l'inconscient humain. Mais l'univers réel est toujours à un pas au-delà de la logique.
Je me suis pris la tête aujourd'hui avec un collègue sur un calcul tout simple ; Imaginons que nous ayons une feuille, avec 4 bord :
#define HAUT = 0;
#define DROITE = 1;
#define BAS = 2;
#define GAUCHE = 3;
et un tableau avec des valeurs pour chaque bord :
int marges[4];
il est facile de déterminer la marge à charger si la page a été tournée :
int getNewIndice(int angle, int indice) { // renommé en getNewIndice suite à remarque en commentaire
switch (angle) {
case 90: return (indice + 1) % 4;
case 180: return (indice + 2) % 4;
case 270: return (indice + 3) % 4;
default: return indice;
}
}
Ça marche parce que les données sont ordonnée dans l'ordre de rotation. Sauf que dans notre cas, le tableau était construit avec les indices suivants :
#define HAUT = 0;
#define BAS = 1;
#define GAUCHE = 2;
#define DROITE = 3;
il va de soit que ces valeurs sont définies et ne peuvent pas être changées. On a fini en énumérant les 3 cas possibles de rotation, et mettant dans le code les 3 combinaisons possibles, ce qui marche dans ce cas assez simple. Pourtant, je me demande s'il y a une manière simple de calculer l'indice à charger. Je pense qu'il doit s'agit d'une histoire de permutation, mais je ne vois pas trop l'algorithme qui pourrait faire ça.
Je viens donc solliciter vos avis, si quelqu'un a une idée là dessus. (J'ai donné l'exemple en C, mais n'importe quel langage fera l'affaire)
# ca marche ton truc ?
Posté par NeoX . Évalué à 2.
une fonction indice qui s'appelle elle meme en parametre indice ???
bon sinon, je ne sais pas à quoi fait reference ton indice, mais tu peux utiliser un tableau nommé
tu as des valeurs definies plus haut
indice[HAUT] c'est la meme chose que indice[0]
[^] # Re: ca marche ton truc ?
Posté par chimrod (site web personnel) . Évalué à 2.
J'ai écrit le code pour le forum, il s'agit (plus ou moins) du cas réel (ça n'est pas du C à la base), mais je n'ai pas cherché à le compiler avant de poster. Je me permet de d'appeler la fonction fautive ici sous le nom
getNewIndice
pour être plus clair…Je suis d'accord. La question qui se pose est après la rotation de la page.
après rotation de 90° (si le tableau est ordonné dans l'ordre
HAUT
,DROIT
,BAS
,GAUCHE
) :(avec la méthode
getNewIndice
correspondant à la fonction donnée dans le post d'origine).par contre, si le tableau est ordonné dans l'ordre
HAUT
,BAS
,GAUCHE
,DROIT
, je ne vois pas comment construire la fonctiongetNewIndice
pour avoir le même résultat. Je pense qu'il s'agit plus d'une question de math (d'où mon titre sur les permutations), et je ne sais pas trop comment appréhender la chose simplement.[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 5.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: ca marche ton truc ?
Posté par chimrod (site web personnel) . Évalué à 2.
Effectivement, je pense que l'idée de convertir dans l'ordre dans un repère, puis appliquer l'opération inverse est une bonne piste.
J'étais parti dans quelque chose de beaucoup plus compliqué (arrangements etc), qui au final n'avait débouché sur rien.
Merci !
[^] # Re: ca marche ton truc ?
Posté par Sébastien Burton . Évalué à 5.
Il me semble qu'une solution plus robuste (du point de vue humain) serait d'écrire:
Et de se rendre compte que
perm[i]
c'est équivalent àperminv[perminv[i]]
. Ça limite les erreurs évoquées plus loin vu qu'on entre un seul tableau de conversion et ce de manière compréhensible.[^] # Re: ca marche ton truc ?
Posté par Anthony Jaguenaud . Évalué à 2. Dernière modification le 26 juin 2014 à 14:12.
Non, car tu ne limites pas les valeurs au 3 angles requis (90, 180, 270). Si tu mets 360 + 180 = 540 tu vas renvoyer une rotation, alors qu'on doit renvoyer
indice
d'après le code d'exemple.il faudrait ajouter un test du genre :
# Utilise un tableau de conversion d'indice ?
Posté par Maxime (site web personnel) . Évalué à 4. Dernière modification le 26 juin 2014 à 00:05.
Ton code marche pour :
Sauf que pas de bol, les valeurs sont :
Bon ben suffit de convertir en utilisant des tableaux :
Puis :
Je n'ai pas testé, il est tard, mais tu vois l'idée…
# Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par Benoît Sibaud (site web personnel) . Évalué à 4.
P(0)=0
P(1)=2
P(2)=3
P(3)=1
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par chimrod (site web personnel) . Évalué à 2.
Voilà ce que je cherchais !
Tu peux me dire (vite fait) comment tu obtiens ces valeurs (ou me dire vers quelle piste il me faut chercher) ?
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par barmic . Évalué à 3. Dernière modification le 26 juin 2014 à 11:01.
Tu as un système de 4 équations avec 4 inconnues. Ça se résous facilement, non ?
d=0
a+b+c=2
4a+4b+2c=3
27a+9b+3c=1
Si je ne me trompe pas.
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par Benoît Sibaud (site web personnel) . Évalué à 3.
P=ax³+bx²+cx+d, et on a les valeurs de P(0), P(1), P(2), P(3) ce qui donne :
d=0
a+b+c=2
8a+4b+2c=3
27a+9b+3c=1
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par barmic . Évalué à 3.
Faute de frappe :)
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par Michaël (site web personnel) . Évalué à 3.
Soit par interpolation de Lagrange, soit dans ce cas particulier en remarquant que:
vaut 0 en x = 0, 1, 2 et 1 en x = 3, en considérant aussi les polynômes
Tu n'a plus qu'à chercher des nombres
tels que
En rapprochant des valeurs de P que tu connais, tu trouves un système linéaire facile à résoudre à cause du choix de f₃, f₂ et f₁.
Ceci-dit, cette méthode est un peu une blague, pour ton problème il vaut mieux utiliser la version “tableau”.
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par chimrod (site web personnel) . Évalué à 0.
Bien sûr (et c'est ce qu'on a retenu), mais le jour ou j'aurais à évaluer la même chose avec un polygone à 100 côtés (exemple), la solution du tableau montrera ses limites…
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par Michaël (site web personnel) . Évalué à 4.
Je n'ai pas trop compris ton histoire de marges, mais ceci mis à part, tu présentes ton problème comme un problème de permutations et pour représenter une permutation, rien ne vaut un bon vieux tableau.
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par Maxime (site web personnel) . Évalué à 4. Dernière modification le 26 juin 2014 à 13:31.
Ici, on parle de faire 2 accès à un tableau. C'est simple, compréhensible et rapide.
La solution d'utiliser un polynôme est mathématiquement intéressante mais :
- Elle est complexe à comprendre et donc il faut tester tous les cas pour être sûr de son bon fonctionnement
- Elle est plus lente (pleins de multiplications, sommes et divisions)
Donc à moins de vouloir offusquer son code, ça ne me paraît pas être une bonne idée. Il ne faut pas oublier qu'un bon code doit être facile à comprendre et à maintenir. Là tu vois le polynôme et tu te dis : bon ben j'espère que le gars a bien testé parce que j'ai aucune idée de si ça marche.
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par chimrod (site web personnel) . Évalué à 1.
Je suis parfaitement d'accord avec toi.
Mais entre écrire la tableau à la main (avec le risque de se tromper qui va avec), et une fonction qui permet (ou exclusif) :
Mon choix est vite fait.
Il est évident que ce genre de fonction n'est pas à mettre dans l'application, mais ça n'en retire pas son utilité.
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par Michaël (site web personnel) . Évalué à 3.
Dans ce cas particulier, le tableau est nécessaire à la préparation de la fonction, donc le risque de se tromper est plutôt plus important avec la fonction qu'avec le tableau.
Ah oui? :)
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par Le Pnume . Évalué à 6.
Permettez moi de m'offusquer de cette faute d'orthographe qui de surcroît porte sur un anglicisme.
« Obscurcir » me semble de meilleur aloi.
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par fabien . Évalué à 2. Dernière modification le 26 juin 2014 à 10:49.
interessant…
du coups, je me demande comment tu a trouvé les coef du polynome ?
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par Michaël (site web personnel) . Évalué à 3.
Si on calcule en nombre entiers, il faut mettre le 1/6 en facteur:
Sinon, ouille, ouille à l'évaluation!
[^] # Re: Polynome de degré 3 ou la version enclume flottante pour entiers
Posté par Guy . Évalué à 2.
P = (-2x³ + 3x² + 11x) / 6
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.