chura
Jr. メンバー
オフライン
投稿: 25
I'm a llama!
|
|
(一応解決)Re:スプライン曲線の長さ
« 返信 #1 投稿日: 2006/08/31 - 11:08:30 » |
|
その後いろいろ調べまして、とりあえず(?)解決しました 簡単に言うと、スプラインの場合は曲線を細かく分割し足しこむという 単純なものです。分割は次のいずれかで分割し、2点間距離を足しこむ ことになります。細かく分割するほど高精度に計算できますが、後者の 方が最適な位置で分割できます。 ・EvaluateでN等分点を取得 ・GetTessPtsで誤差の許容値を考慮した点を取得
結局のところ、スプライン曲線の距離というのは近似値でしか求められ ないということなのかなぁ?・・・だからGetLength2では取得できない とか
一応、後者のサンプルを記述しておきます。 SolidWorksの計測ツールがこれで計算しているかどうかは不明です。ち なみにサンプルこ許容誤差では計測結果は一致しませんでした。
double chordTolerance = 0.1 / 1000; // 弦の公差許容値:0.1mm(速度優先) double lengthTolerance = 1.0 / 1000; // 長さの公差許容値:1.0mm(速度優先) double startPoint[6]; double endPoint[6]; long arraySize; long pointNum; double* outPoint;
hRes = m_iCurve->IEvaluate(sParam, startPoint); // 始点を取得 hRes = m_iCurve->IEvaluate(eParam, endPoint); // 終点を取得
hRes = m_iCurve->IGetTessPtsSize( // 出力配列のサイズを取得 chordTolerance, lengthTolerance, startPoint, endPoint, &arraySize);
outPoint = new double[arraySize]; // テソレーション点のx,y,zの位置: // [ x1, y1, z1, x2, y2, z2, ... ]
hRes = m_iCurve->IGetTessPts( // 分割点を取得 chordTolerance, lengthTolerance, startPoint, endPoint, outPoint);
pointNum = arraySize / 3; dbLen = 0.0; for(long i=0; i<pointNum-1; i++) { dbLen += Dist(outPoint[i*3+0], outPoint[i*3+1], outPoint[i*3+2], outPoint[i*3+3], outPoint[i*3+4], outPoint[i*3+5]); }
delete []outPoint;
|