急!!!如何实现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),先谢!
节点和控制点设置可能有问题?
本帖最后由 作者 于 2003-5-10 17:17:39 编辑按《CAGD&NURBS》
如果想得到k次nurbs样条,
控制点数为n时,
节点数为n+k+1,且一般设置前后两端分别有k+1个节点相等
这样使得得到的样条曲线首尾端点通过两端控制点。
不知道objectarx中是如何定义的,你研究一下再试一试,
建议多定义几个控制点和节点,起码三个节点肯定是不行的[个人意见]
以后多联系,多讨论
你试一试
不行的话,我们再来讨论
自定义实体实现
你可以自定义一个数据库实体类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]