`
- 浏览:
144788 次
- 性别:
- 来自:
杭州
-
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
相关推荐
直线生成算法研究,完成中点生成算法的过程,vc程序
实验二 实现直线的生成算法源码 1、进一步熟悉CDC图形程序库; 2、掌握数值微分直线生成算法; 3、掌握中点画线算法; 4、掌握Bresenham直线生成算法
DDA直线生成算法
Bresenham直线生成算法 c语言Bresenham直线生成算法
这是图形学实验 ,大学计科选修的一门专业, 这个实验关于直线生产算法
直线生成算法 圆生成算法 边界标志算法 扫描线种子填充算法
这是已运行通过的Bresenham的直线生成算法和整圆生成算法完整代码,希望给初学者一点帮助。
逐点比较直线生成算法 c语言,逐点比较直线生成算法
直线的生成算法(三种) *1.--------紫色线条:DDA算法--------- *2.--------红色线条:逐点比较算法--------- *3.--------绿色线条:Bresenham算法--------- 【在压缩包里附有 .exe 文件,可直接双击运行,看结果。...
计算机图形学实验一 直线生成算法 的源代码,绝对可行,欢迎下载
直线、圆弧生成算法的实现 DDA直线生成算法 Bresenham圆弧生成算法
这个是用MFC写的有关计算机图形学演示直线生成算法的程序。包括DDA算法和bresenham算法。Visual Studio 2013
计算机图形学-三种直线生成算法及圆的生成算法.doc
该直线生成算法包含了从各个角度的生成算法; 以4个像限来说: 1->3 3->1 1->2 2->1 1->4 4->1 2->4 4->2 还包括了度角和大于45度角
DDA直线生成算法.doc
选定一种基本图形(直线段),编写生成该基本图形的源程序,并能在计算机上编译运行,画出正确的图形
计算机图形学 直线生成算法实现.doc
基于FPGA的反走样直线生成算法研究.pdf
贵州大学计算机图形学实验报告----直线生成算法.doc