曲線タイプの数学的表現

曲線タイプの数学的表現

このセクションでは、Revit ジオメトリで扱う曲線タイプ、そのプロパティ、それらの数学的表現について説明します。

バインドされた線分

バインドされた線分はそれぞれの端点によって定義されます。Revit API では、曲線レベルの GetEndPoint()メソッドから線分の端点を取得します。

バインドされた線分上の点の計算式は、正規化されたパラメータ「u」と線分の端点を用いて次のように表されます。

バインドされていない線分

Revit API ではバインドされていない線分には特別な処理が行われます。ただし、大部分の曲線プロパティは使用することができず、未加工のパラメータが提供された場合は、曲線に沿った位置を取得するために Evaluate()と ComputeDerivatives()を使用できます。

バインドされていない線分の点の計算式は、未加工のパラメータ「u」と線分の基準点と正規化された方向ベクトルを用いて次のように表されます。

円弧と円

円弧と円は Revit API では Arc クラスで表されます。これらは半径、中心、円弧の法線ベクトルで定義されますが、Revit API では Arc クラスからプロパティとして直接アクセスすることができます。

円の IsBound プロパティは True に設定されています。これは未加工のパラメータ(0 ~ 2πの範囲)を使用してのみ評価できることを意味しており、円上の点の計算式は未加工のパラメータを用いて次のように表されます。

ここでは、円が XY 面に配置されていると仮定されています。

円弧は特定の角度で開始、終了します。これらの角度は円弧の両端の未処理のパラメータ値によって取得でき、これらの値の間の角度の値は上記の同じ計算式に当てはめることができます。

円柱状らせん

円柱状らせんは Revit API では CylindricalHelix クラスで表されます。これらはらせんが巻かれる円柱の軸の基本点、半径、x と y ベクトル、ピッチ、始点と終点での角度で定義されます。

楕円と楕円弧

楕円と楕円弧セグメントは、Revit API では Ellipse クラスで表示されます。円や円弧と同様に、特定の平面において、X と Y 半径、中心、楕円の法線ベクトルを用いて定義されます。

完全な楕円の IsBound プロパティは True に設定されています。円と同様に、0 ~ 2π の未加工のパラメータによって評価できます。

NurbSpline

NURBS(nonuniform rational B-spline)は、ユーザがスケッチしたスプライン セグメントに曲線または 3D オブジェクトスケッチの一部として使用されます。また、読み込んだジオメトリ データの一部のタイプを表すために使用されます。

NurbSpline には次のデータが含まれます。

  • コントロール点の配列、長さ n+1
  • 重量の配列、長さ n+1
  • 曲線の次数、曲線の順序(k)よりも 1 少ない値
  • ノットベクトル、長さ n + k +1

Revit のスケッチ ツールで使用される NurbSplines は、アルゴリズムを使用してコントロール点と次数のみから生成できます。Revit のアルゴリズムが実行する計算は、下のサンプルにあるように、外部に複製することができます。

NurbSplinespline = curve.GeometryCurve as NurbSpline;
DoubleArrayknots = spline.Knots;

// Convert to generic collection
List<double> knotList = new List<double>();
for(int i = 0; i < knots.Size; i++)
{
    knotList.Add(knots.get_Item(i));
}

// Preparation - get distance between each control point
IList<XYZ> controlPoints = spline.CtrlPoints;
int numControlPoints = controlPoints.Count;
double[] chordLengths = new double[numControlPoints - 1];
for(int iControlPoint = 1; iControlPoint < numControlPoints; ++iControlPoint)
{
    double chordLength = 
       controlPoints[iControlPoint].DistanceTo(controlPoints[iControlPoint - 1]);
    chordLengths[iControlPoint - 1] = chordLength;
}

int degree = spline.Degree;
int order = degree + 1;
int numKnots = numControlPoints + order;
double[] computedKnots = new double[numKnots];
int iKnot = 0;

// Start knot with multiplicity degree + 1.
double startKnot = 0.0;
double knot = startKnot;
for(iKnot = 0; iKnot < order; ++iKnot)
{
    computedKnots[iKnot] = knot;
}

// Interior knots based on chord lengths
double prevKnot = knot;

for(/*blank*/; iKnot <= numControlPoints; ++iKnot) 
    // Last loop computes end knot but does not set interior knot.
{
    double knotIncrement = 0.0;
    for (int jj = iKnot - order; jj < iKnot - 1; ++jj)
    {
        knotIncrement += chordLengths[jj];
    }

    knotIncrement /= degree;
    knot = prevKnot + knotIncrement;
    if (iKnot < numControlPoints)
        computedKnots[iKnot] = knot;
    else
        break;   // Leave "knot" set to the end knot; do not increment "ii".

    prevKnot = knot;
}

// End knot with multiplicity degree + 1.
for(/*blank*/; iKnot < numKnots; ++iKnot)
{
    computedKnots[iKnot] = knot;
}

HermiteSpline

エルミート スプラインは、一連のコントロール点の間で補間される曲線(点による曲線、MEP のフレキシブル ダクトと配管など)に使用されます。また、読み込んだジオメトリ データの一部のタイプを表すために使用されます。Revit API では、HermiteSpline クラスにより ControlPoints、Tangents、Parameters プロパティを通じて点、接線ベクトル、パラメータの配列にアクセスすることができます。

エルミート スプラインの 2 つのノードの間の曲線の計算式は次のとおりです。

ここで、Pk と Pk+1 は各ノードの点を、Mk と Mk+1 は接線ベクトルを、uk と uk+1 ノードのパラメータを表します。基本関数は次のとおりです。