2010-11-28 37 views
1

Je travaille sur un programme qui montre comment fonctionne l'objectif et pour lequel j'ai besoin une bibliothèque ou un algorithme 2D ray tracing.Traçage de rayon optique 2D

J'ai cherché le lancer de rayons et j'ai trouvé la plupart du temps des choses qui servent à créer une scène en 3D, alors que mon exigence est une simple simulation d'objectif interactif.

Ainsi, tout point concernant l'algorithme de traçage de rayon 2D ou la bibliothèque est le bienvenu. J'utilise Python.

+0

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

+0

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

+2

Bonjour. Avez-vous déjà réussi à construire votre démo d'objectif 2D? –

Répondre

2

j'ai commencé ce groupe parce que je suis intéressé par ce genre de chose,

http://groups.google.com/group/python-ray-tracing-community/web/list-of-python-statistical-ray-tracers.

Vous trouverez ici une liste (non exhaustive) de traceurs de rayons python qui devraient vous orienter dans la bonne direction. J'ai aussi un ray tracer écrit en Python qui fait ce dont vous avez besoin, mais il n'a pas encore été publié!

+1

Oublié de mentionner, voici le mien, http://daniel.farrell.name/freebies/pvtrace –

+0

Le lien google est mort. – moi

+0

Et mon site aussi, je me souviens que certains d'entre eux attendent. –

2

Ce problème comporte deux parties:

  1. trouver ce que le rayon frappe
  2. 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.