Bonjour,
j'essaye de créer un programme maple permettant de simuler le parcours d'un rayon lumineux dans une ellipse. Je raisonne en 2 dimension, et a chaque reflexion sur le bord de l'ellipse, le rayon doit obéir a la loi snell-descartes.

Pour ce faire j'ai crée 2 procédures, une première qui pour la donnée d'un point et d'un vecteur (Point de départ du rayon, et vecteur directeur), me donne le prochain point de l'ellipse où aura lieux une réflexion. Cette procédure marche très bien:

Code:
Point := proc (p, q, u, v) 
local f, S, B;
 f := proc (t) options operator, arrow;
 u*t+p, v*t+q end proc;
 S := solve({f(x)[1] = T(y)[1], f(x)[2] = T(y)[2]}, [x, y]);
 if 0 < rhs(S[1][1]) and 1/100000 < abs(rhs(S[1][1])) and 1/100000 <> (p, q) 
then B := rhs(S[1][2])
 else if 1/10000000000 < abs(rhs(S[2][1]))
 then B := rhs(S[2][2])
 else B := (1/2)*Pi
 end if end if; 
RETURN(B)
 end proc
Note: Elle me retourne un paramètre t, que je réutilise dans le paramétrage de l'ellipse T(t)=(a.cos(t),b.sin(t)) pour avoir les coordonnées du point.

J'ai ensuite voulut faire une deuxième procédure qui, toujours avec la donnée d'un point et d'un vecteur me donnerait le vecteur directeur du rayon issu de la prochaine reflexion (Autrement dit: (A1,V1)->V2 ):

Code:
Vecteur := proc (p, q, u, v)
 local t, N, Phi, V;
 t := Point(p, q, u, v);
 N := b*cos(t)/Norme(b*cos(t), a*sin(t)), a*sin(t)/Norme(b*cos(t), a*sin(t));
 M := N[2], -N[1]; 
Phi := VectorAngle(`<,>`(0, 1), `<,>`(N));
 V := (u*cos(Phi)+v*sin(Phi))*M+(v*cos(Phi)-u*sin(Phi))*N; 
RETURN(V)
 end proc
Je n'obtiens que des résultats très farfelus quand j'essaye différents tracés.

Je détaille cette procédure:

p,q les coordonnées du point A1. (u,v) le vecteur V1. t le paramètre du point A2 où s'effectue la réflexion.
N est un vecteur normal à l'ellipse en A2, orienté vers l’extérieur, unitaire.

Sur le papier j'ai raisonné ainsi:
En prenant une base (M,N) avec M orthogonal à N (ou encore tangent à l'ellipse), unitaire, orienté de telle sorte que (M,N) soit directe ( M:=N[2] , - N[1], et en notant V1:=(um,un) dans la base (M,N), on a:

V2:=(um,-un).

J'ai ensuite procédé à un changement de base pour avoir les coordonnées de V2 dans base initiale:

Phi := VectorAngle(`<,>`(0, 1), `<,>`(N)) l'angle entre l'axe des ordonnées et le vecteur N.

D'où um:= u cos (Phi) + y sin (Phi)
et un:= y cos (Phi) - x sin (Phi)

Je me doute bien avoir fait une erreur, voila 2 jours que j’essaye différentes méthodes (assez similaires), impossible d'arriver à un résultat correct. Si quelqu'un pouvait jeter un oeil et me dire ce qu'il en pense, je lui en serait très reconnaissant.