//中点画线算法voidCMidPointLineView::MyMidLine(intx0,inty0,intx1,inty1){CClientDCdc(this);inta=0;intb=0;intd1=0;intd2=0;intd=0;intx=0;inty=0;a=y0-y1;b=x1-x0;d=2*a+b;d1=2*a;d2=2*a+2*b;x=x0;y=y0;dc.SetPixel(x,y,RGB(255,0,0));while(x 二、中点画圆算法: //画1/8圆弧voidCMidPointCircleView::MyMidCircle(intx0,inty0,intr){CClientDCdc(this);intx=0;inty=r;floatd=1.25-r;CirclePoint(x0,y0,x,y);while(x<=y){if(d<0){d+=2*x+3;}else{d+=2*(x-y)+5;y--;}x++;CirclePoint(x0,y0,x,y);}}效果图如下: 三、多边形裁剪算法: //直线窗口裁剪intCPolygonCutView::DrawLine(floatx1,floaty1,floatx2,floaty2){CDC*pDC=GetDC();intcode1,code2,code;floatx,y;CPenredpen(PS_SOLID,1,RGB(255,0,0));//创建画实线、线宽为2的红色画笔CPen*old=pDC->SelectObject(&redpen);encode(x1,y1,code1);encode(x2,y2,code2);while(code1!=0||code2!=0){if(code1&code2)return1;//线段在窗口外,返回code=code1;if(code1==0)code=code2;if(l&code){x=left;y=y1+(y2-y1)*(left-x1)/(x2-x1);}elseif(r&code){x=right;y=y1+(y2-y1)*(right-x1)/(x2-x1);}elseif(b&code){y=bottom;x=x1+(x2-x1)*(bottom-y1)/(y2-y1);}elseif(t&code){y=top;x=x1+(x2-x1)*(top-y1)/(y2-y1);}if(code==code1){x1=x;y1=y;encode(x,y,code1);}else{x2=x;y2=y;encode(x,y,code2);}}pDC->MoveTo(x1,y1);pDC->LineTo(x2,y2);ReleaseDC(pDC);return1;}效果图如下: 四、多边形区域填充算法: 五、Bezier曲线生成算法: //画Bezier曲线voidCBezierView::OnBezier(){CDC*pDC=GetDC();RedrawWindow();CPenredpen(PS_SOLID,2,RGB(255,0,0));//创建画笔CPen*old=pDC->SelectObject(&redpen);floatx0=50,y0=80,x1=150,y1=250,x2=400,y2=130,x3=300,y3=70;floatx,y,dt,t,n=30.0;inti;dt=1/n;for(i=0;i<=n;i++){t=i*dt;x=x0*(1-t)*(1-t)*(1-t)+x1*3*t*(1-t)*(1-t)+x2*3*t*t*(1-t)+x3*t*t*t;y=y0*(1-t)*(1-t)*(1-t)+y1*3*t*(1-t)*(1-t)+y2*3*t*t*(1-t)+y3*t*t*t;if(i==0)pDC->MoveTo(x,y);pDC->LineTo(x,y);}pDC->MoveTo(x0,y0);pDC->LineTo(x1,y1);pDC->LineTo(x2,y2);pDC->LineTo(x3,y3);pDC->SelectObject(old);ReleaseDC(pDC);}
计算机图形学几个算法的关键C++代码算法软件开发
THE END