JeuWeb - Crée ton jeu par navigateur
[Math] Définition d'une fonction ayant un comportement spécifique - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Math] Définition d'une fonction ayant un comportement spécifique (/showthread.php?tid=7657)

Pages : 1 2 3


[Math] Définition d'une fonction ayant un comportement spécifique - niahoo - 25-05-2016

Yo !

Je cherche à définir une courbe qui aurait un comportement particulier entre 0 et 1. Je travaille sur des ratios, donc mes valeurs d'entrées seront toujours entre 0 et 1 (ou 0 et 100 si vous préférez les pourcentages).

Je voudrais écrire une fonction F qui, pour une valeur A comprise entre 0 et 1 soit croissante entre 0 et A, décroissante entre A et 1, et pour laquelle F(A) = 1.

Donc pour résumer un bon gros triangle inscrit dans 0:0, 1:1 et qui vaille 1 en A. Hum bon je vais faire un dessin.

[Image: curve.png]


Pour le moment je suis arrivé à quelque chose, mais ça utilise un if, ce qui est moche :

Code :
A = 0.6
f(x) when(x =< A) -> x / A
f(x) when(x > A) -> 1 - (x - A) / (1 - A)

Voilà mais c'est un peu bof, je crois qu'on peut avoir une simple fonction.

Et ensuite, mais là c'est plus dur, est-ce qu'on peut faire la même chose mais avec une courbe arrondie, et non pas un triangle bien pointu. En compressant un sin() par exemple ?

Merci


RE: [Math] - Xenos - 25-05-2016

f(x) = a*x²+b*x+c

f(0) = 0 = c
f(1) = 1 = a+b+c = a+b
f(A) = 1 = a*A²+b*A+c = A*(a*A+b)

=> { a = (1/A - 1)/(A-1), b = 1 - (1/A - 1)/(A-1), c=0 }

Code :
f(x) = ( (1/A - 1)/(A-1) * (1-x) + 1 )* x

A vérfier car je l'ai fait à la volée.
Pour la version "rectiligne", je pense que cela peut se gérer par un changement de "base" bien choisi (faire subir un pré-traitement p à x avant de calculer f(p(x)) )


Il me semblait bien que c'était trop vite fait ca fait plutôt une vague


RE: [Math] - niahoo - 25-05-2016

Hmmm sur un traceur si je rentre ((1/0.6-1)/(0.6-1)*(1-x)+1)*x ça me fait une exponentielle du style x².

Ce serait plutôt ça du coup : (1/.6-1)/(.6-1)*(x²)+1-(1/.6-1)/(.6-1)*x je pense que tu as oublié de remettre les x en copiant !

Mais ça ne marche pas, cette courbe passe par 1:1 et n'est pas inscrite dans le carré (0:0, 1:1)

Merci de ton aide, je commence à piger un peu la méthode en plus.


RE: [Math] - niahoo - 25-05-2016

On peut pas distordre un sinus ou un cosinus pour que les vagues soient de plus en plus longues en s'éloignant de 0, puis le décaler ?


RE: [Math] - niahoo - 25-05-2016

(25-05-2016, 05:18 PM)niahoo a écrit : On peut pas distordre un sinus ou un cosinus pour que les vagues soient de plus en plus longues en s'éloignant de 0, puis le décaler ?

edit: de toute façon avec le if ça marche et ça va vite Smile


RE: [Math] - Thêta Tau Tau - 25-05-2016

Il y a moyen de le faire en une seule ligne en utilisant par exemple des valeurs absolues ou des opérateurs logiques, mais je ne vois pas l'intérêt vu que ça sera dans tous les cas plus moche qu'un if. Au pire utilise une ternaire si tu veux rester sur une seule ligne.

Je vois pas bien pourquoi tu cherche à utiliser des sinus pour ce genre de problème, même si c'était possible ça serais juste perdre du temps pour rendre le code moins lisible et moins performant.


RE: [Math] - Xenos - 25-05-2016

T'as f(x) = 1 - |x^a - 0.5|/0.5 qui s'en rapproche, avec a un paramètre (je te laisse jouer un peu avec).
En place du |.|, tu dois pouvoir utiliser x^(2N) avec N un entier (genre 5). Nan je dis de la merde là


Sinon, tu tombes dans des composition de fonctions hyperboliques + logarithme (genre ln(cosh( (x-a)/b )) + x/c).


L'avantage d'avoir une vraie fonction mathématique peut se justifier si t'as besoin des dérivées ou de calculs assimilés (c'est le cas dans Eclerd, ça vaut ce que ça vaut comme exemple...). Traiter des dérivées avec des "if", c'est vite immonde (même si avec une abs, ce n'est pas tellement mieux...)



Edit:

et f(x) = max( x/A, 1-(x-A)/(1-A) ) ?

Et pour l'arrondi:

f(x) = (max( x/A, 1-(x-A)/(1-A) ))^q

(pour q réel non-pair !)


RE: [Math] - Thêta Tau Tau - 25-05-2016

En utilisant des opérateurs logiques au milieu de la formule (moche mais parfois pratique) :
(x < A) * x / A + ( x >= A ) * (1 - (x - A) / (1 - A))

Avec une ternaire (ce que j'utiliserais pour le cas présent) :
x < A ? x / A : (1 - (x - A) / (1 - A))


RE: [Math] - niahoo - 26-05-2016

Purée, titre de topic avec juste le tag et edit en citation de post, j'étais vraiment pas réveillé hier Smile

Citation :mais je ne vois pas l'intérêt vu que ça sera dans tous les cas plus moche qu'un if


L'intérêt dépendait justement de la simplicité de la formule. Je pensais qu'une équation beaucoup plus simple suffirait pour un problème de cet ordre.


RE: [Math] Définition d'une fonction ayant un comportement spécifique - Xenos - 26-05-2016

Citation :Je pensais qu'une équation beaucoup plus simple suffirait pour un problème de cet ordre.

Nope, car la fonction n'est ni paire (genre abs est paire car abs(x) = abs(-x), idem pour x²) ni monotone (croissante ou décroissante, mais pas "un peu des deux) ni même dérivable (disons que y'a un "angle"). Si t'avais les 3 critères, cela aurait été plus simple. Ou si tu en avais au moins 1, cela aurait pu se faire... Une fonction avec aucun des trois, c'est souvent hard à trouver mathématiquement, mais généralement très simple à faire à coup de "if", car on "génère" 2 fonctions (avant et après le if), chacune respectant les 3 critères.

PS: ah, je vais éditer mon post précédent: j'ai encore inversé la courbe... Note que c'est souvent plus facile d'avoir des équations avec le 0 au point qui t'intéresse plutôt qu'ailleurs (ie, je trouve plus simple de chercher f(0)=f(1)=1 & f(A)=0 que f(0)=f(1)=0 & f(A)=1 car f(A)=1 est souvent délicate à traiter)

PSS: Et un p'tit graphe en PJ avec de la pub pour GraphCalc en cadeau