Ce problème comporte deux parties:
- trouver ce que le rayon frappe
- Calcul du rayon après réfraction
Pour découvrir ce que les coups de rayons Je discrétisation la forme de la lentille. Donc, vous avez juste besoin de tester contre les lignes droites.
Pseudo-code pour trouver le premier coup:
Line hitLine=null;
double minA=+Infinity;
foreach(line in Lines)
{
Solve (Ray.Start + a*Ray.Direction) == (line.P1+b*(line.P2-line.P1)) for a and b
if(0<=b<=1) //hit the line-piece
{
if(0<=a<minA)
{
minA=a;
hitLine=line;
}
}
}
Sur le coup appliquer la version vectorielle Snellius-loi à la direction des rayons et définir le nouveau point de départ au point d'incident. Puis recommencez à lancer des rayons depuis ce point.
Vous devez également veiller à ce que le rayon ne frappe pas la même pièce immédiatement. Faites cela soit en mettant cette pièce en liste noire, soit en la plaçant au-delà de la ligne (position + = direction epsilon *)
Répétez l'opération jusqu'à ce qu'il n'y ait plus de coups, c'est-à-dire que le rayon quitte la case.
Donc, vous voulez faire raytracing dans le matériel où l'indice optique dépend de la position? Et y a-t-il des limites dures où l'indice optique change, ou est-ce une fonction arbitraire de la position? – CodesInChaos
non, il est pour la démonstration de lentilles 2D, de la simple lentille convexe et concave aux lentilles de Fresnel. il y a des limites dures et des matériaux multiples (eau de verre, air, etc.) mais pas de changement dans un seul objet. – iamgopal
Bonjour. Avez-vous déjà réussi à construire votre démo d'objectif 2D? –