弧线的绘制方法:
// 画弧形
#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);
运行效果图: