[Easyx]输出扇形图形(可以指定从某轴开始,且能指定转向)

前言:最近在做进度条,发现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;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值