eCaos 发表于 2003-2-5 03:03:00

急!!!如何实现ARX的NURBS曲线实体

正在编制一NURBS曲线实现程序,与画圆一样编制程序,却不能成功,请各位大虾帮忙!程序如下:
void Test()
{
      AcDbBlockTable *pBlockTable;
      AcGeKnotVector cKnot;
      AcGeDoubleArray cWeight;
      AcGePoint3dArray ctrlPt;
      double knots={0, 0.5, 1.0};
    cKnot.setLogicalLength(3);
      cWeight.setLogicalLength(3);
      ctrlPt.setLogicalLength(3);
      cKnot.set(1, knots, 1.0e-9);
      cWeight=1.0;
      cWeight=2.0;
      cWeight=1.0;
    ctrlPt.set(0, 0, 0.0);
    ctrlPt.set(100, 100, 0.0);
    ctrlPt.set(120, 25, 0.0);
      AcGeNurbCurve3d *pConic = new AcGeNurbCurve3d(2, cKnot, ctrlPt, cWeight, false);
      acdbHostApplicationServices()->workingDatabase()
      ->getSymbolTable(pBlockTable, AcDb::kForRead);
      AcDbBlockTableRecord *pBlockTableRecord;
      pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
      pBlockTable->close();
      AcDbObjectId conicId;
      pBlockTableRecord->appendAcDbEntity(conicId,pConic);
      pBlockTableRecord->close();
      pConic->close();
}
如果有结果请与我联系(caoxf2000@263.net),先谢!

arbyao 发表于 2003-5-10 17:17:00


按《CAGD&NURBS》
如果想得到k次nurbs样条,
控制点数为n时,
节点数为n+k+1,且一般设置前后两端分别有k+1个节点相等
这样使得得到的样条曲线首尾端点通过两端控制点。
不知道objectarx中是如何定义的,你研究一下再试一试,
建议多定义几个控制点和节点,起码三个节点肯定是不行的[个人意见]
以后多联系,多讨论
你试一试
不行的话,我们再来讨论

arbyao 发表于 2003-5-20 12:29:00

你可以自定义一个数据库实体类
class AcDbNurbsCurve3D:public AcDbEntity
重载其worldDraw(AcGiWorldDraw* mode)函数如下
{
      AcGeKnotVector cKnot;
      AcGeDoubleArray cWeight;
      AcGePoint3dArray ctrlPt;
      double knots={0, 0, 0, 0, 0.5, 1.0, 1.0, 1.0, 1.0};
    cKnot.setLogicalLength(9);
      cWeight.setLogicalLength(5);
      ctrlPt.setLogicalLength(5);
      cKnot.set(9, knots, 1.0e-3);
      cWeight=1.0;
      cWeight=2.0;
      cWeight=1.0;
      cWeight=1.0;
      cWeight=1.0;
    ctrlPt.set(0, 0, 0.0);
    ctrlPt.set(50, 50, 0.0);
    ctrlPt.set(100, 20, 0.0);
    ctrlPt.set(150, 70, 0.0);
    ctrlPt.set(200, 0, 0.0);
      
      AcGeNurbCurve3d *pConic = new AcGeNurbCurve3d(3, cKnot, ctrlPt, cWeight, false);
/*
      AcGePoint3dArray fitPt;
      fitPt.setLogicalLength(5);
    fitPt.set(0, 0, 0.0);
    fitPt.set(50, 50, 0.0);
    fitPt.set(100, 20, 0.0);
    fitPt.set(150, 70, 0.0);
    fitPt.set(200, 0, 0.0);
      AcGeNurbCurve3d *pConic = new AcGeNurbCurve3d(fitPt,
                AcGeVector3d(0,0,0),AcGeVector3d(0,0,0),Adesk::kFalse,Adesk::kFalse);
*/
      double param, startParam, endParam, step;
      AcGePoint3dArray pVertex;
      startParam = pConic->startParam();
      endParam = pConic->endParam();
      step = (endParam-startParam)/50;
      for(param=startParam; (endParam-param)>-1e-3; param=param+step)
      {
                pVertex.append(pConic->evalPoint(param)) ;      
      }
      mode->geometry().polyline(pVertex.logicalLength(),pVertex.asArrayPtr());
//      mode->geometry().polyline(fitPt.logicalLength(),fitPt.asArrayPtr());
      mode->geometry().polyline(ctrlPt.logicalLength(),ctrlPt.asArrayPtr());
      return AcDbEntity::worldDraw(mode);
}
然后创建该自定义类的一个实例,加入数据库中,
页: [1]
查看完整版本: 急!!!如何实现ARX的NURBS曲线实体