乐筑天下

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

两条曲线间getClosestPointTo的精确性。

[复制链接]

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-7-23 10:04:57 | 显示全部楼层 |阅读模式
我创建了AcDb到AcGe和AcGe到AcDb的转换。
我使用此转换来获得两条曲线之间的最近点,
大多数曲线的结果是准确的,但对于样条曲线,有时会与真实点略有不同。
所以问题是:我如何才能得到确切的答案?
另一个问题是:如何准确地将AcDb2dPolyline2d(或AcDb3dPolyline)转换为AcGePolyline2d?AcDb3dPolyline->getSpline?主代码:
  1. // LINE
  2. AcGeLineSeg3d * AcDbCurveToAcGeCurve(const AcDbLine * pLine)
  3. {
  4.         return new AcGeLineSeg3d(pLine->startPoint(), pLine->endPoint());
  5. }
  6. AcDbLine * AcGeCurveToAcDbCurve(const AcGeLineSeg3d * pGe)
  7. {
  8.         return new AcDbLine(pGe->startPoint(),pGe->endPoint());
  9. }
  10. // ARC
  11. AcGeCircArc3d * AcDbCurveToAcGeCurve(const AcDbArc * pDbArc)
  12. {
  13.         return  new AcGeCircArc3d(
  14.                 pDbArc->center(),
  15.                 pDbArc->normal(),
  16.                 pDbArc->normal().perpVector(),
  17.                 pDbArc->radius(),
  18.                 pDbArc->startAngle(),
  19.                 pDbArc->endAngle());
  20. }
  21. AcDbCurve * AcGeCurveToAcDbCurve(const AcGeCircArc3d * pGe)
  22. {
  23.         if (pGe->isClosed() == Adesk::kTrue)
  24.         {
  25.                 return  new AcDbCircle(
  26.                         pGe->center(),
  27.                         pGe->normal(),
  28.                         pGe->radius());
  29.         }
  30.         else
  31.         {
  32.                 return  new AcDbArc(
  33.                         pGe->center(),
  34.                         pGe->normal(),
  35.                         pGe->radius(),
  36.                         pGe->startAng(),
  37.                         pGe->endAng());
  38.         }
  39. }
  40. // CIRCLE
  41. AcGeCircArc3d * AcDbCurveToAcGeCurve(const AcDbCircle * pDbCircle)
  42. {
  43.         return new AcGeCircArc3d(pDbCircle->center(),pDbCircle->normal(),pDbCircle->radius());
  44. }
  45. // ELLIPSE
  46. AcGeEllipArc3d * AcDbCurveToAcGeCurve(const AcDbEllipse * pDbEllise)
  47. {
  48.         return new AcGeEllipArc3d(
  49.                 pDbEllise->center(),
  50.                 pDbEllise->majorAxis(),
  51.                 pDbEllise->minorAxis(),
  52.                 pDbEllise->majorAxis().length(),
  53.                 pDbEllise->minorAxis().length(),
  54.                 pDbEllise->startAngle(),
  55.                 pDbEllise->endAngle());
  56. }
  57. AcDbEllipse * AcGeCurveToAcDbCurve(const AcGeEllipArc3d * pGe)
  58. {
  59.         return new AcDbEllipse(
  60.                 pGe->center(),
  61.                 pGe->normal(),
  62.                 pGe->majorAxis()*pGe->majorRadius(),
  63.                 pGe->minorRadius()/pGe->majorRadius(),
  64.                 pGe->startAng(),
  65.                 pGe->endAng());
  66. }
  67. // SPLINE
  68. AcGeNurbCurve3d * AcDbCurveToAcGeCurve(const AcDbSpline * pSpline)
  69. {
  70.         Acad::ErrorStatus es = Acad::eOk;
  71.         AcGePoint3dArray fitPoints;
  72.         int degree;
  73.         double fitTolerance;
  74.         Adesk::Boolean tangentsExist;
  75.         Adesk::Boolean tangentStartDef;
  76.         Adesk::Boolean tangentEndDef;
  77.         AcGeVector3d startTangent;
  78.         AcGeVector3d endTangent;
  79.         Adesk::Boolean rational;
  80.         Adesk::Boolean closed;
  81.         Adesk::Boolean periodic;
  82.         AcGePoint3dArray controlPoints;
  83.         AcGeDoubleArray knots;
  84.         AcGeDoubleArray weights;
  85.         double controlPtTol;
  86.         double knotTol;
  87.         closed = pSpline->isClosed();
  88.         AcGeNurbCurve3d *curv = NULL;
  89.         if (0)//(pSpline->hasFitData())
  90.         {
  91.                 AcGeTol tol;
  92.                 if ((es = pSpline->getFitData(fitPoints,degree,fitTolerance,tangentsExist,startTangent,endTangent)) == Acad::eOk)
  93.                 {
  94.                         tangentStartDef = tangentsExist; //&& (startTangent != AcGeVector3d::kIdentity);
  95.                         tangentEndDef   = tangentsExist; //&& (endTangent   != AcGeVector3d::kIdentity);
  96.                         AcGeTol fitTol;
  97.                         pSpline->fitTolerance();
  98.                         fitTol.setEqualPoint(fitTolerance);
  99.                         curv = new AcGeNurbCurve3d(fitPoints,startTangent,endTangent,tangentStartDef,tangentEndDef,fitTol);
  100.                         if (closed == Adesk::kTrue)
  101.                         {
  102.                                 curv->makeClosed();
  103.                         }
  104.                 }
  105.         }
  106.         else
  107.         {
  108.                 if ((es = pSpline->getNurbsData(degree,rational,closed,periodic,controlPoints,knots,weights,controlPtTol,knotTol)) == Acad::eOk)
  109.                 {
  110.                         if (rational==Adesk::kTrue)
  111.                         {
  112.                                 curv = new AcGeNurbCurve3d(degree,knots,controlPoints,weights,periodic);
  113.                         }
  114.                         else
  115.                         {
  116.                                 curv = new AcGeNurbCurve3d(degree,knots,controlPoints,periodic);
  117.                         }
  118.                         if (closed == Adesk::kTrue)
  119.                         {
  120.                                 curv->makeClosed();
  121.                         }
  122.                 }
  123.         }
  124.         return curv;
  125. }
  126. AcDbSpline * AcGeCurveToAcDbCurve(const AcGeNurbCurve3d * pGe)
  127. {
  128.         AcDbSpline *pSpline = NULL;
  129.         if (pGe->hasFitData())
  130.         {
  131.                 AcGePoint3dArray fitPoints;
  132.                 AcGeTol fitTolerance;
  133.                 Adesk::Boolean tangentsExist;
  134.                 AcGeVector3d startTangent;
  135.                 AcGeVector3d endTangent;
  136.                 double tol;
  137.                 pGe->getFitData(fitPoints,fitTolerance,tangentsExist,startTangent,endTangent);
  138.                 pSpline = new AcDbSpline(fitPoints,startTangent,endTangent,pGe->order(),fitTolerance.equalPoint());
  139.         }
  140.         else
  141.         {
  142.                 int degree;
  143.                 Adesk::Boolean rational;
  144.                 Adesk::Boolean periodic;
  145.                 AcGePoint3dArray controlPoints;
  146.                 AcGeKnotVector knots1;
  147.                 AcGeDoubleArray weights;
  148.                 pGe->getDefinitionData(degree,rational,periodic,knots1,controlPoints,weights);
  149.                 AcGeDoubleArray knots;
  150.                 for (int i = 0;inumKnots();i++)
  151.                 {
  152.                         knots.append(knots1[i]);
  153.                 }
  154.                 pSpline = new AcDbSpline(degree,rational,pGe->isClosed(),periodic,controlPoints,knots,weights,0.0,pGe->knots().tolerance());
  155.         }
  156.         return pSpline;
  157. }
  158. // POLYLINE
  159. AcGeCompositeCurve3d * AcDbCurveToAcGeCurve(const AcDbPolyline * pPoly)
  160. {
  161.         AcGeLineSeg3d *pLine = NULL;
  162.         AcGeCircArc3d *pArc = NULL;
  163.         AcGeVoidPointerArray GeCurves;
  164.         for( int i = 0; i numVerts(); i++ )
  165.         {
  166.                 if( pPoly->segType(i) == AcDbPolyline::kLine )
  167.                 {
  168.                         pLine = new AcGeLineSeg3d;
  169.                         pPoly->getLineSegAt(i, *pLine);
  170.                         GeCurves.append(pLine);
  171.                 }
  172.                 else if( pPoly->segType(i) == AcDbPolyline::kArc )
  173.                 {
  174.                         pArc = new AcGeCircArc3d;
  175.                         pPoly->getArcSegAt(i, *pArc);
  176.                         GeCurves.append(pArc);
  177.                 }
  178.         }
  179.         return  new AcGeCompositeCurve3d(GeCurves);
  180. }
  181. AcDbPolyline * AcGeCurveToAcDbCurve(const AcGeCompositeCurve3d * pGe)
  182. {  
  183.         AcGePoint3d startPnt,endPnt;
  184.         if( pGe->hasEndPoint(endPnt) == Adesk ::kFalse ||
  185.                 pGe->hasStartPoint(startPnt) == Adesk::kFalse)
  186.         {
  187.                 return NULL;
  188.         }
  189.         //get the plane of Curve3d
  190.         AcGePlane plane;
  191.         AcGeLine3d line;
  192.         AcGePoint3d p1,p2,p3;
  193.         if(pGe->isPlanar(plane))
  194.         {
  195.                 if(pGe->isLinear(line))    //Oh,it's a little tricky!
  196.                 {
  197.                         line.getPerpPlane(startPnt,plane);
  198.                         plane.get(p1,p2,p3);
  199.                         plane.set(p2,p3-p2);
  200.                 }
  201.                 plane.get(p1,p2,p3);
  202.         }
  203.         else
  204.         {
  205.                 return NULL;
  206.         }
  207.         //Creat a polyline
  208.         AcDbPolyline *pPoly = new AcDbPolyline();
  209.         AcGeVoidPointerArray curveList;
  210.         pGe->getCurveList(curveList);  //get all the segments
  211.         AcGeCurve3d *pCurve        = NULL;
  212.         AcGeCircArc3d *pArc        = NULL;
  213.         int i;
  214.         double b;
  215.         AcGePoint2d pt;
  216.         for(i = 0;i hasStartPoint(startPnt);
  217.                 pt = startPnt.convert2d(plane);
  218.                 if (pCurve->isKindOf(AcGe::kCircArc3d))
  219.                 {
  220.                         pArc = (AcGeCircArc3d *)(pCurve);
  221.                         b = tan(0.25*(pArc->endAng() - pArc->startAng()));
  222.                         if (pArc->normal().z addVertexAt(i,pt,-b);
  223.                         }
  224.                         else
  225.                         {
  226.                                 pPoly->addVertexAt(i,pt,b);
  227.                         }
  228.                 }
  229.                 else
  230.                 {
  231.                         pPoly->addVertexAt(i,pt);
  232.                 }
  233.         }
  234.         if(!pGe->isClosed())
  235.         {
  236.                 pt = endPnt.convert2d(plane);
  237.                 pPoly->addVertexAt(i,pt);
  238.         }
  239.         else
  240.         {
  241.                 pPoly->setClosed(Adesk::kTrue);
  242.         }
  243.         //the most important step;
  244.         AcGeMatrix3d xform;
  245.         AcGeVector3d XAxis = p1-p2;
  246.         AcGeVector3d YAxis = p3-p2;
  247.         AcGeVector3d ZAxis = XAxis.crossProduct(YAxis);
  248.         xform.setCoordSystem(p2,XAxis,YAxis,ZAxis);
  249.         pPoly->transformBy(xform);
  250.         return pPoly;
  251. }
  252. // POLYLINE3D
  253. AcGeCompositeCurve3d * AcDbCurveToAcGeCurve(const AcDb3dPolyline * pPoly3d)
  254. {
  255.         AcGeVoidPointerArray GeCurves;
  256.         AcGePoint3d pt1;
  257.         AcGePoint3d pt2;
  258.         double Param;
  259.         pPoly3d->getEndParam(Param);
  260.         AcGeLineSeg3d *pLine = NULL;
  261.         for (int i= 0; i getPointAtParam(i,pt1);
  262.                 pPoly3d->getPointAtParam(i+1,pt2);
  263.                 pLine = new AcGeLineSeg3d(pt1,pt2);
  264.                 GeCurves.append(pLine);
  265.         }
  266.         //AcDbSpline *pSpline= NULL;
  267.         //pPoly3d->getSpline(pSpline);
  268.         //CreateEntity(pSpline,1);
  269.         AcGeCompositeCurve3d * pGePoly3d = new AcGeCompositeCurve3d(GeCurves);
  270.         return pGePoly3d;
  271. }
  272. // POLYLINE2D
  273. AcGeCompositeCurve3d * AcDbCurveToAcGeCurve(const AcDb2dPolyline *pPoly2d)
  274. {
  275.         AcDb::Poly2dType type;
  276.         type=pPoly2d->polyType();
  277.         AcDbPolyline * pLwpoly = NULL;
  278.         Acad::ErrorStatus es;
  279.         AcGeCompositeCurve3d * pGeCurve = NULL;
  280.         if ((type==AcDb::k2dSimplePoly)||(type==AcDb::k2dFitCurvePoly))
  281.         {
  282.                 pLwpoly=new AcDbPolyline;
  283.                 es = pLwpoly->convertFrom((AcDbEntity *&)pPoly2d,Adesk::kFalse);
  284.                 if (es!=Acad::eOk)
  285.                 {
  286.                         delete pLwpoly;
  287.                         pLwpoly=NULL;
  288.                         return NULL;
  289.                 }
  290.                 pGeCurve = AcDbCurveToAcGeCurve(pLwpoly);
  291.                 pLwpoly->close();
  292.         }
  293.         else
  294.         {
  295.                 AcGeVoidPointerArray GeCurves;
  296.                 AcGePoint3d pt1;
  297.                 AcGePoint3d pt2;
  298.                 double Param;
  299.                 pPoly2d->getEndParam(Param);
  300.                 AcGeLineSeg3d *pLine = NULL;
  301.                 for (int i= 0; i getPointAtParam(i,pt1);
  302.                         pPoly2d->getPointAtParam(i+1,pt2);
  303.                         pLine = new AcGeLineSeg3d(pt1,pt2);
  304.                         GeCurves.append(pLine);
  305.                 }
  306.                 pGeCurve = new AcGeCompositeCurve3d(GeCurves);       
  307.         }
  308.         return pGeCurve;
  309. }
  310. // catch all for all other entity types.
  311. AcGeEntity3d * AcDbCurveToAcGeCurve(const AcDbEntity *pDbCurve)
  312. {       
  313.         if (pDbCurve == NULL)
  314.         {
  315.                 return NULL;
  316.         }
  317.         if (pDbCurve->isKindOf(AcDbLine::desc()))
  318.         {
  319.                 return AcDbCurveToAcGeCurve((AcDbLine *)pDbCurve);
  320.         }
  321.         if (pDbCurve->isKindOf(AcDbArc::desc()))
  322.         {
  323.                 return AcDbCurveToAcGeCurve((AcDbArc *)pDbCurve);
  324.         }
  325.         if (pDbCurve->isKindOf(AcDbCircle::desc()))
  326.         {
  327.                 return AcDbCurveToAcGeCurve((AcDbCircle *)pDbCurve);
  328.         }
  329.         if (pDbCurve->isKindOf(AcDbEllipse::desc()))
  330.         {
  331.                 return AcDbCurveToAcGeCurve((AcDbEllipse *)pDbCurve);
  332.         }
  333.         if (pDbCurve->isKindOf(AcDbSpline::desc()))
  334.         {
  335.                 return AcDbCurveToAcGeCurve((AcDbSpline *)pDbCurve);
  336.         }
  337.         if (pDbCurve->isKindOf(AcDbPolyline::desc()))
  338.         {
  339.                 return AcDbCurveToAcGeCurve((AcDbPolyline *)pDbCurve);
  340.         }
  341.         if (pDbCurve->isKindOf(AcDb3dPolyline::desc()))
  342.         {
  343.                 return AcDbCurveToAcGeCurve((AcDb3dPolyline *)pDbCurve);
  344.         }
  345.         if (pDbCurve->isKindOf(AcDb2dPolyline::desc()))
  346.         {
  347.                 return AcDbCurveToAcGeCurve((AcDb2dPolyline *)pDbCurve);
  348.         }
  349.         return NULL;
  350. }
  351. AcDbEntity * AcGeCurveToAcDbCurve(const AcGeCurve3d * pGe)
  352. {
  353.         if (pGe->isKindOf(AcGe::kCircArc3d))
  354.         {
  355.                 return AcGeCurveToAcDbCurve((AcGeCircArc3d *) pGe);
  356.         }
  357.         if (pGe->isKindOf(AcGe::kEllipArc3d))
  358.         {
  359.                 return AcGeCurveToAcDbCurve((AcGeEllipArc3d *) pGe);
  360.         }
  361.         if (pGe->isKindOf(AcGe::kLineSeg3d))
  362.         {
  363.                 return AcGeCurveToAcDbCurve((AcGeLineSeg3d *) pGe);
  364.         }
  365.         if (pGe->isKindOf(AcGe::kNurbCurve3d))
  366.         {
  367.                 return AcGeCurveToAcDbCurve((AcGeNurbCurve3d *) pGe);
  368.         }
  369.         if (pGe->isKindOf(AcGe::kCompositeCrv3d))
  370.         {
  371.                 return AcGeCurveToAcDbCurve((AcGeCompositeCurve3d*) pGe);
  372.         }
  373.         return NULL;
  374. }


1sbrhzsr3py.gif

1sbrhzsr3py.gif

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复

sxzlrta3vkp.gif

sxzlrta3vkp.gif
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-7-23 10:12:55 | 显示全部楼层
Alexander Rivilis,Gile,感谢您的代码和想法。
任何建议或错误发现欢迎和感谢。
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2010-7-23 10:35:29 | 显示全部楼层
从视觉上看,您的动画看起来是正确的。实际点和计算点之间有多大差异? 你是怎么走到这一步的?
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-7-23 11:32:12 | 显示全部楼层
有时这是错误的
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2010-7-23 18:57:09 | 显示全部楼层
有时它是错误的

好吧,所以有时它是错误的。查看代码,有很多,2个实体选择,其中一个可以是样条的组合。哪个实体组合不起作用?样条-样条,样条-弧等?此外,对于样条,有曲线拟合或苗圃。哪一个搞砸了,或者两者兼而有之?制作一个图表,显示成功和失败的实体组合,发布它,这将有助于任何测试人员。在图表中也包括两种不同类型的样条的通过/失败测试。问题与2d和3d实体类型相关,还是仅与一种特定类型相关。提供测试人员可以使用的绘图文件。告诉我们您怀疑哪个代码区域有问题。
我们这里只有少数人知道ARX,而那些可能在头脑中就知道样条特定答案的人,都在Autolisp论坛中。要获得尽可能多的帮助,请从上面的列表开始提供尽可能多的详细信息。
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2010-7-23 21:38:10 | 显示全部楼层
在玩了大约一个小时后,终于找到了答案
  1. AcGeNurbCurve3d * AcDbCurveToAcGeCurve(const AcDbSpline * pSpline)
  2. {
  3.     AcGeNurbCurve3d *curv = NULL;
  4.     if (pSpline->hasFitData())
  5.     {
  6.         BOOL bIsRational, bIsPeriodic, bIsClosed;
  7.         AcGeDoubleArray knots;
  8.         AcGePoint3dArray controlPoints;
  9.         AcGeDoubleArray weights;
  10.         double controlPtTol, knotTol;
  11.         int nDegree;
  12.         pSpline->getNurbsData(nDegree, bIsRational, bIsClosed, bIsPeriodic, controlPoints, knots, weights, controlPtTol, knotTol);
  13.         if(weights.length())
  14.             curv = new AcGeNurbCurve3d(nDegree, knots, controlPoints, weights, bIsPeriodic);
  15.         else
  16.             curv = new AcGeNurbCurve3d(nDegree, knots, controlPoints, bIsPeriodic);
  17.         bIsClosed ? curv->makeClosed() : curv->makeOpen();
  18.     }
  19.     return curv;
  20. }

基本上,您没有从原始样条曲线检索所有nurb数据,并且使用了错误的AcGeNurbCurve3d构造函数
因此,新样条曲线与旧样条曲线的几何图形不同
以下是ARX文档对您使用的构造函数的描述。
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-7-23 22:45:58 | 显示全部楼层
非常感谢,pkohut。
注意:
虽然用“getNurbsData”是对的,但是看数据:
阶数:4
特性:平面,非有理,非周期
参数范围:起点0.0000端点1203.6780控制点数目:7
控制点:X = 1747.8226,Y = 840.1270,Z = 0.0000 X = 1883.3499,Y = 833.2746,Z = 0.0000 X = 2159.7191,Y = 819.3010,Z = 0.0000 X = 2054.1012,Y = 1336.1513
另一个
在折线的构造中有一个错误
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2010-7-23 23:20:07 | 显示全部楼层

抱歉,我对婴儿床一无所知,它们是如何制作的,一无所知。
得走了,孩子们周末在这里。
回复

使用道具 举报

LE3

10

主题

149

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
189
发表于 2010-7-24 00:30:40 | 显示全部楼层
看看这是否有帮助:
  1.         int degree;
  2.         Adesk::Boolean rational;
  3.         Adesk::Boolean closed;
  4.         Adesk::Boolean periodic;
  5.         AcGePoint3dArray controlPoints;
  6.         AcGeDoubleArray knots;
  7.         AcGeDoubleArray weights;
  8.         double controlPtTol;
  9.         double knotTol;
  10.         AcGeTol tol;
  11.         es=pSpline->getNurbsData(degree,rational,closed,periodic,controlPoints,knots,weights,controlPtTol,knotTol);
  12.         if (es!=Acad::eOk)
  13.                 return Acad::eNotImplemented;
  14.         if (rational==Adesk::kTrue)
  15.         {
  16.                 acutPrintf(_T("\n*** Spline is Rational. "));
  17.                 AcGeNurbCurve3d *pNurb=new AcGeNurbCurve3d(degree,knots,controlPoints,weights,periodic);
  18.                 if (closed==Adesk::kTrue)
  19.                         pNurb->makeClosed();
  20.                 if (pSpline->hasFitData()==Adesk::kTrue)
  21.                 {
  22.                         AcGePoint3dArray fitPoints;
  23.                         double fitTolerance;
  24.                         Adesk::Boolean tangentsExist;
  25.                         AcGeVector3d startTangent;
  26.                         AcGeVector3d endTangent;
  27.                         pSpline->getFitData(fitPoints,degree,fitTolerance,tangentsExist,startTangent,endTangent);
  28.                         tol.setEqualPoint(fitTolerance);
  29.                         if (tangentsExist==Adesk::kTrue)
  30.                                 pNurb->setFitData(fitPoints,startTangent,endTangent,tol);
  31.                         else
  32.                                 pNurb->setFitData(degree,fitPoints,tol);
  33.                 }
  34.                 pGeCurve = (AcGeCurve3d *)pNurb;
  35.         }
  36.         else
  37.         {
  38.                 acutPrintf(_T("\n*** Spline is Periodic. "));
  39.                 AcGeNurbCurve3d *pNurb=new AcGeNurbCurve3d(degree,knots,controlPoints,periodic);
  40.                 if (closed==Adesk::kTrue)
  41.                         pNurb->makeClosed();
  42.                 if (pSpline->hasFitData()==Adesk::kTrue)
  43.                 {
  44.                         AcGePoint3dArray fitPoints;
  45.                         double fitTolerance;
  46.                         Adesk::Boolean tangentsExist;
  47.                         AcGeVector3d startTangent;
  48.                         AcGeVector3d endTangent;
  49.                         pSpline->getFitData(fitPoints,degree,fitTolerance,tangentsExist,startTangent,endTangent);
  50.                         tol.setEqualPoint(fitTolerance);
  51.                         if (tangentsExist==Adesk::kTrue)
  52.                                 pNurb->setFitData(fitPoints,startTangent,endTangent,tol);
  53.                         else
  54.                                 pNurb->setFitData(degree,fitPoints,tol);
  55.                 }
  56.                 pGeCurve = (AcGeCurve3d *)pNurb;
  57.         }

回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2010-7-24 02:35:47 | 显示全部楼层
这可能会起作用Luis。乍一看,
if(pSpline->hasFitData()==Adesk::kTrue){...}
是重复代码并不明显,这使得函数看起来比实际更复杂。收紧要好得多。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-5 20:04 , Processed in 0.171372 second(s), 75 queries .

© 2020-2025 乐筑天下

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