Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Calculer la Normale d'un vecteur en C | |
| | Auteur | Message |
---|
Sefiria
Nombre de messages : 25 Age : 32 Localisation : Nîmes (30), France Date d'inscription : 05/03/2013
| Sujet: Calculer la Normale d'un vecteur en C Sam 9 Nov 2013 - 23:37 | |
| Hello tout le monde ! En fait je doit rendre un projet de prog en C pour Mardi, et je suis bloqué, depuis le début (il y a une semaine), sur un sujet : le rebond d'un tir de tank sur un mur, en 2 dimensions. Le tir doit rebondir une unique fois puis disparaître à la collision suivante à un mur ( ou tank ennemi ). Codes: Je vais vous épargner en vous crachant tout mon code en un instant, de ce fait, voici les parties les plus intéressantes de mon code : • Les déclarations : - Declaration des structs etc...:
- Code:
-
typedef struct typePOINT point_new; struct typePOINT//structure de création de points (coordonnées X et Y) { double x; double y; double centre_x; double centre_y; double relat_x; double relat_y; };
typedef struct typeVECTEUR vecteur_new; struct typeVECTEUR//structure de création de vecteurs (coordonnées X et Y) { double x; double y; };
typedef struct typeTIR tir_new; struct typeTIR//structure de création de tirs { int exists;//booléen renseignant l'existance du boulet (boulet-un?) double x;//coord x du tir double y;//coord y du tir vecteur_new look;//vecteur look du tir int nb_rebonds;//nombre de rebonds du tir creapVector2f vect2f_center;//coords du centre du tir, renseigné par coords x et y creamShapePtr shape_tir ;//shape du tir (cercle) };
- Autres déclarations:
- Code:
-
vecteur_new look_Joueur, look_Joueur_old;//vecteur look_Joueur : direction visée ; vecteur old_look_Joueur : ancienne direction (valeur intermédiaire anti_bug) point_new StartPt={iScreen_Width/4.0,iScreen_Height/4.0};
//NORMALES DES MURS vecteur_new Normale;//Normale à utiliser pour le rebond des tirs - vaudra un des quatre vecteurs suivants) vecteur_new Normale_haut; vecteur_new Normale_gauche; vecteur_new Normale_bas; vecteur_new Normale_droite;
point_new form_Joueur_init[9] = // ( coordonnées graphique) { {StartPt.x,StartPt.y},{StartPt.x+15,StartPt.y},{StartPt.x+15,StartPt.y-30},{StartPt.x+25,StartPt.y-30}, {StartPt.x+25,StartPt.y},{StartPt.x+40,StartPt.y},{StartPt.x+40,StartPt.y+40},{StartPt.x,StartPt.y+40},{StartPt.x,StartPt.y} }; point_new tabformTir[4] = //forme carrée du tir { {0,0},{5,0},{5,-5},{0,-5} }; point_new form_Joueur_image[9], form_Joueur_relat[9];
point_new ptsCentre_Joueur = {(form_Joueur_init[0].x + form_Joueur_init[5].x)/2 ,(form_Joueur_init[0].y + form_Joueur_init[7].y)/2}; point_new ptsCentre_Joueur_temp;
tir_new tableau_tirs[40]={0};//40 est le maximum de tirs à l'écran autorisé, les 10 premiers étant réservés au joueur point_new tableau_tirs_centre[40]={0};//centre des formes des tirs
creamColor white = creamColor_Create(255,255,255,255); //couleur tank : BLANC creamColor green = creamColor_Create(0,255,0,255); //couleur tank : VERT creamColor red = creamColor_Create(255,0,0,255); //couleur tank : ROUGE creamColor Coul_Tank;//variable contenant la couleur du tank courant
tir_new tab_Tirs_Joueur[20]={0};//max autorisé de tirs pour le joueur tir_new tab_Tirs_Ennemis[20]={0};//max autorisé de tirs pour les ennemis
En précisant que je code en C sous CREAM, le moteur de mon école : - creamShapePtr pour les variable servant de shapes pour relier des points et ainsi créer des formes. - creapVector2f pour les variables servant de vecteurs (2f pour 2D) • Puis l'initialisation : - Initialisation:
- Code:
-
creamWindow_SetWindowResolution(50,100,8);//ne fonctionne pas ?? Coul_Tank = red; y_max = creamWindow_GetNativResolution().getY(); look_Joueur.x = look_Joueur.y = 0; for (i=0; i<9; i++) { form_Joueur_image[i] = form_Joueur_init[i]; // affectation : coord courantes = coord initiales (initialisation) } for(i=0;i<20;i++) { tab_Tirs_Joueur[i].exists=FALSE; }
iVitesse_Tir=4;
• Enfin le code-cible (où je calcule les rebonds) - Code (rebonds):
- Code:
-
//TRANSLATION DES TIRS JOUEUR (avec COLLISIONS, REBONDS) for(i=0;i<20;i++) { if(tab_Tirs_Joueur[i].exists==TRUE)//uniquement pour les boulets existants { if (!((tab_Tirs_Joueur[i].x + iVitesse_Tir*tab_Tirs_Joueur[i].look.x < iScreen_Width) && (tab_Tirs_Joueur[i].x + iVitesse_Tir*tab_Tirs_Joueur[i].look.x > 0) && (tab_Tirs_Joueur[i].y + iVitesse_Tir*tab_Tirs_Joueur[i].look.y < iScreen_Height) && (tab_Tirs_Joueur[i].y + iVitesse_Tir*tab_Tirs_Joueur[i].look.y > 0))) {//si tir sort de la map if(tab_Tirs_Joueur[i].nb_rebonds==0)//si pas encore de rebond {
//CALCUL DES NORMALES Normale_haut.x=tab_Tirs_Joueur[i].x; Normale_haut.y=tab_Tirs_Joueur[i].y-iVitesse_Tir; Normale_bas.x=tab_Tirs_Joueur[i].x; Normale_bas.y=tab_Tirs_Joueur[i].y-iVitesse_Tir; Normale_gauche.x=tab_Tirs_Joueur[i].x+iVitesse_Tir; Normale_gauche.y=tab_Tirs_Joueur[i].y; Normale_droite.x=tab_Tirs_Joueur[i].x-iVitesse_Tir; Normale_droite.y=tab_Tirs_Joueur[i].y;
//CALCUL DU MUR TOUCHE PAR LE TIR if(tab_Tirs_Joueur[i].y<0)//mur haut dépassé { Normale=Normale_haut; } else if(tab_Tirs_Joueur[i].y>iScreen_Height)//mur bas dépassé { Normale=Normale_bas; } else if(tab_Tirs_Joueur[i].x<0)//mur gauche dépassé { Normale=Normale_gauche; } else if(tab_Tirs_Joueur[i].x<iScreen_Width)//mur droite dépassé { Normale=Normale_droite; } //-------------------------------
tab_Tirs_Joueur[i].nb_rebonds++; tab_Tirs_Joueur[i].look.x=Normale.x+tab_Tirs_Joueur[i].look.x;//la normale est la perpendiculaire au mur touché tab_Tirs_Joueur[i].look.y=Normale.y+tab_Tirs_Joueur[i].look.y;//la normale est la perpendiculaire au mur touché
} else//sinon si déjà eu rebond, destruction du tir { tab_Tirs_Joueur[i].nb_rebonds=0; tab_Tirs_Joueur[i].exists=FALSE;//le tir n'existe plus } } tab_Tirs_Joueur[i].x = tab_Tirs_Joueur[i].x + iVitesse_Tir * tab_Tirs_Joueur[i].look.x;//translation en x tab_Tirs_Joueur[i].y = tab_Tirs_Joueur[i].y + iVitesse_Tir * tab_Tirs_Joueur[i].look.y;//translation en y tab_Tirs_Joueur[i].vect2f_center = creapVector2f_Create(tab_Tirs_Joueur[i].x,tab_Tirs_Joueur[i].y);//vecteur centre du tir } }
Normalement, je dois utiliser une formule se trouvant dans l'énoncé, en voici l'extrait : Enoncé: - Enoncé:
On pourra réaliser le rebond à l'aide de la méthode suivante : – n est le vecteur perpendiculaire (normal) au mur, orienté vers l'extérieur du mur ; – look est le vecteur indiquant le sens d'avancement du tank, – dans ce cas, le nouveau vecteur look après rebond est donné par : look = 2n + look Pour les boulets, il faudra utiliser une struct comportant les données suivantes : position x, position y, vecteur look, le nombre de rebonds effectués. Tous les boulets avancent à la même vitesse.On pourra stocker les boulets dans deux tableau de 20 cases (ce qui limite à 40 le nombre de boulets simultanément en jeu). Un tableau pour enregistrer les boulets ennemis et un tableau distinct pour les boulets du joueur.
En bref, ma demande : Appliquer un rebond à un tir en utilisant la Normale du mur en collision avec le tir.L'utilisation de CREAM n'est pas obligatoire pour résoudre ce problème. Toutes les pistes sont les bienvenues, en vous remerciant par avance d'avoir répondu, ou même simplement lu. Sefiria30 | |
| | | Sefiria
Nombre de messages : 25 Age : 32 Localisation : Nîmes (30), France Date d'inscription : 05/03/2013
| Sujet: Re: Calculer la Normale d'un vecteur en C Sam 9 Nov 2013 - 23:56 | |
| Le message étant trop long, je ne peux l'éditer sans en effacer un tiers. Donc, dans "Autres déclarations", ne pas tenir compte de : - Code:
-
point_new tabformTir[4] = //forme carrée du tir { {0,0},{5,0},{5,-5},{0,-5} }; Ainsi que : - Code:
-
tir_new tableau_tirs[40]={0};//40 est le maximum de tirs à l'écran autorisé, les 10 premiers étant réservés au joueur point_new tableau_tirs_centre[40]={0};//centre des formes des tirs Mes tirs sont sphériques, crée par une fonction de CREAM tout simplement. Important :Je n'ai pas l'autorisation d'utiliser ni pointeurs, ni autres fonctions du moteur, ni le multifichiers. Manquait plus que l'interdiction d'utiliser les variables et c'était bon ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Calculer la Normale d'un vecteur en C Dim 10 Nov 2013 - 2:42 | |
| Tu es sûr que tu es dans le bon Forum ? Sans avoir la moindre intention de te vexer, ce Forum est dédié au langage PANORAMIC et non au C ! Sur ce, je suis désolé : je ne peux te venir en aide ! | |
| | | Sefiria
Nombre de messages : 25 Age : 32 Localisation : Nîmes (30), France Date d'inscription : 05/03/2013
| Sujet: Re: Calculer la Normale d'un vecteur en C Dim 10 Nov 2013 - 11:30 | |
| Et bien, désolé, je pensais pourtant bien être dans le bon sous-forum destiné à tout ce qui se rapproche à l'informatique Mais bon, merci quand même d'avoir lu ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Calculer la Normale d'un vecteur en C Dim 10 Nov 2013 - 11:48 | |
| Exact, Sefiria.
Mais sauf un heureux hasard, tu ne trouveras pas ici de spécialistes C capable de te répondre sur un sujet de ce type. Pourquoi tu n'essaies pas sur un des multiples forums dédiés au C ?
Bon courage ! | |
| | | Sefiria
Nombre de messages : 25 Age : 32 Localisation : Nîmes (30), France Date d'inscription : 05/03/2013
| Sujet: Re: Calculer la Normale d'un vecteur en C Lun 11 Nov 2013 - 0:10 | |
| Oui, je pense que c'est la meilleure chose à faire... En réalité je suis venu vous poser la question à vous, spécialement, car l'ambiance avec vous n'est pas du tout la même qu'avec certains autres forums, ici il y a une sorte de convivialité qui s'impose, où chacun y met du sien pour toujours aller plus loin, et c'est quelque chose que j'aime beaucoup ! Ayant partagé du Panoramic avec vous, j'ai appris quelque chose que l'on n'apprend pas ailleurs : toujours aller plus loin dans les possibilités. Dans la plupart des forums, c'est froid, puis la plupart des personnes se tirent la bourre ! Il y en a toujours un pour prouver qu'il est plus fort qu'un autre, et c'est exactement ce genre de chose que je n'apprécie pas. Après, il est vrai qu'une demande d'aide en C dans un forum Panoramic, c'est un peu comme demander des poires à un marchand de pommes ! Ce que je veux dire, c'est que je me suis sans doute un peu trop emballé ^^ Bon, tout ça pour dire, continuez à perpétuer cette atmosphère que j'aime tant. A bientôt | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Calculer la Normale d'un vecteur en C Lun 11 Nov 2013 - 0:24 | |
| Salut Sefiria. Jette un œil ici. ça pourrait t’aider. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Calculer la Normale d'un vecteur en C Lun 11 Nov 2013 - 0:48 | |
| @Sefiria, je serais bien incapable de donner mon avis sur le fond du problème (je laisse ça à notre matheux papydall), mais je dois dire que sur la forme ta dernière intervention fait rudement plaisir et sera sûrement bien appréciée par tous. Merci. | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Calculer la Normale d'un vecteur en C Lun 11 Nov 2013 - 8:35 | |
| Le forum FreeBasic est très sympa aussi : http://www.freebasic.net/forum/Et on y trouve beaucoup d'experts du C. En fait, FreeBasic peut générer du code C, qui est ensuite compilé par GCC. Le futur compilateur Panoramic devrait pouvoir générer du code FreeBasic, ce qui bouclerait la boucle | |
| | | Sefiria
Nombre de messages : 25 Age : 32 Localisation : Nîmes (30), France Date d'inscription : 05/03/2013
| Sujet: Re: Calculer la Normale d'un vecteur en C Lun 11 Nov 2013 - 21:28 | |
| Merci bien à tous, je peux enfin commencer les rebonds de mes tirs ! Certes, mon projet est à rendre demain, mais au moins, je sais maintenant ce que je fais, je n'ai plus à laisser la solution aux mains du hasard. J'ai trouvé ce genre d'explication sur les vecteurs, mais c'était tellement mal expliqué que j'en ai arraché plus d'un cheveux, presque à en ressembler à mon professeur. En tout merci d'avoir pris du temps pour moi, maintenant je n'ai plus qu'à me mettre au boulot. Merci mille fois !
A bientôt ! | |
| | | Contenu sponsorisé
| Sujet: Re: Calculer la Normale d'un vecteur en C | |
| |
| | | | Calculer la Normale d'un vecteur en C | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |