图形图像软件使用说明资料.docx
《图形图像软件使用说明资料.docx》由会员分享,可在线阅读,更多相关《图形图像软件使用说明资料.docx(11页珍藏版)》请在冰豆网上搜索。
图形图像软件使用说明资料
软件使用说明书
1.软件作者QQ1208706282
2.开发环境visualstudio2005基于MFC编程平台
3.软件概述:
实现一个简单的图形处理和图像显示,包含人机交互形式(包括菜单、工具栏、对话框响应,鼠标点击及拖动)。
使用直线、圆、椭圆的几种经典扫描转换算法。
软件可以移动图形的位置亦可拖动改变直线,矩形等的大小,使用橡皮擦小工具可以清除选中图形,动态重绘的实现。
还有些细节操作不便赘述。
由于时间短暂,个人能力有限,软件只做到这种程度,程序中不免有bug,希望学弟们再接再厉不断完善。
其中直线扫描算法用到dda,bresenham,中点圆算法等(部分算法函数为voidCCanvas:
:
DDALine(CDC*pDC,intfx,intfy,intsx,intsy),voidCCanvas:
:
BresenhamLine(CDC*pDC,intx1,inty1,intx2,inty2),voidCCanvas:
:
MidpointCircle(CDC*pDC,intradius,intpx,intpy),voidCCanvas:
:
BresenhamCircle(CDC*pDC,intradius,intpx,intpy),voidCCanvas:
:
Midponitellispe(CDC*pDC,intx0,inty0,intx1,inty1))。
4.软件操作简单描述
(1)点击file菜单,在下拉菜单点击open,打开文件选择框载入图像,如下图所示:
(1)点击view菜单,在下拉菜单点击toolbar,statebar,控制工具栏,状态栏的显示。
(2)点击draw菜单,在下拉菜单点击line,实现画直线操作,效果如下:
(3)点击draw菜单,在下拉菜单点击circle,实现画圆操作,效果如下:
(5)点击draw菜单,在下拉菜单点击rectangle,实现画矩形操作,效果如下:
(6)点击draw菜单,在下拉菜单点击ellipse,实现画椭圆操作,效果如下:
(7)点击clear菜单,弹出对话框,实现了窗口间的交互,选择是否清空已画内容,如图:
(8)
左图为软件工具栏实现的操作依次为:
画矩形,画圆,画直线,橡皮擦,画椭圆,改变图形颜色为红色,改变图形颜色为绿色,改变图形颜色为蓝色,弹出颜色选择框改变图形颜色。
5.软件的综合应用,效果如下:
4.部分算法
voidCCanvas:
:
DDALine(CDC*pDC,intfx,intfy,intsx,intsy)
{
intdx=sx-fx;
intdy=sy-fy;
doublesteps;
if(abs(dx)>abs(dy))
steps=abs(dx);
else
steps=abs(dy);
if(steps==0)
{
pDC->SetPixel(fx,fy,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
return;
}
doublexincrem=dx/steps;
doubleyincrem=dy/steps;
doublex=fx,y=fy;
for(inti=0;i{pDC->SetPixel((int)(x+0.5),(int)(y+0.5),RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
x+=xincrem;
y+=yincrem;
}
}
voidCCanvas:
:
BresenhamLine(CDC*pDC,intx1,inty1,intx2,inty2)
{
intdx=x2-x1;intsx=1;
intdy=y2-y1;intsy=1;
if(dx<0)
{
sx=-1;
dx=-dx;
}
if(dy<0)
{
sy=-1;
dy=-dy;
}
dx=dx<<1;//进位即*2
dy=dy<<1;
pDC->SetPixel(x1,y1,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
if(dy{
intfraction=dy-(dx>>1);
while(x1!
=x2)
{
if(fraction>=0)
{
y1+=sy;
fraction-=dx;
}
fraction+=dy;
x1+=sx;
pDC->SetPixel(x1,y1,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
}
}
else
{
intfraction=dx-(dy>>1);
while(y1!
=y2)
{
if(fraction>=0)
{
x1+=sx;
fraction-=dy;
}
fraction+=dx;
y1+=sy;
pDC->SetPixel(x1,y1,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
}
}
}
voidCCanvas:
:
MidpointCircle(CDC*pDC,intradius,intpx,intpy)
{
//CDC*pDC=GetDC();
intx=0;
inty=radius;
intd=1-radius;
pDC->SetPixel(x+px,y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(y+px,x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-y+px,x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(x+px,-y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+px,-y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-y+px,-x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(y+px,-x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+px,y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
while(y>=x){
if(d<0)
d+=2*x+3;/*选择E*/
else{
d+=2*(x-y)+5;/*选择SE*/
y--;
}
x++;
pDC->SetPixel(x+px,y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(y+px,x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-y+px,x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(x+px,-y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+px,-y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-y+px,-x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(y+px,-x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+px,y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
}
//ReleaseDC(pDC);
}
voidCCanvas:
:
BresenhamCircle(CDC*pDC,intradius,intpx,intpy)
{
//CDC*pDC=GetDC();
intx=0;
inty=radius;
intd1=(x+1)*(x+1)+y*y-radius*radius;
intd2=radius*radius-(x+1)*(x+1)-(y-1)*(y-1);
intd=d1-d2;
pDC->SetPixel(x+px,y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(y+px,x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-y+px,x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(x+px,-y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+px,-y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-y+px,-x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(y+px,-x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+px,y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
while(y>=x){
if(d>=0)
{
y--;
}
x++;
d1=(x+1)*(x+1)+y*y-radius*radius;
d2=radius*radius-(x+1)*(x+1)-(y-1)*(y-1);
d=d1-d2;
pDC->SetPixel(x+px,y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(y+px,x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-y+px,x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(x+px,-y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+px,-y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-y+px,-x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(y+px,-x+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+px,y+py,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
}
//ReleaseDC(pDC);
}
voidCCanvas:
:
Midponitellispe(CDC*pDC,intx0,inty0,intx1,inty1)
{
inta=abs(x1-x0),b=abs(y1-y0),x,y,color=0;//定义中心在(x0,y0),长半轴为a,短半轴为b.
floatd1,d2;
x=0;y=b;
d1=b*b+a*a*(-b+0.25);//判别式
pDC->SetPixel(x+x0,y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+x0,-y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+x0,y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(x+x0,-y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
while(b*b*(x+1){
if(d1<=0)
{
d1+=b*b*(2*x+3);x++;
}
else
{
d1+=b*b*(2*x+3)+a*a*(-2*y+2);
x++;y--;
}
pDC->SetPixel(x+x0,y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+x0,-y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+x0,y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(x+x0,-y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
}
d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;
while(y>0)
{
if(d2<=0)
{
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
x++;y--;
}
else
{
d2+=a*a*(-2*y+3);y--;
}
pDC->SetPixel(x+x0,y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+x0,-y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(-x+x0,y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
pDC->SetPixel(x+x0,-y+y0,RGB(m_dColorRed,m_dColorGreen,m_dColorBlue));
}
}