乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 42|回复: 2

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

[复制链接]

2

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
11
发表于 2003-2-5 03:03:00 | 显示全部楼层 |阅读模式
正在编制一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),先谢!
回复

使用道具 举报

12

主题

45

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
93
发表于 2003-5-10 17:17:00 | 显示全部楼层

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

使用道具 举报

12

主题

45

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
93
发表于 2003-5-20 12:29:00 | 显示全部楼层
你可以自定义一个数据库实体类
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);
}
然后创建该自定义类的一个实例,加入数据库中,
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 09:09 , Processed in 0.159690 second(s), 58 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表