NURBS-кривая
NURBS-кривая формируется последовательностью вызовов: открыть (StartNurbsCurve), задать контрольные точки, веса и узлы, закрыть (CloseNurbsCurve).
StartNurbsCurve(ID: string; Degree: integer; IsPeriodic, IsRational, IsClosed: boolean; KnotCount, CPCount: integer) — начать формирование NURBS-кривой.
ID— идентификатор сущности;Degree— степень кривой;IsPeriodic— признак периодичности;IsRational— признак рациональности;IsClosed— признак замкнутости;KnotCount— число узлов;CPCount— число контрольных точек.
SetNurbsCurveControlPoint(Index: integer; P: TST3DPoint) — задать контрольную точку по индексу.
Index— индекс контрольной точки;P— координаты точки.
SetNurbsCurveWeight(Index: integer; w: STFloat) — задать вес контрольной точки.
Index— индекс контрольной точки;w— вес.
SetNurbsCurveKnot(Index: integer; knot: STFloat) — задать узел.
Index— индекс узла;knot— значение узла.
CloseNurbsCurve() — завершить формирование NURBS-кривой.
Пример импорта NURBS-кривой.
// Параметры NURBS-кривой CAD-системы
class CADNurbsParam
{
public int Degree; // степень кривой
public bool Periodic; // периодичность
public bool Rational; // рациональность
public bool Closed; // замкнутость
public double[] Knots; // полный узловой вектор
public CADPoint[] ControlPoints; // контрольные точки (вершины CAD)
public double[] Weights; // веса (по одному на контрольную точку)
}
bool SaveNurbsCurve(string id, CADNurbsParam param)
{
sgr.StartNurbsCurve(id, param.Degree, param.Periodic, param.Rational, param.Closed,
param.Knots.Length, param.ControlPoints.Length);
try
{
// узловой вектор
for (int i = 0; i < param.Knots.Length; i++)
sgr.SetNurbsCurveKnot(i, param.Knots[i]);
// контрольные точки: вес + координаты (приводим к TST3DPoint)
for (int i = 0; i < param.ControlPoints.Length; i++)
{
double w = param.Weights[i];
TST3DPoint p = ToPoint(param.ControlPoints[i]);
// для рациональной кривой контрольные точки задаются в однородном виде (× вес)
if (param.Rational)
{
p.X *= w;
p.Y *= w;
p.Z *= w;
}
sgr.SetNurbsCurveWeight(i, w);
sgr.SetNurbsCurveControlPoint(i, p);
}
}
finally
{
sgr.CloseNurbsCurve();
}
return true;
}