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