VC++ 在CCanvas里面绘制弧形(扇形)

弧线的绘制方法: 

// 画弧形
#define RADIAN 3.1415926/180.0
/*
			/
		   / |
		C /  | B
		 /   |
		/    |
	   ------
		  A

	1) 角度转换为弧度公式:弧度=角度÷180×π
	2) 弧度转换为角度公式: 角度=弧度×180÷π

	△ABC中,∠C=90度,A,B,C的对边分别为a,b,c,那么有以下等式: a²+b²=c²(勾股定理)
	 sinA=cosB=a/c cosA=sinB=b/c tanA=cotB=a/b cotA=tanB=b/a sinA²+cosA²=1 tanA×cotA=1
	 tanB=b/a tanA=a/b
	 ∠A=arctan(a/b) ∠B=arctan(b/a)
*/

void AngleArc(CDC* pDC, POINT* ptCenter, float fRadius/*半径*/, float fStartAngle/*起始弧度,顺时针为正,逆时针为负*/, float fSweepAngle/*线扫弧度*/, int nPenStyle/*=PS_DOT*/, int nWidth/*=1*/, COLORREF crLine/*=RGB(255,0,0)*/)
{
	if (1)
	{
		// GDI方式(注意:系统标准接口中,角度的定义GDI顺时针为负,逆时针为负,GDI+顺时针为正,逆时针为负,为了统一接口,GDI统一为GDI+接口角度计算方式)
		pDC->MoveTo((int)(ptCenter->x + fRadius * cos(-fStartAngle * RADIAN)), (int)(ptCenter->y - fRadius * sin(-fStartAngle * RADIAN)));
		CPen pen(nPenStyle, 1, crLine);
		CPen* pOldPen = pDC->SelectObject(&pen);
		pDC->AngleArc(ptCenter->x, ptCenter->y, fRadius, -fStartAngle, -fSweepAngle);
		pDC->SelectObject(pOldPen);
	}
	else
	{
		// GDI+方式
		Graphics g(pDC->GetSafeHdc());
		Gdiplus::Pen pen(Color(255, GetRValue(crLine), GetGValue(crLine), GetBValue(crLine)));
		g.DrawRectangle(&pen, ptCenter->x - fRadius, ptCenter->y - fRadius, 2 * fRadius, 2 * fRadius);
		g.DrawArc(&pen, ptCenter->x - fRadius, ptCenter->y - fRadius, 2*fRadius, 2*fRadius, fStartAngle, fSweepAngle);
	}
}

将弧线进行封闭就成扇形了,绘制弧线的2条直线方法如下:

void AngleArcLine(CDC* pDC, POINT* ptCenter, float fRadius/*半径*/, float fStartAngle, int nPenStyle/*=PS_DOT*/, int nWidth/*=1*/, COLORREF crLine/*=RGB(255,0,0)*/)
{
	if (1)
	{
		// GDI方式
		// C为半径,∠B=angleStart度,求A、B长度
		pDC->MoveTo((int)(ptCenter->x + fRadius * cos(-fStartAngle * RADIAN)), (int)(ptCenter->y - fRadius * sin(-fStartAngle * RADIAN)));
		CPen pen(nPenStyle, nWidth, crLine);
		CPen* pOldPen = pDC->SelectObject(&pen);
		pDC->SelectObject(pen);
		pDC->LineTo(ptCenter->x, ptCenter->y);
		pDC->SelectObject(pOldPen);
	}
	else
	{
		// GDI+方式
		// C为半径,∠B=angleStart度,求A、B长度
		Graphics g(pDC->GetSafeHdc());
		Gdiplus::Pen pen(Color(255, GetRValue(crLine), GetGValue(crLine), GetBValue(crLine)), nWidth);
		g.DrawLine(&pen, (int)(ptCenter->x + fRadius * cos(-fStartAngle * RADIAN)),
			(int)(ptCenter->y - fRadius * sin(-fStartAngle * RADIAN)),
			ptCenter->x, ptCenter->y);
	}
}

因此,绘制扇形接实现代码如下:

void DrawArc(CDC* pDC, COLORREF crLine, POINT* ptCenter, int nRadius/*半径*/, float fStartAngle/*弧度*/, float fSweepAngle/*顺时针旋转的弧度*/)
{
    // 下面代码可实现雷达扫描扇形图像
	//for (int i = 0; i < nRadius; i += 10)
	//{
	//	AngleArc(pDC, ptCenter, i, fStartAngle, fSweepAngle, PS_DOT, 1, crLine);
	//}

	AngleArc(pDC, ptCenter, nRadius, fStartAngle, fSweepAngle, PS_SOLID, 1, crLine);
	AngleArcLine(pDC, ptCenter, nRadius, fStartAngle, PS_SOLID, 1, crLine);
	AngleArcLine(pDC, ptCenter, nRadius, (fStartAngle + fSweepAngle), PS_SOLID, 1, crLine);
}

调用接口

DrawArc(pDC, RGB(0, 255, 0), &CPoint(50, 150), 100, 90.0f, -135.f);

运行效果图:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值