NURBS-поверхность
NURBS-поверхность формируется последовательностью вызовов: открыть (StartNurbsSurface), задать узлы по U и V, контрольные точки и веса в сетке i×j, закрыть (CloseNurbsSurface или CloseNurbsSurfaceB).
StartNurbsSurface(ID: string; K1, K2, UDegree, VDegree: integer; UClosed, VClosed, UPeriodic, VPeriodic, Rational: boolean) — начать формирование NURBS-поверхности.
ID— идентификатор сущности;K1— показатель числа контрольных точек по U:K1 = UKnotCount − UDegree − 2;K2— показатель числа контрольных точек по V:K2 = VKnotCount − VDegree − 2;UDegree,VDegree— степени по U и V;UClosed,VClosed— признаки замкнутости по U и V;UPeriodic,VPeriodic— признаки периодичности по U и V;Rational— признак рациональности.
SetNurbsSurfaceUKnot(i: integer; Value: STFloat) — задать U-узел.
i— номер узла;Value— значение узла.
SetNurbsSurfaceVKnot(i: integer; Value: STFloat) — задать V-узел.
i— номер узла;Value— значение узла.
SetNurbsSurfaceControlPoint(i, j: integer; P: TST3DPoint) — задать контрольную точку в сетке.
i,j— позиция контрольной точки в сетке;P— координаты точки.
SetNurbsSurfaceWeight(i, j: integer; Value: STFloat) — задать вес контрольной точки.
i,j— позиция контрольной точки в сетке;Value— вес.
CloseNurbsSurface() — завершить формирование поверхности.
CloseNurbsSurfaceB(UMin, UMax, VMin, VMax: STFloat) — завершить формирование с явным заданием диапазонов параметров.
UMin,UMax— границы параметра по U;VMin,VMax— границы параметра по V.
Пример импорта NURBS-поверхности.
// Параметры NURBS-поверхности CAD-системы
class CADNurbsSurfParam
{
public int UDegree, VDegree; // степени по U и V
public bool UClosed, VClosed; // замкнутость по U и V
public bool UPeriodic, VPeriodic; // периодичность по U и V
public bool Rational; // рациональность
public double[] UKnots, VKnots; // полные узловые векторы по U и V
public CADPoint[,] ControlPoints; // сетка контрольных точек
public double[,] Weights; // веса (по одному на контрольную точку)
}
bool SaveNurbsSurface(string id, CADNurbsSurfParam param)
{
// показатели числа контрольных точек: K = KnotCount - Degree - 2
int k1 = param.UKnots.Length - param.UDegree - 2;
int k2 = param.VKnots.Length - param.VDegree - 2;
sgr.StartNurbsSurface(id, k1, k2, param.UDegree, param.VDegree,
param.UClosed, param.VClosed, param.UPeriodic, param.VPeriodic, param.Rational);
try
{
// узловые векторы по U и V
for (int i = 0; i < param.UKnots.Length; i++)
sgr.SetNurbsSurfaceUKnot(i, param.UKnots[i]);
for (int i = 0; i < param.VKnots.Length; i++)
sgr.SetNurbsSurfaceVKnot(i, param.VKnots[i]);
// контрольные точки и веса в сетке (k1+1) × (k2+1)
for (int i = 0; i <= k1; i++)
for (int j = 0; j <= k2; j++)
{
double w = param.Weights[i, j];
TST3DPoint p = ToPoint(param.ControlPoints[i, j]);
// для рациональной поверхности — в однородном виде (× вес)
if (param.Rational)
{
p.X *= w;
p.Y *= w;
p.Z *= w;
}
sgr.SetNurbsSurfaceWeight(i, j, w);
sgr.SetNurbsSurfaceControlPoint(i, j, p);
}
}
finally
{
sgr.CloseNurbsSurface();
}
return true;
}