计算机图形学----------圆的绘制

此博客介绍了如何利用中点Bresenham算法在C++环境中绘制圆。首先,在OnDraw函数中设置了坐标系,并通过DrawGraph函数实现了第一象限1/8圆弧的绘制,然后通过对称性完成整个圆的绘制。代码示例展示了如何确定圆心、设置像素颜色并使用SetPixelV进行绘制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

绘制一个圆–原理就是根据中点Bresenham算法在第一象限内X∈[0,R/√2]绘制出1/8的圆弧,最后通过对称关系绘制出其他的7份圆弧。

OnDraw函数绘制坐标系。

void CTest2View::OnDraw(CDC* pDC)
{
	CTest2Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	         
           GetClientRect(&rect);
           pDC->SetMapMode(MM_ANISOTROPIC);
           pDC->SetWindowExt(rect.Width(),rect.Height());
           pDC->SetViewportExt(rect.Width(),-rect.Height());
           pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);


		   pDC->MoveTo(-rect.Width()/2,0);
		   pDC->LineTo(rect.Width()/2,0);
		   pDC->LineTo(rect.Width()/2-20,20);
		   pDC->MoveTo(rect.Width()/2,0);
		   pDC->LineTo(rect.Width()/2-20,-20);


		   pDC->MoveTo(0,rect.Height()/2);
		   pDC->LineTo(0,-rect.Height()/2);
		   pDC->MoveTo(0,rect.Height()/2);
		   pDC->LineTo(20,rect.Height()/2-20);
		   pDC->MoveTo(0,rect.Height()/2);
		   pDC->LineTo(-20,rect.Height()/2-20);
		   pDC->TextOut(4,15,"O");

		   DrawGraph(pDC);


}

DrawGraph函数绘制圆

void CTest2View::DrawGraph(CDC *pDC)
{
    double R;
	R=fabs(begin.x-end.x)/2;
	double x,y,d;	 
	d=1.25-R;
	x=0;
	y=R;
	for(x=0;x<=y;x++)
	{
		//八分法画圆子函数
		//圆心坐标
      CPoint pc=CPoint((begin.x+end.x)/2.0,(begin.y+end.y)/2.0);        
	 //定义圆的边界颜色 
	 COLORREF  clr=RGB(0,0,255);                         
	 pDC->SetPixelV(x+pc.x,y+pc.y,clr); //x,y
	 pDC->SetPixelV(y+pc.x,x+pc.y,clr); //y,x
	 pDC->SetPixelV(y+pc.x,-x+pc.y,clr);//y,-x
	 pDC->SetPixelV(x+pc.x,-y+pc.y,clr);//x,-y
	 pDC->SetPixelV(-x+pc.x,-y+pc.y,clr);//-x,-y
	 pDC->SetPixelV(-y+pc.x,-x+pc.y,clr);//-y,-x
	 pDC->SetPixelV(-y+pc.x,x+pc.y,clr);//-y,x
	 pDC->SetPixelV(-x+pc.x,y+pc.y,clr);//-x,y
        if (d<0)
			d+=2*x+3;
         else
		{
			d+=2*(x-y)+5;
			y--;
		} 
     }

}

运行截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值