acdbSpline变acdbPolyline的函数

bool CCovertSpline::getSplineSamplePoints(AcDbSpline *&spline, AcGePoint3dArray &pnts)
{
 assert(spline != NULL);

 double dbStartParam,dbEndParam;
 if (Acad::eOk != spline->getStartParam(dbStartParam) || Acad::eOk != spline->getEndParam(dbEndParam))
 {
  return false;
 }
 double dStep=m_nImitateMinLenth;
 double dLen1 = 0.0;
 double dLen2 = 0.0;
 double dlength = 0.0;
 spline->getDistAtParam(dbStartParam,dLen1);
 spline->getDistAtParam(dbEndParam,dLen2);
 dlength = dLen2 - dLen1;

 double dPreDis = 0.0;
 
 double dMidDis = 0.0;
 AcGePoint3d pnt;
 AcGePoint3d predpnt,nextpnt,midPnt;
 spline->getStartPoint(pnt);
 pnts.append(pnt);
 predpnt = pnt;
 if (dlength <0.26)
 {
  dStep /= 2;
  while (dStep > dlength && dStep > 0.001)
  {
   dStep /= 2;
  }
 }
 double dNextDis = dStep;
 do
 {
  /*
  *calculate a next point on segment 
  */
  bool bFind = false;
  while (dPreDis < dNextDis && (dNextDis < dlength))
  {
   dMidDis = (dPreDis + dNextDis) / 2;
   // get the next step point
   Acad::ErrorStatus es;
   es = spline->getPointAtDist(dMidDis,midPnt);
   es = spline->getPointAtDist(dNextDis,nextpnt);
   
   assert(midPnt != nextpnt);
   assert(nextpnt != predpnt);
   assert(predpnt != midPnt);
   AcGeVector2d v1 = AcGePoint2d(midPnt.x,midPnt.y)-AcGePoint2d(predpnt.x,predpnt.y);
   AcGeVector2d v2 = AcGePoint2d(nextpnt.x,nextpnt.y)-AcGePoint2d(predpnt.x,predpnt.y);
   // the bulge less than 0.002
   double dBules = tan(v1.angleTo(v2));
   if(dBules > 0.004 )
   {
    if (dNextDis - dPreDis <0.01)
    {
     break;
    }
    dNextDis -= (dNextDis-dMidDis)/2;
   
   }
   else if(dBules < 0.002)
   {
    if (dlength - dNextDis  <0.001)
    {
     break;
    }
    dNextDis += (dNextDis-dMidDis)/2;
    
   }
   else
   {
    break;
   }
   assert(dNextDis > dPreDis);
  }
  dPreDis = dNextDis;
  predpnt = nextpnt;
  pnts.append(midPnt);
  pnts.append(predpnt);
  if(dNextDis + dStep > dlength && dStep > 0.007)
  {
   dStep /=2;
  }
  dNextDis += dStep; 
 } while(dNextDis spline->getDistAtPoint(pnts.last(),dMidDis);
 spline->getPointAtDist((dMidDis+dlength)/2,midPnt);
 pnts.append(midPnt);
 //AcDbCircle *pc = new AcDbCircle;
 //pc->setCenter(midPnt);
 //pc->setColorIndex(1);
 //pc->setRadius(0.5);
 //AddToModelSpace(pc);
 //pc->close();
 spline->getEndPoint(pnt);
 pnts.append(pnt);
 
 return (pnts.length() > 2);
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12560256/viewspace-607223/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12560256/viewspace-607223/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值