300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Visual C++ MFC编程 绘制直线 圆 自行车

Visual C++ MFC编程 绘制直线 圆 自行车

时间:2019-01-15 03:45:21

相关推荐

Visual C++ MFC编程 绘制直线 圆 自行车

1.建立工程

右方空白处输入工程名称,然后点击确定

选中基本对话框,点击完成

将右边控件中的图像控件拖到这上面去,然后点击右键,改成位图类型

2.界面设计

布局各自随意,这里用到了静态文本,编辑框,组框,按钮。

(当然你写的时候可以布局一部分,然后编写该部分的代码并且测试)

3.按钮事件响应

布局完成后,双击其中一个按钮会自动设置好函数,你只需要进行编写就行。

(1)绘制直线

这里我们使用的是DDA法绘制直线,当然Bresenham方法也可以,后面设置线宽时用的便是这个算法。

void CExperiment1Dlg::OnOK() {float s1,s2,s6,s7;//起始点坐标int s3,s4,s5;//RGBCString str1,str2,str3,str4,str5,str6,str7;//IDC_EDIT1这是编辑框的id,右键该控件就可以看见GetDlgItemText(IDC_EDIT1,str1);GetDlgItemText(IDC_EDIT2,str2);GetDlgItemText(IDC_EDIT3,str3);GetDlgItemText(IDC_EDIT4,str4);GetDlgItemText(IDC_EDIT5,str5);GetDlgItemText(IDC_EDIT6,str6);GetDlgItemText(IDC_EDIT7,str7);s1=atof(str1);//将字符串转化成float型s2=atof(str2);s6=atof(str6);s7=atof(str7);s3=atoi(str3);//那当然atoi就是将字符串转换成整型s4=atoi(str4);s5=atoi(str5);CDC *pDC=GetDlgItem(IDC_STATIC)->GetDC();Line1(pDC,s1,s6,s2,s7,s3,s4,s5);}

void Line1(CDC *pDC,int xs,int ys,int xe,int ye,int R,int G,int B){int dx,dy,t; float k,x,y; if(xs>xe) {t=xe,xe=xs,xs=t; t=ye,ye=ys,ys=t; } dx=xe-xs,dy=ye-ys; k=(float)dy/dx; if(abs(dx)>=abs(dy)) {y=ys; for(x=xs;x<=xe;x++) pDC->SetPixel((int)x,(int)y,RGB(R,G,B)),y=y+k; } else {if(ye>ys) {x=xs; for(y=ys;y<=ye;y++) pDC->SetPixel((int)x,(int)y,RGB(R,G,B)),x=x+1/k; } else {x=xs; for(y=ys;y>=ye;y--) pDC->SetPixel((int)x,(int)y,RGB(R,G,B)),x=x-1/k; } } }

(2)绘制圆

Bresenham方法,这种方法画出来的圆更加圆滑

void CExperiment1Dlg::OnOk2() {float s8,s9,s10;int s3,s4,s5;CString str3,str4,str5,str8,str9,str10;GetDlgItemText(IDC_EDIT3,str3);GetDlgItemText(IDC_EDIT4,str4);GetDlgItemText(IDC_EDIT5,str5);GetDlgItemText(IDC_EDIT8,str8);GetDlgItemText(IDC_EDIT9,str9);GetDlgItemText(IDC_EDIT10,str10);s3=atoi(str3);s4=atoi(str4);s5=atoi(str5);s8=atof(str8);s9=atof(str9);s10=atof(str10);CDC *pDC=GetDlgItem(IDC_STATIC)->GetDC();Circle3(pDC,s8,s9,s10,s3,s4,s5); }

void Circle3(CDC *pDC,int x0,int y0,int r,int R,int G,int B) {int d=3-2*r,x=0,y=r; while(y>=x) {pDC->SetPixel (x+x0,y+y0,RGB(R,G,B)); pDC->SetPixel (-x+x0,y+y0,RGB(R,G,B)); pDC->SetPixel (-x+x0,-y+y0,RGB(R,G,B)); pDC->SetPixel (x+x0,-y+y0,RGB(R,G,B)); pDC->SetPixel (y+x0,x+y0,RGB(R,G,B)); pDC->SetPixel (-y+x0,x+y0,RGB(R,G,B)); pDC->SetPixel (-y+x0,-x+y0,RGB(R,G,B)); pDC->SetPixel (y+x0,-x+y0,RGB(R,G,B)); if(d<0) d=d+4*x+6; else d=d+4*x-4*y+10, y=y--; x++; } }

(3)垂直线刷子增加线宽

适用于直线斜率在[-1, 1]之间。把线刷子放置成垂直方向,刷子中点对准直线一端点,然后让刷子中心往直线的另一端移动,即可“刷出”具有一定宽度的线段。垂直线刷子其实也就是多画了一些像素点,在点的左右两边各多画了一个点。这里使用的便是Bresenham方法,当然还有方刷子水平线刷子增加线宽的方法。

void CExperiment1Dlg::OnOk3() {float s1,s2,s6,s7;//起始点坐标int s3,s4,s5;//RGBCString str1,str2,str3,str4,str5,str6,str7;GetDlgItemText(IDC_EDIT1,str1);GetDlgItemText(IDC_EDIT2,str2);GetDlgItemText(IDC_EDIT3,str3);GetDlgItemText(IDC_EDIT4,str4);GetDlgItemText(IDC_EDIT5,str5);GetDlgItemText(IDC_EDIT6,str6);GetDlgItemText(IDC_EDIT7,str7);s1=atof(str1);s2=atof(str2);s6=atof(str6);s7=atof(str7);s3=atoi(str3);s4=atoi(str4);s5=atoi(str5);CDC *pDC=GetDlgItem(IDC_STATIC)->GetDC();Line2(pDC,s1,s6,s2,s7,s3,s4,s5);}

void Line2(CDC *pDC,int xs,int ys,int xe,int ye,int R,int G,int B){float dx=xe-xs; float dy=ye-ys; //( xs,ys),(xe,ye)为直线段的两个端点坐标float e=-dx; float y=ys; float dxx=dx+dx;float dyy=dy+dy; float x;for( x=xs;x<=xe;x++) {pDC->SetPixel(x,y,RGB(R,G,B)); //垂直线刷子pDC->SetPixel(x-1,y,RGB(R,G,B)); pDC->SetPixel(x+1,y,RGB(R,G,B));if(e>=0) y=y++, e=e-dxx; e=e+dyy; }}

(4)绘制自行车

这个其实就是对上面直线和圆的应用了,比较麻烦的是你需要自己设置坐标。

void CExperiment1Dlg::OnOk4() {CDC *pDC=GetDlgItem(IDC_STATIC)->GetDC();Circle3(pDC,40,250,40,0,0,0); Circle3(pDC,95,250,15,0,0,0); Circle3(pDC,220,250,40,0,0,0); Line1(pDC,40,210,180,170,0,255,0);Line1(pDC,180,170,220,250,0,255,0);Line1(pDC,95,250,180,170,0,255,0);Line1(pDC,80,180,95,250,0,255,0);Line1(pDC,160,160,200,180,0,255,0);Line2(pDC,70,180,90,180,0,0,255);}

4.实验结果

可能有的同学会问了,这个默认值是怎么设置的呢(咳咳,当然你不一定能想到这个问题)

在代码中会有这个函数BOOL CExperiment1Dlg::OnInitDialog()

你找一下然后可以在这里面初始化一些参数,比如编辑框的默认值

GetDlgItem(IDC_EDIT1)->SetWindowText("10");GetDlgItem(IDC_EDIT2)->SetWindowText("80");GetDlgItem(IDC_EDIT3)->SetWindowText("255");GetDlgItem(IDC_EDIT4)->SetWindowText("0");GetDlgItem(IDC_EDIT5)->SetWindowText("0");GetDlgItem(IDC_EDIT6)->SetWindowText("5");GetDlgItem(IDC_EDIT7)->SetWindowText("30");GetDlgItem(IDC_EDIT8)->SetWindowText("80");GetDlgItem(IDC_EDIT9)->SetWindowText("80");GetDlgItem(IDC_EDIT10)->SetWindowText("50");

5.代码下载

压缩包下载

ps:

其实这是我们计算机图形学的实验,希望我的“自行车”别被同专业同学直接拿去交作业了嘿嘿,改一下参数嘛很简单的。我也是才刚学,很多都不会,如有不对请加以指正,谢谢!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。