subotai -
posté le 20/05/2021 à 05:53:38 (567 messages postés)
❤ 0
Il est Conan, un Cimmérien. Il ne pleurera pas, alors je pleure pour lui.
Je voulais te répondre, mais a la place j'ai pris la tangente
Ton point te donne un rectangle de 4 sur 7, déjà coupé en deux, donc en réalité tu cherches un angle complémentaire dans un triangle rectangle, qui fait visiblement moins que 45°; Après ça je suis obligé d'aller sur youtube.
Le son n'est pas excellent, mais ça date de 2014, saluons plutôt l'effort fait d'intéresser des élèves de 14 ans à travers l'utilisation de youtube
La madame me dit que tu dois faire Arctan (4/7) sur ta calculette, ou tan^-1(4/7); j'ai essayé de mon coté, mais je suis tellement mauvais avec une texas que je suis sur de m'être trompé avec cette histoire de Rad/Deg sur la calculatrice.
Fflo -
posté le 20/05/2021 à 07:47:14 (330 messages postés)
❤ 0
Pour 2024, je reste sur mes acquis mais ça me va.
Tout à fait.
Je suis bel et bien dans une configuration de triangle rectangle, condition sine qua non pour y appliquer les formules scolaires de trigonométrie.
Je désire connaître la valeur de l'angle bleu alors que je connais son côté adjacent (7) et son côté opposé (4).
J'ai toujours en tête le moyen mnémotechnique SOHCAHTOA pour déterminer quelle opération faire. (Sinus = Opposé / Hypoténuse ; Cosinus = Adjacent / Hypoténuse ; Tangente = Opposé / Adjacent)
Comme je connais le côté adjacent ainsi que le côté opposé, j'aurai recours à la tangente.
Plus précisément, j'utiliserai tan^-1 car je recherche un angle et pas une longueur.
Donc:
x = tan^-1 de 4/7 = 29.74 degrés environ
Petit scripteur amateur. J'ai un pack de scripts VX Ace qui ne vous permettra pas de faire le jeu du siècle, mais les petites fonctionnalités en plus à droite à gauche pourraient quand même vous démarquer.
Nemau -
posté le 20/05/2021 à 12:46:53 (53878 messages postés)
- -
❤ 0
@_@
Heu... Merci pour vos réponses mais elles ne sont pas assez vulagrisées. ^^'
Je n'ai aucune idée de ce que représente le "^" dans "tan^-1".
- Autre question : est-il possible de calculer cet angle avec RM 2003 Steam ?
- Autre question : est-il possible de calculer la longueur de l'hypoténuse avec RM 2003 Steam ? L'utilisation théorème de Pythagore impliquant l'emploi de la racine carrée...
Je t'épargne le tuto de Tassle qui ne touche de toute manière pas RM2003, contrairement aux deux tutos précédents.
Mack -
posté le 20/05/2021 à 12:58:47 (2325 messages postés)
- -
❤ 0
Si tu utilises pas de patch particulier tu peux passer par Maniacs, qui permet de faire des trucs mathématiques plus poussé ( cos/sin/pow/sqrt).
( Je prend note de tout les commentaires, même si je n'y répond pas )
Anton_ -
posté le 20/05/2021 à 13:08:42 (1539 messages postés)
❤ 0
En plus ce tuto a pour entrée l'angle et pour sortie un XY, pas l'inverse comme demandé.
J'ai fait un bout de code absolument immonde pour approximer un angle à partir d'un vecteur XY, j'ai complètement oublié quelle démarche j'ai utilisé mais j'y vois une fonction de racine carrée et une approximation sinx = x ... et l'angle en sortie n'est pas en degrés mais en crans de rotation de picture (RM2003 a 256 crans différnets par tour complet)
Qu'est ce que tu comptes faire avec l'angle en question ?
Nemau -
posté le 20/05/2021 à 16:24:47 (53878 messages postés)
- -
❤ 0
@_@
Merki.
Citation:
Après si tu présentes ton problème entièrement, il y a peut-être moyen qu'on trouve un raccourci qui t'évite de passer par les fonctions trigonométriques.
Je veux faire un simili Mode 7. J'ai programmé sans souci un système pour définir l'orientation du joueur : quand j'appuie sur droite ou gauche ça modifie une variable, entre 0 et 359 (si -1 ça devient 359 et si 360 ça devient 0). Le joueur met un peu moins de 4 secondes pour faire un tour complet (tour pour l'instant virtuel), donc niveau vitesse ça me semble bien (je pourrai toujours modifier ça plus tard si jamais c'est trop rapide ou trop lent).
Les éléments, des îles en pictures, sont affichées centrées verticalement (ligne d'horizon). Pour chaque île, les deux paramètres qui varient en temps réel sont :
- la position en x de l'île, à déterminer en comparant l'angle indiquant l'orientation du joueur (nord = 0°) et l'angle x du schéma de mon premier post (le point de coordonnées 0;0 correspond à la position du joueur, l'autre point correspond à la position de l'île)
- la taille de l'île (zoom/dézoom de la picture), à déterminer en fonction de la distance entre le joueur et l'élément
Roi of the Suisse -
posté le 20/05/2021 à 17:09:30 (30597 messages postés)
- -
❤ 0
Chanter l'hyperchleuasme
subotai a dit:
Citation:
Je n'ai aucune idée de ce que représente le "^" dans "tan^-1".
C'est pour écrire "Puissance", genre 2^2 c'est 2²
Bon courage, sinon
Attention tout de même, cette notation peut induire en erreur, même si elle est courante sur les calculatrices : il ne s'agit pas ici d'une véritable puissance -1 de la tangente, mais de la fonction réciproque de la tangente, c'est-à-dire l'arctangente.
Tassle -
posté le 20/05/2021 à 19:43:10 (5275 messages postés)
❤ 4trotter Nemau Roi of the Suisse Anton_
Disciple de Pythagolf
Pour un point de coordonnées (x,y) où y > x > 0 (comme illustré sur ton schéma), tu peux utiliser l'approximation :
angle =~ ((56*y² - 11*x²) / y²)*x / y
Après si x > y > 0 tu peux utiliser :
angle =~ 90 - ((56*x² - 11*y²) / x²)*y / x
Dans le cas où x < 0 ou y < 0 (ou les deux) ça va un peu dépendre de quel angle tu veux prendre, est-ce que tu veux que l'angle ait un signe etc. Mais en gros ça va rester des variations de ça.
Note que si x ou y est très grand ça peut overflow, et la faut ptet faire des trucs comme diviser x et y par 2 au préalable (ce qui n'affecte pas l'angle, à erreurs d'arrondis près).
Pour (x,y) = (4,7) par exemple, et en utilisant que des divisions entières, l'approximation donne 29 degrés.
~~
Nemau -
posté le 20/05/2021 à 22:23:31 (53878 messages postés)
- -
❤ 0
@_@
, je crois que tu me sauves là. <3
Citation:
Dans le cas où x < 0 ou y < 0 (ou les deux)
Le plus simple c'est que je fasse mes calculs avec x et y toujours positifs et qu'à la fin je rajoute 90, 180 ou 270 au besoin.
Citation:
Note que si x ou y est très grand ça peut overflow
Que signifie, ici, "overflow" ? A priori les coordonnées iront jusqu'à 239 maximum (en x comme en y), est-ce que tu penses qu'avec de telles coordonnées ça peut "overflow" ?
Là où je sens que je vais m'amuser c'est vis-à-vis du fait que mon monde est censé boucler. :') Peut-être en ne mettant aucune île trop près du bord... Je vais voir.
Tassle -
posté le 21/05/2021 à 14:25:12 (5275 messages postés)
❤ 0
Disciple de Pythagolf
Citation:
Le plus simple c'est que je fasse mes calculs avec x et y toujours positifs et qu'à la fin je rajoute 90, 180 ou 270 au besoin.
Yep !
Par overflow je voulais dire dépasser la valeur maximale possible dans une variable (je sais pas comment RM gère ça après, si ça retourne dans les négatifs, si ça mets la valeur max, si ça plante...).
Mais pour des coordonnées allant de 1 jusqu'à 239 normalement t'es safe (la valeur max de variable dont t'auras besoin c'est 56*239*239 = 3198776).
De plus, pour ces coordonnées l'erreur maximale sur l'angle est de 1.7 degrés (en utilisant des divisions entières, sinon avec des valeurs flottantes ça serait 0.5). À toi de voir si c'est raisonnable
Edit :
Je viens de faire quelques tests et tu peux diminuer l'erreur max à 1.08 degrés en utilisant plutôt l'approximation
angle =~ ((115*y² - 24*x²) / (2*y²))*x / y
La valeur max de variable dont t'auras besoin c'est 115*239*239 = 6 568 915. Si j'en crois le tuto d'Anton la valeur max gérée par RM2k3 est 9 999 999 donc c'est bon.
~~
Anton_ -
posté le 21/05/2021 à 17:33:48 (1539 messages postés)
❤ 0
RM2003 gère une valeur qui dépasse le max (qui est bien 9 999 999) en la mettant à la valeur max.
Pour la valeur min (-9 999 999) j'ai pas essayé mais je pense que ça le met à la valeur min aussi
Au passage, faire une division par zéro ne fait rien sur la variable, attention quand même ce serait pas simple à retrouver en débogage.
Tassle -
posté le 21/05/2021 à 17:46:44 (5275 messages postés)
❤ 0
Disciple de Pythagolf
D'acc merci pour la précision
Oui faut faire gaffe à la division par 0, mais si x=0 ou y=0 l'angle est de 0 ou 90 degrés respectivement, donc c'est facile à gérer (et si les deux sont 0 il n'y a pas d'angle à mesurer, c'est pas défini).
~~
Nemau -
posté le 21/05/2021 à 19:58:10 (53878 messages postés)
- -
❤ 0
@_@
Super, merci beaucoup tous les deux.
Les cas ou x et/ou y valent 0 je gère le truc différemment (vu qu'il est facile d'en déduire l'angle que ça forme : 0, 45, 90, 135 etc), donc pas de souci.
Citation:
Je viens de faire quelques tests et tu peux diminuer l'erreur max à 1.08 degrés en utilisant plutôt l'approximation
angle =~ ((115*y² - 24*x²) / (2*y²))*x / y
Oki. 1.7 d'erreur max aurait fait l'affaire (c'est pas le prochain FPS à la mode que je programme ) mais si je peux réduire encore un peu plus l'erreur max c'est cool. ^^ (bon par contre j'avais commencé à programmer avec ta formule précédente, gnnnn xD)
À un moment j'avais pensé à réduire l'erreur en rajoutant 0 ou 1 au résultat de telle ou telle division, en fonction du premier chiffre du "modulo" (4 ou moins = pas d'ajout, 5 ou plus = ajout de +1), mais je ne sais pas comment faire pour récupérer le premier chiffre du modulo, sachant que la longueur de ce dernier est variable.
Edit : Tassle, pour ta nouvelle formule, les conditions sont les mêmes que la précédente ? : y>x>0, et "90 - formule" si x>y>0
Tassle -
posté le 21/05/2021 à 20:17:22 (5275 messages postés)
❤ 1Nemau
Disciple de Pythagolf
Yes, mêmes conditions (je précis que dans le cas "90-formule" les variables x et y sont interverties)
C'est une bonne idée de faire des divisions au plus proche et c'est pas trop dur à faire*, mais en utilisant ça j'ai réussi à diminuer l'erreur max qu'a 1.025 (en utilisant 111 et 22 à la place de 115 et 24) donc je sais pas si ça vaut le coup.
Citation:
(bon par contre j'avais commencé à programmer avec ta formule précédente, gnnnn xD)
Si je veux calculer a/b à l'entier le plus proche:
- soit d le résultat de la division entière a//b,
- je calcule u = d*b et v = (d+1)*b,
- si u est plus proche de a je garde d, si v est plus proche de a je garde d+1.
~~
Nemau -
posté le 21/05/2021 à 20:26:47 (53878 messages postés)
- -
❤ 0
@_@
Citation:
C'est une bonne idée de faire des divisions au plus proche et c'est pas trop dur à faire*, mais en utilisant ça j'ai réussi à diminuer l'erreur max qu'a 1.025 (en utilisant 111 et 22 à la place de 115 et 24) donc je sais pas si ça vaut le coup.
Du coup, tu me recommandes quand même d'utiliser 111 et 22 à la place de 115 et 24 ? (si ça me permet d'être un peu plus précis, même d'un chouia, et que ce n'est pas plus compliqué...)
Citation:
Bah t'as pas grand chose à changer
Je disais ça parce que ta seconde formule (celle de ton post de 14h25) est, sur la forme, un peu différente de celle de hier, or dans RM on ne peut pas directement taper la formule, donc j'aurais peut-être des variables à créer ou à l'inverse des variables inutiles. Mais ça sera vite modifié, je dis pas. ^^
Tassle -
posté le 21/05/2021 à 20:33:05 (5275 messages postés)
❤ 0
Disciple de Pythagolf
Normalement si je me suis pas gouré la formule a la même forme, sauf qu'il y a un "2" devant y² ^^
Citation:
Du coup, tu me recommandes quand même d'utiliser 111 et 22 à la place de 115 et 24 ?
Nope, pour des divisions entières arrondi en deça (ce que fait RM j'imagine) plutôt qu'au plus proche 115 et 24 c'est mieux ^^
Par contre j'ai trouvé encore mieux (sans devoir modifier les divisions):
angle =~ ((165*y² - 31*x²) / (3*y²))*x / y + 1
Avec une erreur max de 0.94. Pour cette formule il faut des coordonnés de maximum 246 (donc c'est bon pour toi).
Fait bien gaffe à faire les opérations dans l'ordre donné aussi (par exemple pour le machin*x / y à la fin, même si mathématiquement c'est équivalent, les arrondis font qu'il faut d'abord multiplier par x puis diviser par y).
~~
Nemau -
posté le 21/05/2021 à 20:37:33 (53878 messages postés)
- -
❤ 0
@_@
Citation:
Normalement si je me suis pas gouré la formule a la même forme, sauf qu'il y a un "2" devant y² ^^
Il en faut pas plus pour me perturber, niveau maths j'ai décroché en quatrième. xD
Mais je pense avoir un esprit suffisamment logique pour faire des trucs plus ou moins complexes sur RM (même si je n'aurais jamais le niveau de Joke ou d'Anton, cela va sans dire).
Citation:
Par contre j'ai trouvé encore mieux (sans devoir modifier les division):
angle =~ ((165*y² - 31*x²) / (3*y²))*x / y + 1
Avec une erreur max de 0.94. Pour cette formule il faut des coordonnés de maximum 246 (donc c'est bon pour toi).
Tassle -
posté le 21/05/2021 à 20:50:58 (5275 messages postés)
❤ 0
Disciple de Pythagolf
Yep justement pour trouver ces valeurs j'ai juste fait un petit script* qui teste ((a*y² - b*x²) / (c*y²))*x / y + d pour toute valeur de a entre 1 et 175, b entre 1 et a, c entre 1 et 10, d entre -5 et 5 (au début j'avais pas le paramètre d, ce qui m'a fait passer à coté de la solution a,b,c,d = 165,31,3,1)
Citation:
Mais je pense avoir un esprit suffisamment logique pour faire des trucs plus ou moins complexes sur RM (même si je n'aurais jamais le niveau de Joke ou d'Anton, cela va sans dire).
Oui c'est pas très handicapant, les "maths" (mathouilles) c'est souvent utile qu'à la marge, je connais des développeurs qui sont des billes en maths ^^
*Pour ceux que ça intéresse, c'est du Python vite-fait (pas propre):
from math import atan2, pi
def error(a,b,c,d, max_err):
err =0for y in range(1,240):
for x in range(1,y+1):
approx =(a*y*y - b*x*x)//(c*(y*y))*x // y + d
angle =180*atan2(x,y)/pi
err = max(err,abs(approx-angle))if err > max_err:
return err
return err
min_err =1000
ma, mb, mc, md =0,0,0,0for a in range(1,176):
for b in range(a+1):
for c in range(1,11):
for d in range(-5,6):
err = error(a,b,c,d,min_err)if err < min_err:
min_err = err
ma,mb,mc,md = a,b,c,d
print(min_err, ma, mb, mc, md)
~~
Nemau -
posté le 21/05/2021 à 21:16:45 (53878 messages postés)
- -
❤ 0
@_@
Citation:
Yep justement pour trouver ces valeurs j'ai juste fait un petit script* qui teste ((a*y² - b*x²) / (c*y²))*x / y + d
Tout ça pour un énième projet que je vais abandonner à tous les coups : tu es bien vertueux. =>[]
Citation:
Oui c'est pas très handicapant, les "maths" (mathouilles) c'est souvent utile qu'à la marge, je connais des développeurs qui sont des billes en maths ^^
Ouais. En fait je pense avoir un esprit suffisamment rigoureux pour la prog un peu complexe sur RM. Par contre je suis très lent, mais bon, ça tombe bien j'ai pas de deadline ^^ (sortir un jeu RM avant la maison de retraite serait bien, cela dit ).
Encore merci Tassle et les autres. Je préfère laisser ce topic ouvert (non résolu) pour les probables éventuels futurs problèmes. Surtout qu'une fois que j'aurais créé ce système affichant les îles au bon endroit sur la ligne d'horizon, il me restera :
- créer le système pour qu'elles s'affichent plus ou moins grandes en fonction de leur distance au bateau.
- créer le système de déplacement (s'il le faut je me limiterai à 8 directions seulement).
Tassle -
posté le 21/05/2021 à 21:38:47 (5275 messages postés)
❤ 1Nemau
Disciple de Pythagolf
Citation:
Tout ça pour un énième projet que je vais abandonner à tous les coups : tu es bien vertueux. =>[]
Ça peut servir à d'autres gens ^^ Et puis j'ai une tendance un peu obsessive à ne pas m'arrêter de chercher avant d'avoir trouvé la meilleure solution à un problème (surtout quand ça touche aux maths).
En parlant de ce côté obsessif, j'ai trouvé mieux (en fait j'avais pas bien réfléchi au meilleur ordre dans lequel faire les opérations.
Sans modifier les divisions :
(161*y*y - 27*x*x) / (3*y) * x / (y*y) + 1
(erreur max 0.93)
Avec les divisions arrondies au plus proche :
(167*y*y - 33*x*x) / (3*y) * x / (y*y)
(erreur max 0.8)
Je m'arrête de chercher là sinon ça va mal tourner