绘制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);}
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);}
里面是不是应该return啊?否则一直递归下去?
{
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);
}