2010-11-28 29 views
1

さまざまなレンズがどのように機能するかを実証するプログラムに取り組んでおり、そのためには 2D ray tracingライブラリまたはアルゴリズムが必要です。2D光線追跡

私はレイトレーシングを探して、ほとんどが3Dでシーンを作成するのに使うものを見つけましたが、私の要件は単純な対話型のレンズシミュレーションです。

2Dレイトレーシングアルゴリズムまたはライブラリに対する任意の点を歓迎します。私はPythonを使用しています。光線が

  • は私がの形を離散化したいどのような線のヒットを見つけ出すために、屈折
  • 後に線を計算当たるものを見つける

    +0

    したがって、光屈折率が位置に依存する材料でレイトレーシングを行いたいですか?そして、光屈折率が変化する厳しい境界があるか、それとも位置の任意の機能ですか? – CodesInChaos

    +0

    いいえ、それは単純な凸凹レンズからフレネルレンズまで、2Dレンズのデモンストレーション用です。硬い境界線と複数の材料(ガラスの水分など)がありますが、単一のオブジェクト内に変化はありません。 – iamgopal

    +2

    こんにちは。 2Dレンズデモを構築したことがありますか? –

    答えて

    2

    私はこの種のものに興味があるので、私は、

    http://groups.google.com/group/python-ray-tracing-community/web/list-of-python-statistical-ray-tracersをこのグループを開始しました。

    ここでは、正しい方向を指すはずのパイソン・レイ・トレーサのリスト(非網羅的)を見つけることができます。私はまた、あなたが必要としているが、まだリリースされていないことを行うPythonで書かれたレイトトレーサーを持っています!

    +1

    ここを忘れて、ここに私の、http://daniel.farrell.name/freebies/pvtrace –

    +0

    Googleのリンクが死んでいます。 – moi

    +0

    私のウェブサイトも、私はそれらのうちのいくつかが覚えていることを覚えています。 –

    2

    この問題は2つの部分がありますレンズ。だから、あなたは直線に対してテストする必要があります。最初のヒット見つける

    擬似コード:ヒットで

    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; 
        } 
        } 
    } 
    

    は、光線方向にベクトルバージョンsnellius則を適用し、インシデントの時点に新しい開始点を設定します。その時点から再びレイトレーシングを開始します。

    また、光線が同じラインピースにすぐに当たらないように注意する必要があります。 1つのラインピースをブラックリストに載せたり、ラインピースを超えて少しだけ位置を設定することで(ポジション+ =イプシロン*方向)

    これ以上のヒットがなくなるまで