Trigonométrie - Programmation

Réponses à toutes vos questions de la 2nde à la Terminale toutes séries
Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 04 Juin 2013, 14:02

Ah oui, j'ai corrigé trop vite... Attends, je recalcule et je reviens (comme quoi ce n'est pas si enfantin...) OK, j'ai vu le problème. Je vais recorriger plus haut, il y aura de nouvelles choses en rouge dans une ou deux minutes.

Si la rapidité des calculs est critique, pense à optimiser. Par exemple quelque chose comme :

void calculpoint( double xa, double ya, double xb, double yb, double bc, double angle, double *pxc, double *pyc)

/* Entrée :
- coords de A : xa, ya
- coords de B : xb, yb
- distance BC : bc
- angle (BA, BC) : angle
*/

/* Sortie :
- pxc, pyc : pointeurs sur les coordonnées de C
- utilise
*/

{
double ba ; /* distance BA */
double xab ; /* xa - xb */
double yab ; /* ya - yb */
double bcsurba ; /* bc / ba */
double xbc, ybc ; /* coordonnées du vecteur BC' */
double xc, yc ; /* coordonnées du point C */
double cosangle, sinangle ; /* cosinus et sinus de l'angle */

xab = xa - xb ;
yab = ya - yb ;
cosangle = cos(angle) ;
sinangle = sin( angle) ;
ba = sqrt( xab * xab + yab * yab ) ;
bcsurba = bc / ba ;
xbc = bcsurba * xab ;
ybc = bcsurba * yab ;
xc = xb + cosangle * xbc - sinangle * ybc ;
yc = yb + sinangle * xbc + cosangle * ybc ;

*pxc = xc ;
*pyc = yc ;
}



Neox76
Membre Naturel
Messages: 21
Enregistré le: 03 Juin 2013, 17:31

par Neox76 » 04 Juin 2013, 14:04

Robic a écrit:je considère que ceux qui ont compris la programmation objet sont des génies


Je pense pareil pour ceux qui comprennent bien la trigonométrie =) J'aimerais bien m'expérimenter là-dessus mais je n'y comprends jamais rien, ou alors je n'en vois pas beaucoup l'utilité :/ (En disant ça, je veux dire par exemple que jamais j'aurais pensé qu'un jour j'utiliserais de la trigonométrie, comme ici !)

Neox76
Membre Naturel
Messages: 21
Enregistré le: 03 Juin 2013, 17:31

par Neox76 » 04 Juin 2013, 14:12

J'ai recorrigé, ça fonctionne parfaitement maintenant ! Merci ! :we: (Comme ça j'aurais eu un cadeau d'anniversaire en avance de votre part :zen: 18 ans dans deux jours !)

Bonne journée à tous !

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 04 Juin 2013, 14:13

J'ai refait une dernière modification en ayant remarqué une petite simplification, que je rajoute en vert.

Neox76
Membre Naturel
Messages: 21
Enregistré le: 03 Juin 2013, 17:31

par Neox76 » 04 Juin 2013, 14:17

Robic a écrit:J'ai refait une dernière modification en ayant remarqué une petite simplification, que je rajoute en vert.


D'accord, je corrige ça dès que je vois le vert =)

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 04 Juin 2013, 14:20

J'espère que ça marche toujours...

Et bon anniversaire ! Dix-huit ans, c'est une date !

Neox76
Membre Naturel
Messages: 21
Enregistré le: 03 Juin 2013, 17:31

par Neox76 » 04 Juin 2013, 14:31

Robic a écrit:J'espère que ça marche toujours...

Et bon anniversaire ! Dix-huit ans, c'est une date !


Je viens de recorriger, ça fonctionne toujours ;)

Neox76
Membre Naturel
Messages: 21
Enregistré le: 03 Juin 2013, 17:31

par Neox76 » 04 Juin 2013, 16:11

J'ai peut-être parlé un peu trop vite...

Ce que je faisais n'était qu'un test, ce que j'ai besoin en réalité c'est de dessiner plusieurs lignes (que je peux faire en utilisant cette même fonction)

Le problème c'est que, toutes les distances doivent rester constantes, seuls les positions doivent changer. En mettant 0 en angle, le trait devient tout petit, en mettant 1 il change, devient plus grand et change beaucoup en position (pour ce premier trait, j'ai besoin qu'il apparaisse derrière le personnage, j'ai un peu essayé toutes les angles de 0 à 360, jamais il ne va derrière le personnage ! Tant que la souris reste devant...), normalement entre 1 et 2 (en angle) la position ne doit pas beaucoup changer, mais là ça change affreusement (alors que le personnage et la souris ne bougent pas !)

Cette fonction modifie la distance entre le point B et C (qui sont fixées avant l'entrée dans la fonction), alors qu'il ne faut pas... désolé si c'est moi qui me suis mal exprimé :(

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 04 Juin 2013, 18:30

re, la fonction proposée par Robic ne modifie pas la distance BC.

Code: Tout sélectionner




body{
   margin:0;
   padding:0;
}
#canvas{
  background-color:#eeeeee;
}


function plotPoint(P, ctx){
   ctx.beginPath();
  ctx.arc(P[0], P[1], 2, 0, 2 * Math.PI, false);
  ctx.lineWidth = 1;
  ctx.strokeStyle = '#003300';
  ctx.stroke();
   ctx.closePath();
}
function plotSeg(A,B,ctx){
  ctx.moveTo(A[0], A[1]);
  ctx.lineTo(B[0], B[1]);
  ctx.lineWidth = 1;
  ctx.strokeStyle = '#000000';
  ctx.stroke();
}
function getCoord(angle, param){
//COPIER COLLER BETE ET MECHANT =D
   var ba ; /* distance BA */
   var xbc, ybc ; /* coordonnées du vecteur BC' */
   var xc, yc ; /* coordonnées du point C */

   var xa = param.A[0];
   var xb = param.B[0];
   var ya = param.A[1];
   var yb = param.B[1];
   var bc = param.distanceBC;
   ba = Math.sqrt( (xa - xb) * (xa - xb) + (ya - yb) *(ya - yb) ) ;
   xbc = bc * (xa - xb) / ba ;
   ybc = bc * (ya - yb) / ba ;
   xc = xb + Math.cos( angle ) * xbc - Math.sin( angle ) * ybc ;
   yc = yb + Math.sin( angle ) * xbc + Math.cos( angle ) * ybc ;

   
   return [xc,yc];
}
window.onload=function(){
   var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  ctx.setTransform(1,0,0,-1,0,400);
  var param={A:[200,200], B:[300,300], distanceBC:50};
  plotPoint(param.A, ctx);
  plotPoint(param.B, ctx);
  plotSeg(param.A, param.B, ctx);
   document.getElementsByTagName('form')[0].onsubmit=function(e){
      try{
         var angle = parseInt(this.angle.value,10);
         var C = getCoord(angle, param);
         console.log(C)
         plotPoint(C, ctx);
        plotSeg(param.B, C, ctx);
      }catch(e){
         console.log(e);
      }
      e.preventDefault();
      return false;
   }
};



fezf



   angle:
   






le point au centre, c'est A.
le point en haut a droite, c'est B.
le point qui est ajouté lorsque tu cliques sur submit, c'est C.
Tu vois bien que qqsoit l'angle que tu mets, C décrit un cercle de centre B (idem la distance BC reste la même, C "tourne" autour de B)
la vie est une fête :)

Neox76
Membre Naturel
Messages: 21
Enregistré le: 03 Juin 2013, 17:31

par Neox76 » 04 Juin 2013, 19:14

D'accord, merci pour ta réponse ! Un ami assez fort en mathématiques a décidé de m'aider, passez une bonne soirée =)

Edit : as-tu essayé en modifiant l'angle de 1 à chaque fois ? ^^ Mon problème vient de là, c'est BEAUCOUP trop pour 1 degré ^^ et ça ce n'est pas normal (et pour ce qui est de l'équart à chaque fois qu'on ajoute 1 degré, elle n'est pas constante non plus)

Edit 2 : Si, elle est bel et bien constante, mais les degrés ne se suivent pas (ça fait un peu comme 31 dégré, 50 dégré, 71 degré, 32 degré, 51 degré (etc..)) si vous voyez ce que je veux dire =)

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 04 Juin 2013, 20:41

mais les degrés ne se suivent pas

je crois pas qu'il ait été fait mention de degré de la part de Robic et tu aurais du te pencher du côté des radians, la conversion étant assez facile ou trouvable sur le net

et le cas echeant si un degré est représenté par 31 par la fonction, ben t'as qu'à passer 1/31 degré à celle ci!
la vie est une fête :)

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 05 Juin 2013, 04:56

normalement entre 1 et 2 (en angle) la position ne doit pas beaucoup changer, mais là ça change affreusement
les degrés ne se suivent pas (ça fait un peu comme 31 dégré, 50 dégré, 71 degré, 32 degré, 51 degré (etc..))

Ah oui, si la fonction calcule en radians et que tu crois qu'elle calculait en degrés, ça pourrait faire ce genre d'effet, vu que 1 radian = 60 degrés et quelques.

Si le paramètre 'angle' est fourni à la fonction en degrés, il faut penser à définir quelque chose comme :
anglerad = angle * M_PI / 180.0 ; /* angle en radians */
où M_PI est la constante Pi de (il serait d'ailleurs peut-être judicieux de définir une constante pour ne pas tout le temps calculer M_PI / 180.0).

Et ensuite, les calculs de cosinus et sinus doivent utiliser 'anglerad' et non 'angle' (en tout cas avec les fonctions 'cos' et 'sin' de ).

 

Retourner vers ✎✎ Lycée

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 58 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite