主题:Bresenham算法的一个问题
void CWelcomeView::Bresenham()
{
float dx,dy,xs,ys,x,y,d;
x=x0;y=y0;
dx=x1-x0;dy=y1-y0;
if (dy<0)
{
xs=x0;ys=y0;x0=x1;y0=y1;
x1=xs;y1=ys;dx=-dx;dy=-dy;
}
if(jdz(dx)>=dy)
d=2*dy-jdz(dx);
else
d=2*jdz(dx)-dy;
glPointSize(5.0);
glColor3f(1,0,0);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glColor3f(1,1,1);
if(jdz(dy/dx)<1)
{
while(x<jdz(x1))
{
if(d>=0)
{
x=x+sign(dx);y++;
if(jdz(dx)>=dy) d+=2*dy-2*jdz(dx);
else d+=2*jdz(dx)-2*dy;
}
else
{
if(jdz(dx)>=dy)
{
x=x+sign(dx);
d+=2*dy;
}
else
{
y++;d+=2*jdz(dx);
}
}
glPointSize(5.0);
glColor3f(1,0,0);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glColor3f(1,1,1);
}
}
else
{
while(y<jdz(y1))
{
if(d>=0)
{
x=x+sign(dx);y++;
if(jdz(dx)>=dy) d+=2*dy-2*jdz(dx);
else d+=2*jdz(dx)-2*dy;
}
else
{
if(jdz(dx)>=dy)
{
x=x+sign(dx);
d+=2*dy;
}
else
{
y++;d+=2*jdz(dx);
}
}
glPointSize(5.0);
glColor3f(1,0,0);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glColor3f(1,1,1);
}
}
}
float CWelcomeView::jdz(float t)
{
if(t>=0) return t ;
else return -t;
}
float CWelcomeView::sign(float s)
{
if(s>0) return 1;
else if(s<0) return -1;
else return 0;
}
float CWelcomeView::zdz(float k, float l)
{
if(k>l) return k;
else return l;
}
//算法有缺陷,但是查不出原因,郁闷
{
float dx,dy,xs,ys,x,y,d;
x=x0;y=y0;
dx=x1-x0;dy=y1-y0;
if (dy<0)
{
xs=x0;ys=y0;x0=x1;y0=y1;
x1=xs;y1=ys;dx=-dx;dy=-dy;
}
if(jdz(dx)>=dy)
d=2*dy-jdz(dx);
else
d=2*jdz(dx)-dy;
glPointSize(5.0);
glColor3f(1,0,0);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glColor3f(1,1,1);
if(jdz(dy/dx)<1)
{
while(x<jdz(x1))
{
if(d>=0)
{
x=x+sign(dx);y++;
if(jdz(dx)>=dy) d+=2*dy-2*jdz(dx);
else d+=2*jdz(dx)-2*dy;
}
else
{
if(jdz(dx)>=dy)
{
x=x+sign(dx);
d+=2*dy;
}
else
{
y++;d+=2*jdz(dx);
}
}
glPointSize(5.0);
glColor3f(1,0,0);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glColor3f(1,1,1);
}
}
else
{
while(y<jdz(y1))
{
if(d>=0)
{
x=x+sign(dx);y++;
if(jdz(dx)>=dy) d+=2*dy-2*jdz(dx);
else d+=2*jdz(dx)-2*dy;
}
else
{
if(jdz(dx)>=dy)
{
x=x+sign(dx);
d+=2*dy;
}
else
{
y++;d+=2*jdz(dx);
}
}
glPointSize(5.0);
glColor3f(1,0,0);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glColor3f(1,1,1);
}
}
}
float CWelcomeView::jdz(float t)
{
if(t>=0) return t ;
else return -t;
}
float CWelcomeView::sign(float s)
{
if(s>0) return 1;
else if(s<0) return -1;
else return 0;
}
float CWelcomeView::zdz(float k, float l)
{
if(k>l) return k;
else return l;
}
//算法有缺陷,但是查不出原因,郁闷