C++实现画图功能的程序 急啊!!!!!!!!!!!!!!
用C++语言编一个画图程序能画直线曲线圆等等的谢啦!!!!!!!!!!我的邮箱907906160@qq.com牛人来啊!程序要求还有画矩形并利用位图资源填充矩形,还有画扇...
用C++语言编一个画图程序 能画直线曲线圆等等的 谢啦!!!!!!!!!!
我的邮箱 907906160@qq.com 牛人来啊!程序要求还有画矩形并利用位图资源填充矩形,还有画扇形!!!因为我们还没学到MFC,老师就让做了自学。。。不久就要交啊!急啊!! 展开
我的邮箱 907906160@qq.com 牛人来啊!程序要求还有画矩形并利用位图资源填充矩形,还有画扇形!!!因为我们还没学到MFC,老师就让做了自学。。。不久就要交啊!急啊!! 展开
3个回答
展开全部
这个是画圆的。
#include <math.h>
#include <graphics.h> /*预定义库函数*/
void circlePoint(int x,int y) /*八分法画圆程序*/
{
circle(320 x*20,240 y*20,3);
circle(320 y*20,240 x*20,3);
circle(320-y*20,240 x*20,3);
circle(320-x*20,240 y*20,3);
circle(320-x*20,240 y*20,3);
circle(320-x*20,240-y*20,3);
circle(320-y*20,240-x*20,3);
circle(320 y*20,240-x*20,3);
circle(320 x*20,240-y*20,3);
}
void MidBresenhamcircle(int r) /* 中点Bresenham算法画圆的程序 */
{
int x,y,d;
x=0;y=r;d=1-r; /* 计算初始值 */
while(x<y)
{ circlePoint(x,y); /* 绘制点(x,y)及其在八分圆中的另外7个对称点 */
if(d<0) d =2*x 3; /* 根据误差项d的判断,决定非最大位移方向上是走还是不走 */
else
{ d =2*(x-y) 5;
y--;
}
x ;
delay(900000);
} /* while */
}
main()
{
int i,j,r,graphmode,graphdriver;
detectgraph(&graphdriver,&graphmode);
initgraph(&graphdriver,&graphmode," ");
printf("中点Bresenhamcircle算法画圆的程序\n"); /*提示信息*/
printf("注意 |r|<=11");
printf("\n输入半径值 r:");
scanf("%d",&r);
printf("按任意键显示图形...");
getch();
cleardevice();
setbkcolor(BLACK);
for(i=20;i<=620;i =20) /*使用双循环画点函数画出表格中的纵坐标*/
for(j=20;j<=460;j )
putpixel(i,j,2);
for(j=20;j<=460;j =20) /*使用双循环画点函数画出表格中的横坐标*/
for(i=20;i<=620;i )
putpixel(i,j,2);
outtextxy(320,245,"0"); /*原点坐标*/
outtextxy(320-5*20,245,"-5");circle(320-5*20,240,2); /*横坐标值*/
outtextxy(320 5*20,245,"5");circle(320 5*20,240,2);
outtextxy(320-10*20,245,"-10");circle(320-10*20,240,2);
outtextxy(320 10*20,245,"10");circle(320 10*20,240,2);
outtextxy(320-15*20,245,"-15");circle(320-15*20,240,2);
outtextxy(320 15*20,245,"15");circle(320 15*20,240,2);
outtextxy(320,240-5*20,"-5");circle(320,240-5*20,2); /*纵坐标值*/
outtextxy(320,240 5*20,"5");circle(320,240 5*20,2);
outtextxy(320,240-10*20,"-10");circle(320,240-10*20,2);
outtextxy(320,240 10*20,"10");circle(320,240 10*20,2);
outtextxy(20,10,"The center of the circle is (0,0) "); /*坐标轴左上角显示提示信息*/
setcolor(RED); /*标记坐标轴*/
line(20,240,620,240); outtextxy(320 15*20,230,"X");
line(320,20,320,460); outtextxy(330,20,"Y");
setcolor(YELLOW);
MidBresenhamcircle(r);
setcolor(BLUE); /*绘制圆*/
circle(320,240,r*20);
setcolor(2);
getch();
closegraph();
}
下面这个是画直线的。
#include<graphics.h>
#include<math.h>
/*
###############################################################################
功 能:本函数的作用是用逐点比较法来画一条直线
格 式:void myline1(int x1,int y1,int x2,int y2,int color)
参数说明:x1,y1是起始点坐标,x2,y2是终止点,color是画线的颜色
调用示例:myline1(10,20,500,440,4)
###############################################################################
*/
void myline1(int x1,int y1,int x2,int y2,int color)
{
/*变量定义开始(2007/10/16增加)*/
int iTx; /*x轴终点的相对坐标xa或临时变量*/
int iTy; /*y轴终点的相对坐标ya或临时变量*/
int iDx; /*x轴方向的步长dx*/
int iDy; /*y轴方向的步长dy*/
int iFt; /*偏差Fm*/
int iSt; /*记数循环数(dx+dy)S*/
int iXt; /*x方向循环变量xm*/
int iYt; /*y方向循环变量ym*/
/*变量定义结束*/
/*变量初始化开始*/
/*如果是第三象限或第四象限则换成第一或第二象限*/
if(y2<y1)
{
iTx=x1;
x1=x2;
x2=iTx;
iTy=y1;
y1=y2;
y2=iTy;
}
iTx=x2-x1; /*取x轴的相对坐标*/
iTy=y2-y1; /*取y轴的相对坐标*/
iDx=1;
iDy=1;
iFt=0;
iSt=iTx+iTy;
if(iTx<0)iSt=-1*iTx+iTy;; /*如果在第二象限,则x轴方向步长取负值*/
iXt=0;
iYt=0;
/*变量初始化结束*/
/*数据处理开始*/
while(iSt>0)
{
putpixel(x1+iXt,y1+iYt,color);
if(iTx>=0) /*如果在第一象限*/
{
if(iFt<0) /*如果偏差小于0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
else /*如果偏差大于或等于0*/
{
iXt+=iDx; /*x方向走一步*/
iFt-=iTy;
}
}
else
{
if(iFt<0) /*如果偏差小于0*/
{
iXt-=iDx; /*负x方向走一步*/
iFt+=iTy;
}
else /*如果偏差大于或等于0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
}
iSt--;
}
}
/*
###############################################################################
功 能:本函数的作用是用来画一条直线
格 式:void myline2(int x1,int y1,int x2,int y2,int color)
参数说明:x1,y1是起始点坐标,x2,y2是终止点,color是画线的颜色
调用示例:myline2(10,20,500,440,4)
###############################################################################
*/
int myline2(int x1,int y1,int x2,int y2,int color)
{
int iX; /*x方向的坐标变量*/
int iY; /*y方向的坐标变量*/
int iTx; /*x方向的步长变量*/
int iTy; /*y方向的步长变量*/
float fDx; /*x方向的差分变量*/
float fDy; /*y方向的差分变量*/
float fMinf; /*算法中的f*/
float fMaxF; /*算法中的F*/
float fS; /*终点判断变量*/
fMinf=0.5; /*f=0.5*/
iX=x1;
iY=y1;
putpixel(x1,y1,color);
if(x1==x2&&y1==y2) /*如果终点和起始点相同*/
{
return(1);
}
iTx=1;
iTy=1;
fDx=(float)(x2-x1);
fDy=(float)(y2-y1);
fMaxF=fDy/fDx>0?fDy/fDx:(-fDy/fDx); /*F=|dy/dx|*/
if(fDx<0)iTx=-1;
if(fDy<0)iTy=-1;
fS=fDx>0?fDx:(-fDx);
if(fMaxF==1) /*如果F=1*/
{
iX=x1;
iY=y1;
while(fS>0)
{
iX+=iTx; /*x方向走一步*/
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fS--;
}
}
else if(fMaxF>1) /*如果F>1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fMinf+=1/fMaxF; /*f=f+1/F*/
fS--;
if(fMinf>=1) /*如果f>=1*/
{
iX+=iTx; /*x方向走一步*/
fMinf--; /*f=f-1*/
putpixel(iX,iY,color);
fS--;
}
}
}
else /*如果F<1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
iX+=iTx; /*x方向走一步*/
putpixel(iX,iY,color);
fMinf+=fMaxF; /*f=f+F*/
fS--;
if(fMinf>=1) /*如果f>=1*/
{
iY+=iTy; /*y方向走一步*/
fMinf--; /*f=f-1*/
putpixel(iX,iY,color);
fS--;
}
}
}
}
不懂的可以继续探讨。谢谢
#include <math.h>
#include <graphics.h> /*预定义库函数*/
void circlePoint(int x,int y) /*八分法画圆程序*/
{
circle(320 x*20,240 y*20,3);
circle(320 y*20,240 x*20,3);
circle(320-y*20,240 x*20,3);
circle(320-x*20,240 y*20,3);
circle(320-x*20,240 y*20,3);
circle(320-x*20,240-y*20,3);
circle(320-y*20,240-x*20,3);
circle(320 y*20,240-x*20,3);
circle(320 x*20,240-y*20,3);
}
void MidBresenhamcircle(int r) /* 中点Bresenham算法画圆的程序 */
{
int x,y,d;
x=0;y=r;d=1-r; /* 计算初始值 */
while(x<y)
{ circlePoint(x,y); /* 绘制点(x,y)及其在八分圆中的另外7个对称点 */
if(d<0) d =2*x 3; /* 根据误差项d的判断,决定非最大位移方向上是走还是不走 */
else
{ d =2*(x-y) 5;
y--;
}
x ;
delay(900000);
} /* while */
}
main()
{
int i,j,r,graphmode,graphdriver;
detectgraph(&graphdriver,&graphmode);
initgraph(&graphdriver,&graphmode," ");
printf("中点Bresenhamcircle算法画圆的程序\n"); /*提示信息*/
printf("注意 |r|<=11");
printf("\n输入半径值 r:");
scanf("%d",&r);
printf("按任意键显示图形...");
getch();
cleardevice();
setbkcolor(BLACK);
for(i=20;i<=620;i =20) /*使用双循环画点函数画出表格中的纵坐标*/
for(j=20;j<=460;j )
putpixel(i,j,2);
for(j=20;j<=460;j =20) /*使用双循环画点函数画出表格中的横坐标*/
for(i=20;i<=620;i )
putpixel(i,j,2);
outtextxy(320,245,"0"); /*原点坐标*/
outtextxy(320-5*20,245,"-5");circle(320-5*20,240,2); /*横坐标值*/
outtextxy(320 5*20,245,"5");circle(320 5*20,240,2);
outtextxy(320-10*20,245,"-10");circle(320-10*20,240,2);
outtextxy(320 10*20,245,"10");circle(320 10*20,240,2);
outtextxy(320-15*20,245,"-15");circle(320-15*20,240,2);
outtextxy(320 15*20,245,"15");circle(320 15*20,240,2);
outtextxy(320,240-5*20,"-5");circle(320,240-5*20,2); /*纵坐标值*/
outtextxy(320,240 5*20,"5");circle(320,240 5*20,2);
outtextxy(320,240-10*20,"-10");circle(320,240-10*20,2);
outtextxy(320,240 10*20,"10");circle(320,240 10*20,2);
outtextxy(20,10,"The center of the circle is (0,0) "); /*坐标轴左上角显示提示信息*/
setcolor(RED); /*标记坐标轴*/
line(20,240,620,240); outtextxy(320 15*20,230,"X");
line(320,20,320,460); outtextxy(330,20,"Y");
setcolor(YELLOW);
MidBresenhamcircle(r);
setcolor(BLUE); /*绘制圆*/
circle(320,240,r*20);
setcolor(2);
getch();
closegraph();
}
下面这个是画直线的。
#include<graphics.h>
#include<math.h>
/*
###############################################################################
功 能:本函数的作用是用逐点比较法来画一条直线
格 式:void myline1(int x1,int y1,int x2,int y2,int color)
参数说明:x1,y1是起始点坐标,x2,y2是终止点,color是画线的颜色
调用示例:myline1(10,20,500,440,4)
###############################################################################
*/
void myline1(int x1,int y1,int x2,int y2,int color)
{
/*变量定义开始(2007/10/16增加)*/
int iTx; /*x轴终点的相对坐标xa或临时变量*/
int iTy; /*y轴终点的相对坐标ya或临时变量*/
int iDx; /*x轴方向的步长dx*/
int iDy; /*y轴方向的步长dy*/
int iFt; /*偏差Fm*/
int iSt; /*记数循环数(dx+dy)S*/
int iXt; /*x方向循环变量xm*/
int iYt; /*y方向循环变量ym*/
/*变量定义结束*/
/*变量初始化开始*/
/*如果是第三象限或第四象限则换成第一或第二象限*/
if(y2<y1)
{
iTx=x1;
x1=x2;
x2=iTx;
iTy=y1;
y1=y2;
y2=iTy;
}
iTx=x2-x1; /*取x轴的相对坐标*/
iTy=y2-y1; /*取y轴的相对坐标*/
iDx=1;
iDy=1;
iFt=0;
iSt=iTx+iTy;
if(iTx<0)iSt=-1*iTx+iTy;; /*如果在第二象限,则x轴方向步长取负值*/
iXt=0;
iYt=0;
/*变量初始化结束*/
/*数据处理开始*/
while(iSt>0)
{
putpixel(x1+iXt,y1+iYt,color);
if(iTx>=0) /*如果在第一象限*/
{
if(iFt<0) /*如果偏差小于0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
else /*如果偏差大于或等于0*/
{
iXt+=iDx; /*x方向走一步*/
iFt-=iTy;
}
}
else
{
if(iFt<0) /*如果偏差小于0*/
{
iXt-=iDx; /*负x方向走一步*/
iFt+=iTy;
}
else /*如果偏差大于或等于0*/
{
iYt+=iDy; /*y方向走一步*/
iFt+=iTx;
}
}
iSt--;
}
}
/*
###############################################################################
功 能:本函数的作用是用来画一条直线
格 式:void myline2(int x1,int y1,int x2,int y2,int color)
参数说明:x1,y1是起始点坐标,x2,y2是终止点,color是画线的颜色
调用示例:myline2(10,20,500,440,4)
###############################################################################
*/
int myline2(int x1,int y1,int x2,int y2,int color)
{
int iX; /*x方向的坐标变量*/
int iY; /*y方向的坐标变量*/
int iTx; /*x方向的步长变量*/
int iTy; /*y方向的步长变量*/
float fDx; /*x方向的差分变量*/
float fDy; /*y方向的差分变量*/
float fMinf; /*算法中的f*/
float fMaxF; /*算法中的F*/
float fS; /*终点判断变量*/
fMinf=0.5; /*f=0.5*/
iX=x1;
iY=y1;
putpixel(x1,y1,color);
if(x1==x2&&y1==y2) /*如果终点和起始点相同*/
{
return(1);
}
iTx=1;
iTy=1;
fDx=(float)(x2-x1);
fDy=(float)(y2-y1);
fMaxF=fDy/fDx>0?fDy/fDx:(-fDy/fDx); /*F=|dy/dx|*/
if(fDx<0)iTx=-1;
if(fDy<0)iTy=-1;
fS=fDx>0?fDx:(-fDx);
if(fMaxF==1) /*如果F=1*/
{
iX=x1;
iY=y1;
while(fS>0)
{
iX+=iTx; /*x方向走一步*/
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fS--;
}
}
else if(fMaxF>1) /*如果F>1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
iY+=iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fMinf+=1/fMaxF; /*f=f+1/F*/
fS--;
if(fMinf>=1) /*如果f>=1*/
{
iX+=iTx; /*x方向走一步*/
fMinf--; /*f=f-1*/
putpixel(iX,iY,color);
fS--;
}
}
}
else /*如果F<1*/
{
fS+=fDy>0?fDy:(-fDy);
while(fS>0)
{
iX+=iTx; /*x方向走一步*/
putpixel(iX,iY,color);
fMinf+=fMaxF; /*f=f+F*/
fS--;
if(fMinf>=1) /*如果f>=1*/
{
iY+=iTy; /*y方向走一步*/
fMinf--; /*f=f-1*/
putpixel(iX,iY,color);
fS--;
}
}
}
}
不懂的可以继续探讨。谢谢
展开全部
你可以利用C++的MFC模块功能 还能做更为复杂的事呢
如果单单要画直线曲线圆等 可以在“新建”“文件”里点击“位图文件”就可以实现你要的功能了
如果单单要画直线曲线圆等 可以在“新建”“文件”里点击“位图文件”就可以实现你要的功能了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个得利用MFC的绘图类就很省事了,你可以查一下相关的资料。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询