ハンサム非垞にアトラクタを芖芚化するためのアプリケヌションの䜜成方法

奇劙なアトラクタは、さたざたな物理システムによく芋られる領域です。これは、ある地域からの軌跡が傟向がある魅力的な地域であるず蚀えたす。いく぀かの制限サむクルずは異なり、たたは枛衰振動の平衡点からは、呚期的ではありたせん。このようなシステムでは、バタフラむ効果が珟れたす。初期䜍眮の最小偏差は時間ずずもに指数関数的に増加したす。



䞀郚のアトラクタは、静止画でもその矎しさに魅了されたす。私たちは、ほずんどのアトラクタをダむナミクス、3D、ラグなしで芖芚化できるアプリケヌションを䜜りたかったのです。







私たちに関しおは



私たちはRomanVenediktov、Vladislav Nosivskoy、KirillKarnaukhovです。サンクトペテルブルクの高等経枈孊郚の孊士課皋「応甚数孊ず情報孊」の2幎生です。私たちは孊生時代からプログラミングが奜きでした。3人党員がオリンピックプログラミングに埓事し、異なる幎にコンピュヌタサむ゚ンスの孊童のための党ロシアオリンピックの最終段階に移行したしたが、圌らは以前に産業プログラミングの経隓がなく、これは私たちにずっお最初の倧芏暡なチヌムプロゞェクトです。C ++に関するタヌムペヌパヌずしお擁護したした。



モデリング



奇劙なアトラクタを䜿甚しお動的システムを定矩する方法はたくさんありたすが、最も䞀般的なのは3぀の1次埮分方皋匏のシステムです。私たちは圌女から始めたした。



{x′=f(x,y,z)y′=f(x,y,z)z′=f(x,y,z)





䜕かを芖芚化する前に、プロセス自䜓をシミュレヌトし、ポむントの軌道を芋぀ける必芁がありたす。正確なモデリング方法は非垞に手間がかかるため、できるだけ早く実行したいず考えおいたす。



モデリングを実装する際に、メタプログラミングを䜿甚し、std ::関数や他の同様のメカニズムを攟棄するこずにしたした。アヌキテクチャずコヌディングを簡玠化するこずもできたすが、パフォヌマンスが倧幅に䜎䞋するため、望たしくありたせんでした。



最初は、䞀定のステップで4次の粟床の最も単玔なRunge-Kuttaメ゜ッドがモデリングに䜿甚されたした。これたでのずころ、モデルのメ゜ッドやその他の数孊コンポヌネントの数を増やすこずに戻っおいたせん。珟圚、これが提瀺されおいる唯䞀のメ゜ッドです。芋぀かったほずんどのシステムでは、他の゜ヌスからの画像ず同様の画像を生成するのに十分な粟床がありたす。



モデルは入力ずしお受け入れたす



  • ポむントの座暙によっお導関数を取埗するための「導関数」関数。
  • 「オブザヌバヌ」ファンクタヌ。受信するずすぐにそのポむントから呌び出されたす。
  • シミュレヌションパラメヌタ開始点、ステップサむズ、点数。


将来的には、提瀺された画像が実際の画像ずどのように䞀臎するかを確認するためのチェック、モデリングのより匷力な方法Boost.Numeric.Odeintラむブラリを接続するなど、および数孊の知識がただ十分でないその他の分析方法を远加できたす。



システム



私たちは、それらから最高のパフォヌマンスを匕き出すために最も人気のある奇劙なアトラクタシステムを芋぀けたした。ここでは、この怜玢を非垞に簡単にしたサむトchaoticatmospheres.comに感謝したす。



すべおのシステムは、すべお「テンプレヌト」であるにもかかわらず、コンテナに入れおコントロヌラで正垞に動䜜できるように、ラップする必芁がありたした。次の解決策に到達したした。



  • DynamicSystem ‘observer’, (, ...) std::function ‘compute’. ‘Compute’ , , ‘derivatives’ .
  • std::function , DynamicSystemInternal compute .
  • DynamicSystemInternal ‘observer’, ‘derivatives’. ‘derivatives’, .


DynamicSystemを所有し、芖芚化に必芁な前凊理正芏化のための定数の遞択、ステップ長制埡を䜿甚するメ゜ッドの蚱容可胜な゚ラヌなどを実行できるDynamicSystemWrapperの远加䜜業を開始したしたが、終了する時間がありたせんでした。



芖芚化



パフォヌマンスず機胜のためにレンダリングラむブラリずしおOpenGLを遞択したした。たた、OpenGLの䟿利なラッパヌを持぀Qt5も遞択したした。



たず、少なくずも䜕かを描く方法を孊びたかったのですが、しばらくしお最初のキュヌブを䜜るこずができたした。その埌たもなく、数孊モデルの単玔なバヌゞョンが登堎したした。これがアトラクタの最初の芖芚化です。







芖芚化の最初のバヌゞョンでは、非垞にシンプルなバヌゞョンのカメラも甚意されおいたした。圌女は䞀点を䞭心に回転し、近づく/離れる方法を知っおいたした。私たちは宇宙でもっず自由を望んでいたした。アトラクタは異なり、さたざたな方法で探玢する必芁がありたす。次に、カメラの2番目のバヌゞョンが登堎したした。これは、すべおの方向に自由に回転および移動できたすMinecraftのカメラによっおガむドされたした。圓時、線圢代数は始たったばかりだったため、十分な知識がありたせんでした。むンタヌネットで倚くの情報を探す必芁がありたした。







この間ずっず、写真は癜く、静的で、面癜くありたせんでした。色ずダむナミクスを远加したかった。最初に、党䜓像を1぀の色でペむントする方法を孊びたしたが、それも面癜くないこずがわかりたした。次に、次の解決策を考え出したした。



  • 互いに近い開始点をたくさん100〜500、蚭定でさらに遞択できたす。䞻なこずは十分なパフォヌマンスがあるこずです。
  • それらのそれぞれからの軌道をシミュレヌトしたす。
  • 軌道を異なる色で色付けしながら同時にレンダリングし、軌道のセグメントのみを衚瀺したす。


その結果、次のこずが刀明したした。







ほがこのスキヌムは最埌たで残っおいたした。



線が「角匵っおいる」こずに気づき、滑らかにする方法を孊ぶこずにしたした。もちろん、シミュレヌションのステップを枛らすように努めたしたが、残念ながら、最新のプロセッサでさえ、そのような数のポむントをカりントするこずはできたせん。別のオプションを探す必芁がありたした。



最初は、OpenGLにはアンチ゚むリアシングツヌルが必芁だず考えおいたしたが、倚くの怜玢を行った結果、そうではないこずがわかりたした。次に、曲線を補間し、十分に離れおいる隣接するポむントの各ペアの間にさらにいく぀かを远加するずいうアむデアが思い浮かびたした。これを行うには、曲線を補間する方法を遞択する必芁があり、そのような方法はたくさんありたす。残念ながら、それらのほずんどたずえば、ベゞ゚曲線では、さらにいく぀かのポむントを指定する必芁がありたしたが、これは明らかに私たちのタスクには適しおいたせんでした。しばらくしお、適切な補間を芋぀けたしたCatmull-Roma曲線。それは次のようになりたした







その埌、アプリ内で動画を録画するずいいず思いたした。クロスプラットフォヌムを維持したかったので、libavラむブラリに決めたしたラむブラリ間でほずんど遞択の䜙地はありたせんでした。残念ながら、ラむブラリ党䜓がCで蚘述されおおり、むンタヌフェむスが非垞に䞍䟿であるため、䜕かの蚘述方法を孊ぶのに長い時間がかかりたした。以降のすべおのgifは、組み蟌みの蚘録を䜿甚しお䜜成されたす。







これたで、すべおの曲線の色は䜜成時に明瀺的に指定されおいたした。矎しい写真を撮るには、色を倉える必芁があるず刀断したした。これを行うために、コントロヌルカラヌのみが衚瀺され始め、残りは線圢募配を䜿甚しお蚈算されたした。この郚分はシェヌダヌに移されたした以前は暙準でした。



それぞれが頭から尟ぞず色を倉えるような方法で軌道に色を付けるのは興味深いこずでした。これにより、速床の圱響を芳察できたす。







次に、軌道の前凊理時間を短瞮する䟡倀があるず考えたした。曲線の補間は「高䟡な」操䜜です。軌道の䞀郚を描画するように芁求されるたびにGPUが補間を蚈算するように、この郚分をシェヌダヌに転送するこずが決定されたした。このために、GeometryShaderを䜿甚したした。この゜リュヌションには倚くの利点がありたす。描画前のレンダリング偎での遅延がなく、曲線をさらに滑らかにする機胜このような蚈算はCPUよりもGPUで高速に実行されたす、䜿甚するRAMが少なくなりたすその前は、すべおの補間ポむントを保存する必芁がありたしたが、今は-いいえ。



コントロヌラずナヌザヌむンタヌフェむス



基本フレヌムワヌクずしおQt5を遞択した埌、むンタヌフェヌスのテクノロゞヌを遞択するずいう問題はすぐに消えたした。組み蟌みのQtCreatorは、小さなアプリケヌションのすべおのニヌズを十分に満たしたす。





ナヌザヌの芁求に応答するには、コントロヌラヌを䜜成する必芁がありたした。幞い、Qtには、キヌストロヌクを凊理しおフィヌルドに倀を入力するための䟿利な方法がありたす。これは、Qtの䞻なアむデアである信号ずスロットのメカニズムを䜿甚しおいたす。たずえば、アプリケヌションでモデルの再構築を担圓するボタンを抌すず、ハンドラスロットによっお受け入れられる信号が生成されたす。再構築自䜓が開始されたす。







むンタヌフェむスを備えたほずんどすべおのアプリケヌションを開発するずき、遅かれ早かれ、アプリケヌションをマルチスレッドにするずいうアむデアが浮かび䞊がりたす。組み蟌みモデルの構築には数秒かかり、カスタムモデルの構築には10秒かかりたした。同時に、もちろん、すべおの蚈算が1぀のスレッドで実行されたため、むンタヌフェむスがハングしたした。かなり長い間、さたざたなオプションに぀いお話し合い、std :: asyncを䜿甚しお非同期に぀いお考えたしたが、最終的には、別のスレッドで蚈算を䞭断できるようにしたいず考えたした。これを行うには、std :: threadのラッパヌを䜜成する必芁がありたした。すべおが可胜な限り単玔です。チェック甚のアトミックフラグず、チェックが倱敗した堎合の適切な割り蟌みです。



これにより、望たしい結果が埗られただけでなく、むンタヌフェむスがハングしなくなりたした。たた、アヌキテクチャの特殊性ずモデルデヌタず芖芚化の間の盞互䜜甚により、カりントの過皋ですべおをオンラむンで描画できるようになりたした。以前は、すべおのデヌタを埅぀必芁がありたした。



カスタムシステム



アプリケヌションにはすでに倚くのアトラクタが甚意されおいたすが、ナヌザヌが自分で方皋匏を入力できるようにしたかったのです。このために、倉数x、y、z、暙準の数孊挔算+-* / ^、定数、倚くの数孊関数sin、cos、log、atan、sinh、expなどをサポヌトするパヌサヌを䜜成したした。ずブラケット。これがその仕組みです



  • 元のク゚リ文字列はトヌクン化されたす。次に、トヌクンが巊から右に解析され、匏ツリヌが構築されたす。
  • 可胜な操䜜はグルヌプに分けられたす。各グルヌプには独自のノヌドがありたす。グルヌププラスマむナス、乗算陀算、指数、単項マむナス、いわゆるシヌトこれには定数、倉数、関数呌び出しが含たれたす。
  • 各グルヌプには、独自のレベルの蚈算がありたす。各レベルは、次のレベルで再垰的な蚈算を匕き起こしたす。呌び出しの順序が操䜜の優先順䜍の分垃に圱響を䞎えるこずがわかりたす。䞊蚘の順番でご甚意しおおりたす。


パヌサヌの゜ヌスコヌドで 詳现を探しおください。



各レベルは、ノヌドのある皮の継承者を返したす。それらの4぀がありたす



  • バむナリ挔算子-2぀の子ぞのポむンタず独自のタむプの操䜜を栌玍したす。
  • unary挔算子-子ぞのポむンタずそれ自䜓の操䜜タむプを栌玍したす。これは、単䞀操䜜の特殊なケヌスであるため、関数が含たれたす。
  • 定数-その倀を栌玍したす。
  • variable-倀が存圚するメモリ内の堎所ぞのポむンタを栌玍したす。


ノヌド構造には、そのサブツリヌの倀を返す仮想蚈算関数のみがありたす。



結果の出力は、前述のシステムアヌキテクチャに合わせお非垞に䟿利に調敎されたす。ラムダは単にDynamicSystemInternalに枡され、取埗された3぀のツリヌのルヌトノヌドぞのポむンタヌず倀のxyzメモリ䜍眮が栌玍されたす。呌び出されるず、そこにある倀を提䟛された倀に倉曎し、ルヌト頂点からcalcを呌び出したす。



結果



その結果、ナヌザヌ定矩のシステムを芖芚化でき、倚数のアトラクタを基盀ずするプログラムを手に入れたした。圌女はそれを非垞にうたく行い、最適化しおいたす。これは朗報です。



しかし、ただ倚くの䜜業がありたす。



  • より正確なメ゜ッドを远加したす。
  • システム凊理のレむダヌをもう1぀远加したすより耇雑な方法での正芏化ず自動゚ラヌ遞択。
  • ナヌザヌシステムでの䜜業を改善したす倉数のサポヌト、保存。
  • 䜜業を最適化したすJITコンパむル、たたは保存されたシステムをc ++コヌドに倉換し、組み蟌みシステムのパフォヌマンスを実珟するために再コンパむルを開始するナヌティリティ。
  • そのようなシステムで䜜業する人々が本圓に必芁ずする結果分析たたは芖芚化のための機胜を远加したす。
  • ..。


私たちのリポゞトリ。



そしお、アトラクタを備えたいく぀かのビデオ










All Articles