.STLファイルを解析するための最も効率的な戦略は何ですか?C++で.STLファイルをインポートする最も効率的な方法は何ですか?
私のコードの重要な部分は、.STLファイル(一般的なCADファイル形式)をインポートしており、全体的なパフォーマンスが制限されています。
.STLファイル形式が要約されているhere- https://en.wikipedia.org/wiki/STL_(file_format)
使用ASCII形式は、このアプリケーションのために必要です。
一般的な形式は次のとおりです。
solid name
facet normal ni nj nk
outer loop
vertex v1x v1y v1z
vertex v2x v2y v2z
vertex v3x v3y v3z
endloop
endfacet
endsolid
はしかし、私は厳格なフォーマット要件がないことに気付きました。また、インポート関数は最小限のエラーチェックを行う必要があります。
cout << "Importing " << stl_path << "... ";
auto file_vec = import_stl(stl_path);
for (auto& l : file_vec) {
trim(l);
if (solid_state) {
if (facet_state) {
if (starts_with(l, "vertex")) {
//---------ADD FACE----------//
l.erase(0, 6);
trim(l);
vector<string> strs;
split(strs, l, is_any_of(" "));
point p = { stod(strs[0]), stod(strs[1]), stod(strs[2]) };
facet_points.push_back(p);
//---------------------------//
}
else {
if (starts_with(l, "endfacet")) {
facet_state = false;
}
}
}
else {
if (starts_with(l, "facet")) {
facet_state = true;
//assert(facet_points.size() == 0);
//---------------------------//
// Normals can be ignored //
//---------------------------//
}
if (starts_with(l, "endsolid")) {
solid_state = false;
}
}
}
else {
if (starts_with(l, "solid")) {
solid_state = true;
}
}
if (facet_points.size() == 3) {
triangle facet(facet_points[0], facet_points[1], facet_points[2]);
stl_solid.add_facet(facet);
facet_points.clear();
//check normal
facet.normal();
}
}
: - - 1.177568秒
ループを解析ループの解析3.894250秒
stl_importを():私は、43,000行ファイルを提供します(クロノを使用して)いくつかのパフォーマンスの測定を行ってきました
stl_import機能がある:私は方法で検索しました
std::vector<std::string> import_stl(const std::string& file_path)
{
std::ifstream infile(file_path);
SkipBOM(infile);
std::vector<std::string> file_vec;
std::string line;
while (std::getline(infile, line))
{
file_vec.push_back(line);
}
return file_vec;
}
ファイル読み込みを最適化するなどです。そして、mmapを使用するとファイルの読み込み速度が向上することがあります。
この質問は.STLファイルのための最高の解析戦略が何であるかの問い合わせのですか?
最も適切な方法は、間違いなく適切なライブラリを見つけることです。優れた解析ルーチンは、ファイルデータへの読み取りアクセスを高速化しようとするよりも良い結果をもたらすでしょう。 –
私はこれらの編集を行ったが、パフォーマンスには影響しません。 – Chris
ファイルを解析する前にファイル全体をインポートするのはなぜですか?あなたはたくさんの記憶を無駄にしているでしょうし、おそらくそれを行うことによっても少し時間がかかります。 –