明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2001|回复: 2

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

[复制链接]
发表于 2003-2-5 03:03 | 显示全部楼层 |阅读模式
正在编制一NURBS曲线实现程序,与画圆一样编制程序,却不能成功,请各位大虾帮忙!程序如下:
void Test()
{
        AcDbBlockTable *pBlockTable;
        AcGeKnotVector cKnot;
        AcGeDoubleArray cWeight;
        AcGePoint3dArray ctrlPt;
        double knots[3]={0, 0.5, 1.0};
    cKnot.setLogicalLength(3);
        cWeight.setLogicalLength(3);
        ctrlPt.setLogicalLength(3);
        cKnot.set(1, knots, 1.0e-9);
        cWeight[0]=1.0;
        cWeight[1]=2.0;
        cWeight[2]=1.0;
    ctrlPt[0].set(0, 0, 0.0);
    ctrlPt[1].set(100, 100, 0.0);
    ctrlPt[2].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 | 显示全部楼层

节点和控制点设置可能有问题?

本帖最后由 作者 于 2003-5-10 17:17:39 编辑

按《CAGD&NURBS》

如果想得到k次nurbs样条,
控制点数为n时,
节点数为n+k+1,且一般设置前后两端分别有k+1个节点相等
这样使得得到的样条曲线首尾端点通过两端控制点。

不知道objectarx中是如何定义的,你研究一下再试一试,

建议多定义几个控制点和节点,起码三个节点肯定是不行的[个人意见]

以后多联系,多讨论

你试一试

不行的话,我们再来讨论
发表于 2003-5-20 12:29 | 显示全部楼层

自定义实体实现

你可以自定义一个数据库实体类
class AcDbNurbsCurve3D:public AcDbEntity


重载其worldDraw(AcGiWorldDraw* mode)函数如下

{
        AcGeKnotVector cKnot;
        AcGeDoubleArray cWeight;
        AcGePoint3dArray ctrlPt;
        double knots[9]={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[0]=1.0;
        cWeight[1]=2.0;
        cWeight[2]=1.0;
        cWeight[3]=1.0;
        cWeight[4]=1.0;
    ctrlPt[0].set(0, 0, 0.0);
    ctrlPt[1].set(50, 50, 0.0);
    ctrlPt[2].set(100, 20, 0.0);
    ctrlPt[3].set(150, 70, 0.0);
    ctrlPt[4].set(200, 0, 0.0);
       
        AcGeNurbCurve3d *pConic = new AcGeNurbCurve3d(3, cKnot, ctrlPt, cWeight, false);


/*
        AcGePoint3dArray fitPt;
        fitPt.setLogicalLength(5);
    fitPt[0].set(0, 0, 0.0);
    fitPt[1].set(50, 50, 0.0);
    fitPt[2].set(100, 20, 0.0);
    fitPt[3].set(150, 70, 0.0);
    fitPt[4].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);


}


然后创建该自定义类的一个实例,加入数据库中,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-17 16:18 , Processed in 0.169200 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表