Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flash > AS3
AS3 Questions relatives à la programmation ActionScript 3 (Cours AS3)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/12/2011, 14h44   #1
Membre confirmé
 
Avatar de Remizkn
 
Inscription : janvier 2009
Messages : 323
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2009
Messages : 323
Points : 297
Points : 297
Envoyer un message via MSN à Remizkn Envoyer un message via Yahoo à Remizkn
Par défaut [Trigonométrie] Calculer un angle

Bonjour,

Je suis en train de réalisé un moteur de raycasting (pour la projection d'une "fausse 3D" dans le but de réalisé un moteur de type Doom). Jusqu'ici, mon moteur fonctionne, mais il me faut réduire l'effet de distorsion optique (FOV), mais pour cela, il me faut calculer l'angle de deux droites.

Je joins ici une image schéma: schéma , mon triangle n'est pas rectangle par contre, mais je voudrais connaître en AS3 le calcul qui permettrais d'obtenir l'angle des deux droites: A-B et A-C.

Merci d'avance, cela m'aiderait pas mal.
__________________
« N'est pas mort ce qui à jamais dort, et au long des ères peut mourir même la mort. »
H.P Lovecraft

« À l'heure actuelle, tout être vivant est potentiellement un membre actif de 4chan...sans même le savoir lui-même. »
Anonymous

Le site où se développe le jeu Blackmud et où le bon goût côtoie l'information inutile : ici
Remizkn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 16h59   #2
Candidat au titre de Membre du Club
 
Gabriel Freitas
Inscription : décembre 2010
Messages : 30
Détails du profil
Informations personnelles :
Nom : Gabriel Freitas

Informations forums :
Inscription : décembre 2010
Messages : 30
Points : 12
Points : 12
Hello. Partons du principe que dans ton triangle (pas rectangle ) tu connais les coordonnées des points A, B et C.

Tu peux procéder comme suit (mathématiquement parlant. Je ne connais pas AS3).

Il faut utiliser une formule qui dit que le cosinus de l'angle que tu cherches équivaut au produit scalaire de deux vecteurs directeurs définissant tes droites, ceci divisé par la multiplication des normes (longueurs) de ces deux vecteurs directeurs.

Par contre, si tu connais d'autres informations dans ton triangle. Tu devrais avoir plus de facilité à utiliser le théorème du sinus ou du cosinus (c'est selon)
Sans quoi, voici un détaillé de ce que je t'expliquais avec les vecteurs.

Code :
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
31
32
Le point A à les coordonnées x,y suivantes : ax, ay
Le point B à les coordonnées x,y suivantes : bx, by
Le point C à les coordonnées x,y suivantes : cx, cy

Calculer les vecteurs directeurs.

Si tu recherches l'angle en A, il te faut calculer les deux vecteurs directeurs qui partent de ce point.

Les composantes x,y du vecteur ab (définissant la droite AB et que l'on appelera : Vab) se calcule ainsi :
pour x (qu'on appelera : Vab_x) : Vab_x = bx - ax
pour y (qu'on appelera : Vab_y) : Vab_y = by - ay

On procède de la même manière pour le vecteur ac (définissant la droite AC et que l'on appelera Vac)
pour x (qu'on appelera : Vac_x) : Vac_x = cx - ax
pour y (qu'on appelera : Vac_y) : Vac_y = cy - ay

Calcul du produit scalaire des vecteurs directeurs

Le résultat du produit scalaire entre Vab et Vac (que l'on appelera : PS) se calcule comme suit : PS = (Vab_x*Vac_x) + (Vab_y*Vac_y)

Calcul de la multiplication des normes

Le dernier élement à connaître pour pouvoir utiliser la formule citée plus haut et le résultat de la multiplication des normes (des longueurs) de Vab et Vac. On appelera ce résultat MN.

Il faut procéder ainsi : MN = sqrt((Vab_x)^2 + (Vab_y)^2) * sqrt((Vac_x)^2 + (Vac_y)^2))

Calcul de l'angle entre deux droites

Maintenant que tu as tous tes éléments, la valeur de ton angle (que l'on appelera : alpha) se calcule ainsi

alpha = arccos(PS/MN)
Info, si j'ai un peu plus de temps ce soir (et si ca t'intéresse), je te posterai la version "bourrin", c'est à dire truc massif mais sans opération intermédiaire.

J'espère néanmoins que ceci t'aidera déja.
Si tu ne comprends pas quelques chose, dis le moi. Ca peut paraître un incompréhensif comme ça. Ca doit l'être encore si tu n'es pas trop un matheux. Mais je t'explique volontiers

Bonne soirée
Gibra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 19h59   #3
Membre confirmé
 
Avatar de Remizkn
 
Inscription : janvier 2009
Messages : 323
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2009
Messages : 323
Points : 297
Points : 297
Envoyer un message via MSN à Remizkn Envoyer un message via Yahoo à Remizkn
Je viens d'arrivé, je suis ravis de voir une réponse aussi documenté que celle-ci.
En fait, pour mon triangle, je connais la longueur de toutes les droites (donc j'ai un max d'info). Je vais plancher sur ce que tu viens de me donner. Merci beaucoup
__________________
« N'est pas mort ce qui à jamais dort, et au long des ères peut mourir même la mort. »
H.P Lovecraft

« À l'heure actuelle, tout être vivant est potentiellement un membre actif de 4chan...sans même le savoir lui-même. »
Anonymous

Le site où se développe le jeu Blackmud et où le bon goût côtoie l'information inutile : ici
Remizkn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 18h28   #4
Candidat au titre de Membre du Club
 
Gabriel Freitas
Inscription : décembre 2010
Messages : 30
Détails du profil
Informations personnelles :
Nom : Gabriel Freitas

Informations forums :
Inscription : décembre 2010
Messages : 30
Points : 12
Points : 12
Si tu connais la longueur de toutes les droites, je te recommande d'utiliser le Théorème du cosinus. Beaucoup plus simple à mettre en place.

Je t'ai donné la réponse précédente en partant du principe que tu avais un minimum d'informations.

Le théorème du cosinus se présente comme suit.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
 
Si les trois sommets de ton triangle se nomment A, B et C, les côtés opposés à ces points ce nomment respectivement a, b et c.
 
Angle en A : alpha
Angle en B : Beta
Angle en C : Gamma
 
Les formules sont les suivantes. (elles sont répétitives, mais il existe seulement trois cas de figures, je te les mets les trois).
 
a^2 = (b^2) + (c^2) - (2*b*c * cos(alpha))
b^2 = (a^2) + (c^2) - (2*a*c * cos(beta))
c^2 = (a^2) + (b^2) - (2*a*b * cos(gamma))
 
Et comme je suis gentil, En voici une de résolue pour trouver un angle. Je te laisse adapter la formule. ça ne devrait pas être trop compliqué.
 
alpha = arccos( ((a^2)-(b^2)-(c^2)) / (-2*b*c) )
Redis moi si tu as un souci^^
Gibra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2011, 15h46   #5
Membre confirmé
 
Avatar de Remizkn
 
Inscription : janvier 2009
Messages : 323
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2009
Messages : 323
Points : 297
Points : 297
Envoyer un message via MSN à Remizkn Envoyer un message via Yahoo à Remizkn
Le seul truc, c'est que pour faire ce calcul par exemple:

Code :
alpha = arccos( ((a^2)-(b^2)-(c^2)) / (-2*b*c) )
Il me faut les valeurs de a^2, b^2 et c^2, hors, pour obtenir ces valeurs, il me faut connaitre la valeur de l'un des angles:

a^2 = (b^2) + (c^2) - (2*b*c * cos(alpha))
b^2 = (a^2) + (c^2) - (2*a*c * cos(beta))
c^2 = (a^2) + (b^2) - (2*a*b * cos(gamma))

Comment faire sans?
__________________
« N'est pas mort ce qui à jamais dort, et au long des ères peut mourir même la mort. »
H.P Lovecraft

« À l'heure actuelle, tout être vivant est potentiellement un membre actif de 4chan...sans même le savoir lui-même. »
Anonymous

Le site où se développe le jeu Blackmud et où le bon goût côtoie l'information inutile : ici
Remizkn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2011, 16h21   #6
Candidat au titre de Membre du Club
 
Gabriel Freitas
Inscription : décembre 2010
Messages : 30
Détails du profil
Informations personnelles :
Nom : Gabriel Freitas

Informations forums :
Inscription : décembre 2010
Messages : 30
Points : 12
Points : 12
Le symbole ^ représente une puissance. a^2 signifie donc a élevé au carré. mais je pense que tu le savais déjà. (Mais Je ne comprends pas ce que tu ne comprends pas alors je le dis au cas ou).

Je croyais que tu connaissais la longueur de toutes les droites.

Si tu considères que a b et c sont les cotés de ton triangle, tu devrais connaitre leur longueur non ?

Voici un petit dessin (vite fait sous paint).

tu as donc tes côtés et tes angles sur ce dessin. a, b et c, sont les cotés du triangle. Les cotés débordent, c'est fait exprès (pour illustrer que c'es un croisement de droites).

Explique moi ce qui ne vas pas
Images attachées
Type de fichier : png triangle.png (7,9 Ko, 2 affichages)
Gibra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 15h57   #7
Membre confirmé
 
Avatar de Remizkn
 
Inscription : janvier 2009
Messages : 323
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2009
Messages : 323
Points : 297
Points : 297
Envoyer un message via MSN à Remizkn Envoyer un message via Yahoo à Remizkn
En fait, apparemment, j'ai réussi à faire le calcul, ça fonctionne, mais maintenant je galère un peu sur la suite .

Je vais expliqué le problème qui m'a fait poser cette question de trigonométrie, en espérant que tu seras y répondre.

J'ai joint un schéma à ce post, en fait, j'effectue un raycasting (lancé circulaire de rayons partir d'un point central). En rouge ce sont mes rayons. Mais je voudrais savoir comment (par quel calcul) je pourrais allonger mes rayons (jusqu'au rayons bleus) de manière à ce qu'il s'arrêtent tous à la même limite donc?

J'avais lu qu'il fallait calculer le cosinus de l'angle qui sépare le rayon central du rayon à corriger, et qu'il fallait multiplier le rayon à corriger par ce cosinus... Mais ça n'a pas l'air de marcher.

Merci encore pour ton aide déjà, et j'espère que tu pourra encore m'aider.
Images attachées
Type de fichier : jpg schema.jpg (26,6 Ko, 13 affichages)
__________________
« N'est pas mort ce qui à jamais dort, et au long des ères peut mourir même la mort. »
H.P Lovecraft

« À l'heure actuelle, tout être vivant est potentiellement un membre actif de 4chan...sans même le savoir lui-même. »
Anonymous

Le site où se développe le jeu Blackmud et où le bon goût côtoie l'information inutile : ici
Remizkn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 19h09   #8
Candidat au titre de Membre du Club
 
Gabriel Freitas
Inscription : décembre 2010
Messages : 30
Détails du profil
Informations personnelles :
Nom : Gabriel Freitas

Informations forums :
Inscription : décembre 2010
Messages : 30
Points : 12
Points : 12
Aaaaaaaaaah... Je vois beaucoup mieux le problème.

Donc, si j'ai bien compris,tu as pu calculer l'angle que tu voulais. Mais en effet, multiplier la longueur de ta droite par le cosinus d'un angle ne vas pas t'aider. Le cosinus d'un angle étant toujours égal ou inférieur à 1, ta droite ne pourra que rétrécir

Ce que tu dois faire, c'est diviser la longueur de ta droite par le cosinus de l'angle.
Pour preuve, si ton angle vaut 90°, la valeur du cosinus sera de 0. Or, la division par zéro est impossible. Ce qui est normal comme résultat puisqu'avec un angle de 90°, la projection de ta droite n'atteindra jamais la ligne d'horizon.

J'espère que cela t'auras aidé, redis moi
Gibra est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h12.


 
 
 
 
Partenaires

Hébergement Web