Тема: Как замкнуть сплайн?

Есть сплайн. Хочу его замкнуть.
Потыкался, помыкался - не могу найти как поставить свойство isClosed? Кроме как в одном из конструкторов AcDbSplin - в котором надо впарить еще херову тучу данных.
Что такое массив knots?
С Уважением, Константин.

Re: Как замкнуть сплайн?

Я строю замкнутый сплайн через

AcDbSpline(
const AcGePoint3dArray& points,
int order = 4,
double fitTolerance = 0.0);

Первая и последняя точки в массиве points должны совпадать, тогда он закроется.
А тот навороченый конструктор мне тоже что-то не захотелось трогать :)

Re: Как замкнуть сплайн?

> KonstantinM
Функция, которая замыкает уже существующий сплайн. Замыкает аналогично тому, как это делает команда _SPLINEDIT _Close.
Если убрать проверку pSpline->hasFitData() - IMHO будет замыкать прямым участком.

  static Acad::ErrorStatus [b]MakeSplineClosed[/b](AcDbSpline *pSpline)
  {
    Acad::ErrorStatus es = Acad::eOk, esOpen = Acad::eOk;
    AcGePoint3dArray fitPoints;
    int degree;
    double fitTolerance;
    Adesk::Boolean tangentsExist;
    Adesk::Boolean tangentStartDef;
    Adesk::Boolean tangentEndDef;
    AcGeVector3d startTangent;
    AcGeVector3d endTangent;
    Adesk::Boolean rational;
    Adesk::Boolean closed;
    Adesk::Boolean periodic;
    AcGePoint3dArray controlPoints;
    AcGeDoubleArray knots;
    AcGeDoubleArray weights;
    double controlPtTol;
    double knotTol;
    AcGeNurbCurve3d *curv = NULL;
    if (pSpline->hasFitData()) {
      AcGeTol tol;
      if ((es = pSpline->getFitData(fitPoints,degree,fitTolerance,tangentsExist,startTangent,endTangent)) == Acad::eOk) {
        tangentStartDef = tangentsExist && (startTangent != AcGeVector3d::kIdentity);
        tangentEndDef   = tangentsExist && (endTangent   != AcGeVector3d::kIdentity);
        AcGeTol fitTol; fitTol.setEqualPoint(fitTolerance);
        curv = new AcGeNurbCurve3d(fitPoints,startTangent,endTangent,tangentStartDef,tangentEndDef,fitTol);
        curv->makeClosed();
        curv->getFitData(fitPoints,fitTol,tangentsExist,startTangent,endTangent);
        if ((esOpen = pSpline->upgradeOpen()) == Acad::eOk || (esOpen == Acad::eWasOpenForWrite)) {
          es = pSpline->setFitData(fitPoints,degree,fitTol.equalPoint(),startTangent,endTangent);
          if (esOpen != Acad::eWasOpenForWrite) pSpline->downgradeOpen();
        }
        delete curv;
      }
    } else {
      if ((es = pSpline->getNurbsData(degree,rational,closed,periodic,controlPoints,knots,weights,controlPtTol,knotTol)) == Acad::eOk) {
        if ((esOpen = pSpline->upgradeOpen()) == Acad::eOk || (esOpen == Acad::eWasOpenForWrite)) {
          es = pSpline->setNurbsData(degree,rational,Adesk::kTrue,periodic,controlPoints,knots,weights,controlPtTol,knotTol);
          if (esOpen != Acad::eWasOpenForWrite) pSpline->downgradeOpen();
        }
      }
    }
    return es;
  }

Re: Как замкнуть сплайн?

> Александр Ривилис
У меня истЪерика... Просто плачу тривиальности решения того как замкнуть сплайн...
Но все равно спасибо.

> Леонид
Я так и сделал - последние две точки одинаковые, но например при отрисовке эллипса сплайном - в точке разрыва глазом видно, что получается угол и даже первая производная рвется... Можно конечно увеличить кол-во вершин сплайна, но ведь на то он и сплайн чтоб интерполировать такие вещи и следить за непрерывностью производных до N-го порядка... Если сплайн замкнуть, то 4-го порядка хватает в большинстве случаев

Re: Как замкнуть сплайн?

И все таки!!!
что такое AcGeDoubleArray knots?!!
Я спать, мля, спокойно не могу без оного знания.

Re: Как замкнуть сплайн?

Тогда почитай на ночь глядя:
http://web.cs.wpi.edu/~matt/courses/cs5 … nurbs.html

Re: Как замкнуть сплайн?

Еще нашел такое странное поведение сплайна.
Получаю всю информацию по сплайну через getNurbsData(...)
После этого создаю (навороченным) конструктором куда всю эту информацию подставляю новый сплайн.
Должна получится копия. Так оно и есть. Копия получается за небольшим исключением - grip точки на оригинальном сплайне находятся там где я ставил контрольные точки при отрисовке сплайна, а в копии их в два раза больше и они расположены не на линии...
Вопрос - почему так - наверное задавать глуппо, но просто информация к размышлению о сплайнах.