DirectX画圆及圆角矩形的简单实现

本文介绍了如何利用DirectX的D3D9接口结合Bresenham算法来绘制圆形和圆角矩形。通过探讨八对称性,详细阐述了如何扫描转换八分之一圆弧,进而生成整个圆。同时,提到了圆角矩形的绘制思路,即绘制四个四分之一圆弧与四条直线。
摘要由CSDN通过智能技术生成

    讨论如何用d3d9来绘制圆及简单的圆角矩形。     

    画圆时采用Bresenham算法。不失一般性,假设圆的圆心位于坐标原点(如果圆心不在原点,可以通过坐标平移使其与原点重合),半径为R。以原点为圆心的圆C有四条对称轴:x=0,y=0,x=y和x=-y。若已知圆弧上一点P1=C(x, y),利用其对称性便可以得到关于四条对称轴的其它7个点,即: P2=C(x,-y), P3=C(-x, y), P4=C(-x,-y), P5=C(y,x), P6=C(-y,x), P7=C(y,-x), P8=C(-y,-x)。     

    这种性质称为八对称性。因此,只要扫描转换八分之一圆弧,就可以通过圆弧的八对称性得到整个圆。     

    我们以(0,0)为原点,r为半径,坐标系xy方向与屏幕坐标系一致,计算y轴正向右侧的八分之一圆弧,其它圆弧通过对称性得到。     

    顶点格式采用如下定义:

    struct SCREEN_VERTEX_UNTEX

    {

	float x, y, z, h;

	D3DCOLOR color;



	static DWORD FVF;

    };

    SCREEN_VERTEX_UNTEX::FVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE
    下面是画圆函数:    
void DrawCircle( IDirect3DDevice9* pd3dDevice, int xCenter, int yCenter, int nRadius, D3DCOLOR FrameColor)

{

	SCREEN_VERTEX_UNTEX *pVertices = new SCREEN_VERTEX_UNTEX[2 * D3DX_PI * nRadius];

	//Bresenham algorithm

	int x=0, y=nRadius, d=1-nRadius, i=0;

	while(x <= y)

	{

		//get eight points

		//(x,y)

		pVertices[i].x = x + xCenter;

		pVertices[i].y = y + yCenter;

		pVertices[i].z = 0.5f;

		pVertices[i].h = 1.0f;

		pVertices[i].color = FrameColor;		

		//(x,-y)

		++i;



		pVertices[i].x = x + xCenter;

		pVertices[i].y = -y + yCenter;

		pVertices[i].z = 0.5f;

		pVertices[i].h = 1.0f;

		pVertices[i].color = FrameColor;	

		//(-x, y)

		++i;

		pVertices[i].x = -x + xCenter;

		pVertices[i].y = y + yCenter;

		pVertices[i].z = 0.5f;

		pVertices[i].h = 1.0f;

		pVertices[i].color = FrameColor;	

		//(-x, -y)

		++i;

		pVertices[i].x = -x + xCenter;

		pVertices[i].y = -y + yCenter;

		pVertices[i].z = 0.5f;

		pVertices[i].h = 1.0f;

		pVertices[i].color 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

foruok

你可以选择打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值