Calculer la Normale d'un vecteur en C [C] - C - Programmation
MarshPosté le 11-11-2013 à 00:37:52
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 ne pas vous crachant tout mon code en un instant, de ce fait, voici les parties les plus intéressantes de mon code :
• Les déclarations :
Code :
typedefstruct 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;
};
typedefstruct typeVECTEUR vecteur_new;
struct typeVECTEUR//structure de création de vecteurs (coordonnées X et Y)
{
double x;
double y;
};
typedefstruct 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)
};
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)
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) Mes tirs sont sphériques, crée par une fonction de CREAM tout simplement. Les tirs sont déplacés et la collision gérée par leurs centres respectifs.
• Puis l'initialisation :
Code :
creamWindow_SetWindowResolution(50,100,8);//ne fonctionne pas ??
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 :
Spoiler :
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.
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 !
En bref, ma demande : Appliquer un rebond à un tir en utilisant la Normale d'un mur en collision avec le tir. Il y a plusieurs murs, notamment des obstacles, donc autres que les délimitations de la map de jeu.
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
Message édité par Sefiria30 le 11-11-2013 à 00:42:40
Marsh Posté le 11-11-2013 à 00:37:52
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 ne pas vous crachant tout mon code en un instant, de ce fait, voici les parties les plus intéressantes de mon code :
• Les déclarations :
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)
Mes tirs sont sphériques, crée par une fonction de CREAM tout simplement.
Les tirs sont déplacés et la collision gérée par leurs centres respectifs.
• Puis l'initialisation :
• Enfin le code-cible (où je calcule les rebonds)
Normalement, je dois utiliser une formule se trouvant dans l'énoncé, en voici l'extrait :
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.
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 !
En bref, ma demande :
Appliquer un rebond à un tir en utilisant la Normale d'un mur en collision avec le tir.
Il y a plusieurs murs, notamment des obstacles, donc autres que les délimitations de la map de jeu.
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
Message édité par Sefiria30 le 11-11-2013 à 00:42:40