`
nathan09
  • 浏览: 144788 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

直线生成算法

 
阅读更多
voidCDrawLinesView::MenuDdaline()
...{
CDC
*pDC=GetDC();

intxa=m_pnt1.x,ya=m_pnt1.y,xb=m_pnt2.x,yb=m_pnt2.y,c=RGB(255,0,0);

floatx,y;
floatdx,dy,k;
dx
=(float)(xb-xa);
dy
=(float)(yb-ya);
k
=dy/dx;
y
=ya;
x
=xa;
if(abs(k)<1)
...{
if(xa<=xb)...{
for(x=xa;x<=xb;++x)
...{
pDC
->SetPixel((int)x,int(y+0.5),c);
y
+=k;
}

}

elseif(xa>xb)
...{
for(x=xa;x>=xb;--x)
...{
pDC
->SetPixel((int)x,int(y+0.5),c);
y
-=k;
}

}

}

if(abs(k)>=1)
...{
if(ya<=yb)...{
for(y=ya;y<=yb;++y)
...{
pDC
->SetPixel(int(x+0.5),(int)y,c);
x
+=1/k;
}

}

elseif(ya>yb)
...{
for(y=ya;y>=yb;--y)
...{
pDC
->SetPixel(int(x+0.5),(int)y,c);
x
-=1/k;
}

}

}

ReleaseDC(pDC);
}



voidCDrawLinesView::MenuMindlepoint()
...{
CDC
*dc=GetDC();

intx0=m_pnt1.x,y0=m_pnt1.y,x1=m_pnt2.x,y1=m_pnt2.y,color=RGB(0,255,0);

intdx,dy,nexte,nextne,d,x,t,y;
floatm;
dx
=x1-x0;
dy
=y1-y0;
m
=1.0*dy/dx;//¼ÆËãбÂÊ£¬²¢ÒÀ¾Ý´Ë½øÐÐÅжÏ
if(m<=1&&m>=0)
...{
if(x0>=x1)
...{
swap(x0,x1);
swap(y0,y1);
dx
=-dx;dy=-dy;//½»»»×ø±êºódx,dy±äΪÏà·´µÄÊý
}

x
=x0;y=y0;
d
=dx-2*dy;//d0
nexte=-2*dy;//ÏÂÒ»¸ö×ø±ê¾àÀëÇ°Ò»¸ö×ø±êµÄÆ«ÒÆ
nextne=-2*dy+2*dx;
while(x<x1)
...{
if(d>0)
d
+=nexte;
else
...{
d
+=nextne;
y
++;
}

x
++;
dc
->SetPixel(x,y,color);
}

}

elseif(m>=-1&&m<0)
...{
if(x0>=x1)
...{
swap(x0,x1);
swap(y0,y1);
dx
=-dx;dy=-dy;
}

x
=x0;y=y0;
d
=-dx-2*dy;//d0
nexte=-2*dy;
nextne
=-2*dy-2*dx;
while(x<x1)
...{
if(d>0)
...{
d
+=nextne;
y
--;
}

else
d
+=nexte;
x
++;
dc
->SetPixel(x,y,color);
}

}

elseif(m>1)
...{
if(y0>=y1)
...{
swap(x0,x1);
swap(y0,y1);
dy
=-dy;dx=-dx;
}

x
=x0;
y
=y0;
d
=-dy+2*dx;//d0
nexte=2*dx;
nextne
=-2*dy+2*dx;
while(y<y1)
...{
if(d>0)
...{
d
+=nextne;
x
++;
}

else
d
+=nexte;
y
++;
dc
->SetPixel(x,y,color);
}

}

elseif(m<-1)
...{
if(y0>=y1)
...{
swap(x0,x1);
swap(y0,y1);
dx
=-dx;dy=-dy;
}

x
=x0;
y
=y0;
d
=2*dx+dy;//d0
nexte=2*dx;
nextne
=2*dx+2*dy;
while(y<y1)
...{
if(d<0)
...{
d
+=nextne;
x
--;
}

else
d
+=nexte;
y
++;
dc
->SetPixel(x,y,color);
}

}

ReleaseDC(dc);
}

voidswap(int&x1,int&x2)
...{
intt;
t
=x1;
x1
=x2;
x2
=t;
}

voidCDrawLinesView::MenuBhline()
...{
CDC
*dc=GetDC();

intx0=m_pnt1.x,y0=m_pnt1.y,x1=m_pnt2.x,y1=m_pnt2.y,color=RGB(0,0,255);

intx,y,dx,dy,sx,sy;
intf;
boolflag=false;
x
=x0;
y
=y0;
dx
=abs(x0-x1);
dy
=abs(y0-y1);
if(x1-x0>=0)
sx
=1;
else
sx
=-1;
if(y1-y0>=0)
sy
=1;
else
sy
=-1;
if(dy>dx)
...{
swap(dx,dy);
flag
=true;
}

else
flag
=false;

f
=2*dy-dx;

for(inti=1;i<=dx;++i)
...{
dc
->SetPixel(x,y,color);
if(f>=0)
...{
if(flag)
x
+=sx;
else
y
+=sy;
dc
->SetPixel(x,y,color);
f
-=2*dx;
}

else
...{
if(flag)
y
+=sy;
else
x
+=sx;
f
+=2*dy;
}

}

}

voidCDrawLinesView::OnMenuDdaline()
...{
//TODO:Addyourcommandhandlercodehere
m_blDDA=true;
m_blMid
=false;
m_blBre
=false;
}


voidCDrawLinesView::OnMenuMindlepoint()
...{
//TODO:Addyourcommandhandlercodehere
m_blDDA=false;
m_blMid
=true;
m_blBre
=false;
}


voidCDrawLinesView::OnMenuBhline()
...{
//TODO:Addyourcommandhandlercodehere
m_blDDA=false;
m_blMid
=false;
m_blBre
=true;
}


voidCDrawLinesView::OnLButtonDown(UINTnFlags,CPointpoint)
...{
//TODO:Addyourmessagehandlercodehereand/orcalldefault

++m_pntCount;
if(m_pntCount==1)
m_pnt1
=point;
elseif(m_pntCount==2)
...{
m_pnt2
=point;
if(m_blDDA)
MenuDdaline();
if(m_blMid)
MenuMindlepoint();
if(m_blBre)
MenuBhline();
m_pntCount
=0;
}


CView::OnLButtonDown(nFlags,point);
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics