優れたバグレポート@ jadie1 、小さなデータセットが含まれ、再現手順。
@HeavenlyBerserker 、参考までに、ここでスタックしています:
Call graph:
5 Thread_5215217 DispatchQueue_1: com.apple.main-thread (serial)
+ 5 start (in libdyld.dylib) + 1 [0x7fff69ef2cc9]
+ 5 main (in shapeworks) + 2606 [0x102bfb9fe] shapeworks.cpp:88
+ 5 shapeworks::Executable::run(int, char const* const*) (in shapeworks) + 188 [0x102c0ad7c] Executable.cpp:128
+ 5 shapeworks::Executable::run(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, shapeworks::SharedCommandData&) (in shapeworks) + 308 [0x102c0a6f4] Executable.cpp:94
+ 5 shapeworks::Command::run(shapeworks::SharedCommandData&) (in shapeworks) + 20 [0x102c14e64] Command.cpp:27
+ 5 shapeworks::OptimizeCommand::execute(optparse::Values const&, shapeworks::SharedCommandData&) (in shapeworks) + 921 [0x102c16889] Commands.cpp:92
+ 5 shapeworks::Optimize::Run() (in shapeworks) + 1938 [0x102ea5d52] Optimize.cpp:120
+ 5 shapeworks::Optimize::Initialize() (in shapeworks) + 1770 [0x102ea7d3a] Optimize.cpp:733
+ 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double) (in shapeworks) + 2133 [0x102eb46f5] itkParticleSystem.txx:330
+ 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double) (in shapeworks) + 2542 [0x102eb488e] itkParticleSystem.txx:344
+ ! 1 itk::Constraints::IsAnyViolated(itk::Point<double, 3u> const&) (in shapeworks) + 71 [0x102ecce67] Constraints.h:61
+ 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double) (in shapeworks) + 2530 [0x102eb4882] itkParticleSystem.txx:344
+ 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double) (in shapeworks) + 3010 [0x102eb4a62] itkParticleSystem.txx:349
+ 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double) (in shapeworks) + 1655 [0x102eb4517] vector:0
私はこのバグレポートの品質を2番目にしています。 私は問題を見てきました。 これをチェックしてくれてありがとう、アラン。
AdvancedAllParticleSplitting関数は、特定の半径(分割されたパーティクルから元のパーティクルまでの距離)でどの方向に進むパーティクルも制約を満たさない場合にハングします。 試行する方向の数を制限することを考えましたが、切断面によってはヒットが非常にまれである可能性があり、一定の数は不適切である可能性があるため、それを拒否しました。 私はこれを処理するための提案を受け入れていますが、現在行っている作業がうまくいった場合、AdvancedAllParticleSplittingは厳密には必要ないので、まったく異なる粒子分割戦略について説明できます。
テスト自体に関しては、これはメッシュの配置が原因で発生しています。 切断面はz = -40.5〜-42.5で切断されますが、メッシュはz = -737.593〜-609.55、-1217.76〜-1114.47、および1079.93〜1206.3に配置されます(以下を参照)。 これは2つの問題を引き起こします。 まず、法線がどちらの方向を向いているか(上/下)に関係なく、制約に完全に違反する大腿骨が少なくとも1つあります。 次に、粒子分割半径は、入力の間隔に応じて、量イプシロンによって決定されます。 この場合、間隔は1000年代であるため、分割は制約に違反する可能性があります。
注意として、使用している大腿骨はすでにクリッピング法を使用して切断されています。 これが実際のシナリオで行われるとは思いません。 ClipBinaryVolumesを削除し、femur_cut.pyにCroppingを適用した方法を思い出してください。
切断面(C ++内)に関する今後の問題については、私に割り当ててください。 メッシュを使用して切断面のコードをテストしていません。 動作しない理由はありませんが、バグがないかテストすることをお勧めします。 ありがとう、みんな!
@HeavenlyBerserkerああ、
はい、違反しないが間隔の問題に遭遇した平面を切断しようとしましたが、機能します。 すべての大腿骨を同じ一般的な領域に配置し、切断面を適切に調整できる場合、特に1つの切断面しか使用していないことを考えると、これが機能しない理由はわかりません。
このデータを使用したときにバグがないことを確認しました: test.zip
@HeavenlyBerserkerを理解するのを手伝ってくれてありがとう
今これを閉じる
メッシュを使用して切断面のコードをテストしていません。 動作しない理由はありませんが、バグがないかテストすることをお勧めします。
いくつかのメッシュを正常に切り刻みました。これにはユニットテストがあります(MeshTests、PythonTests、およびshapeworksTests)。
C ++内の将来の問題に私を割り当ててください。
絶対に! ありがとうございました!!
@HeavenlyBerserker 、この状態を検出して例外を発生させたり、エラーメッセージを表示したりする方法はありますか? ぶら下がったりクラッシュしたりするよりも、それが本当に好きです。 また、実行する前に確認する方法はありますか? #910を参照してください。
うーん、入力のメッシュ/イメージポイントの少なくとも1つが制約を満たしているかどうかを確認できるはずです。 絶対確実ではありませんが、99.9%の確率で機能するはずです。