前言:最近在做进度条,发现easyx库里的画扇形函数不太合适,于是自己造了一个能够输出扇形的图形输出函数,来帮助自己写进度条,今天写完,在此分享给各位。
函数需要一个如下的宏定义:
#define Check_Circle(px,py,x,y,r) ((((px)-(x))*((px)-(x))+((py)-(y))*((py)-(y)))<=(r)*(r)?1:0)//判断该点是否在该圆中
函数原型:
void putpie(
int x,
int y, //扇形中心坐标
int r, //扇形半径
double stangle, //扇形弧度
bool X = 1,//扇形是否从x轴开始
bool positive = 1, //扇形是否从正半轴开始
bool R = 1,//扇形是否从顺时针开始
COLORREF color=WHITE//扇形颜色
);
函数主体:
void putpie(
int x,
int y, //扇形中心坐标
int r, //扇形半径
double stangle, //扇形弧度
bool X = 1,//扇形是否从x轴开始
bool positive = 1, //扇形是否从正半轴开始
bool R = 1,//扇形是否从顺时针开始
COLORREF color=WHITE//扇形颜色
)
{
static int px, py;//可以去掉static
static double istangle;//可以去掉static
//输入纠正
if (stangle < 0) {
stangle = -stangle;
R = !R;
}
if (stangle > 6.28)
stangle = 6.28;
//开始输出
for (py = y - r; py <= y + r; ++py) {
for (px = x - r; px <= x + r; ++px) {
if (Check_Circle(px, py, x, y, r)) {//如果该点落在圆中
if (py == y)//如果点在x轴上
istangle = px >= x ? 0 : 3.14;
else if (px == x)//如果点在y轴上
istangle = py > y ? 1.57 : 3.14 + 1.57;
else {
istangle = atan(((double)py - y) / ((double)px - x));
if (px < x)
istangle += 3.14;
else if (py < y)
istangle = 6.28 + istangle;
}
if (istangle < stangle) {
if (X)
if (positive)
if (R)
putpixel(px, py, color);
else
putpixel(px,(y - py + y), color);
else
if (R)
putpixel((x - px + x), (y - py + y), color);
else
putpixel((x - px + x) , py, color);
else {
if (positive)
if (R) putpixel( py - y+x, y - px + x, color);
else putpixel(x - py + y, y - px + x, color);
else
if (R)putpixel(x - py + y, px - x+ y, color);
else putpixel(x + py - y, y + px - x, color);
}
}
}
}
}
}
接下来放出一个实例和该实例的运行结果图。
先放gif图:
实例代码如下:
#include <graphics.h>
#include <math.h>
#include <stdio.h>
int music_line = 0;
#define Check_Circle(px,py,x,y,r) ((((px)-(x))*((px)-(x))+((py)-(y))*((py)-(y)))<=(r)*(r)?1:0)//判断该点是否在该圆中
void putpie(
int x,
int y, //扇形中心坐标
int r, //扇形半径
double stangle, //扇形弧度
bool X = 1,//扇形是否从x轴开始
bool positive = 1, //扇形是否从正半轴开始
bool R = 1,//扇形是否从顺时针开始
COLORREF color=WHITE//扇形颜色
)
{
static int px, py;
static double istangle;
//输入纠正
if (stangle < 0) {
stangle = -stangle;
R = !R;
}
if (stangle > 6.28)
stangle = 6.28;
//开始输出
for (py = y - r; py <= y + r; ++py) {
for (px = x - r; px <= x + r; ++px) {
if (Check_Circle(px, py, x, y, r)) {//如果该点落在圆中
if (py == y)//如果点在x轴上
istangle = px >= x ? 0 : 3.14;
else if (px == x)//如果点在y轴上
istangle = py > y ? 1.57 : 3.14 + 1.57;
else {
istangle = atan(((double)py - y) / ((double)px - x));
if (px < x)
istangle += 3.14;
else if (py < y)
istangle = 6.28 + istangle;
}
if (istangle < stangle) {
if (X)
if (positive)
if (R)
putpixel(px, py, color);
else
putpixel(px,(y - py + y), color);
else
if (R)
putpixel((x - px + x), (y - py + y), color);
else
putpixel((x - px + x) , py, color);
else {
if (positive)
if (R) putpixel( py - y+x, y - px + x, color);
else putpixel(x - py + y, y - px + x, color);
else
if (R)putpixel(x - py + y, px - x+ y, color);
else putpixel(x + py - y, y + px - x, color);
}
}
}
}
}
}
int main() {
initgraph(400, 200);
MOUSEMSG m;
BeginBatchDraw();
while (true) {
while (MouseHit()) {
m = GetMouseMsg();
switch (m.uMsg) {
case WM_RBUTTONUP:EndBatchDraw(); closegraph(); return 0;
}
}
setfillcolor(BLACK);//设置黑色底色
solidcircle(50, 50, 50);
solidcircle(150, 50, 50);
solidcircle(250, 50, 50);
solidcircle(350, 50, 50);
solidcircle(50, 150, 50);
solidcircle(150, 150, 50);
solidcircle(250, 150, 50);
solidcircle(350, 150, 50);
putpie(50, 50, 50, (6.28 / 100)*music_line, 0, 0, 0);
putpie(150, 50, 50, (6.28 / 100)*music_line, 0, 0, 1);
putpie(250, 50, 50, (6.28 / 100)*music_line, 0, 1, 0);
putpie(350, 50, 50, (6.28 / 100)*music_line, 0, 1, 1);
putpie(50, 150, 50, (6.28 / 100)*music_line, 1, 0, 0);
putpie(150, 150, 50, (6.28 / 100)*music_line, 1, 0, 1);
putpie(250, 150, 50, (6.28 / 100)*music_line, 1, 1, 0);
putpie(350, 150, 50, (6.28 / 100)*music_line, 1, 1, 1);
setfillcolor(GREEN);//设置绿色底色
solidcircle(50, 50, 40);
solidcircle(150, 50, 40);
solidcircle(250, 50, 40);
solidcircle(350, 50, 40);
solidcircle(50, 150, 40);
solidcircle(150, 150, 40);
solidcircle(250, 150, 40);
solidcircle(350, 150, 40);
FlushBatchDraw();
Sleep(30);
++music_line;
if (music_line == 101)
music_line = 0;
}
}