绘制koch线中出现Stack Overflow,但是把一样的算法放到tc2.0就没有问题,为什么呢
void CKochView::OnDraw(CDC* pDC)
{
CKochDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
    int index=pDoc->m_index;                          //递归阶数
double dtor=3.1415926/180,th;               //th为直线的角度       
len=sqrt((m_placedown.x-m_placeup.x)*(m_placedown.x-m_placeup.x)+(m_placedown.y-m_placeup.y)*(m_placedown.y-m_placeup.y));          
         //len为直线长度,m_placedown,m_placeup 分别为cpoint类的鼠标落下点和放开点
        th=atan2(m_placedown.y-m_placeup.y,m_placedown.x-m_placeup.x);
koch(index,pDC);//定义的递归函数,绘制koch线

}
void CKochView::koch(int n, CDC *pDc)
{         double d;
 
   d=pow(len/3,n);
   if (n==0)
   {pDc->MoveTo(m_kp);
 m_kp.x+=long(d*cos(th*dtor));
    m_kp.y+=long(d*sin(th*dtor));
  pDc->LineTo(m_kp);
   }
 koch(n-1,pDc);
 th+=60;
 koch(n-1,pDc);
   th+=-120;
   koch(n-1,pDc);
   th+=60;
   koch(n-1,pDc);}

解决方案 »

  1.   

    漏了一句,加在ondraw里面,m_kp=m_placedown;但是没什么影响,还是Stack Overflow
      

  2.   

     if (n==0)
    里面是不是应该return啊?否则一直递归下去?
      

  3.   

    改成这样就合理了。void CKochView::koch(int n, CDC *pDc)
    {
    if (n <= 0)
    {
    return;
    }
    double d = pow(len / 3.0, n); m_kp.x += long(d * cos(th * dtor));
    m_kp.y += long(d * sin(th * dtor));
    pDc->LineTo(m_kp); koch(n - 1, pDc);
    th += 60;
    koch(n - 1, pDc);
    th -= 120;
    koch(n - 1, pDc);
    th += 60;
    koch(n - 1, pDc);
    }
      

  4.   

    改成这样Stack Overflow是没有了,但是单步运行时,n在-1和0之间跳动,当设置n=5时,函数里面都n没有以1,2,3,4出现过
      

  5.   

    koch怎么没有出口条件呢,那不是无穷递归了?