随机填充圆

基于VS2019   EasyX插件   C/C++

随机填充圆

#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<math.h>

//判断两个点之间的距离
float Dist2points(float x1, float y1, float x2, float y2)
{
	float result;
	result = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
	return result;
}

//判断两个圆是否相交
int isTwoCirclesIntersect(float x1, float y1, float r1, float x2, float y2, float r2)
{
	if (Dist2points(x1, y1, x2, y2) < r1 + r2)
		return 1;
	return 0;
}

//生成[min,max]之间的随机整数
int randBetweenMinMax(int min, int max)
{
	int r = rand() % (max - min + 1) + min;
	return r;
}

//填充黄色圆绘制
void DrawCircles1(float x, float y, float r)
{
	setlinecolor(RGB(0, 0, 0));
	setfillcolor(RGB(255, 255, 0));
	fillcircle(x, y, r);
}

//填充随机颜色圆绘制
void DrawCircles2(float x, float y, float r)
{
	float h = rand() % 360;
	COLORREF color = HSVtoRGB(h, 0.6, 0.8);
	setlinecolor(RGB(255,255,255));
	setfillcolor(color);
	fillcircle(x, y, r);
}

//填充随机颜色同心圆绘制
void DrawCircles3(float x, float y, float r)
{
	while (r > 0)
	{
		float h = rand() % 360;
		COLORREF color = HSVtoRGB(h, 0.6, 0.8);
		setlinecolor(RGB(255, 255, 255));
		setfillcolor(color);
		fillcircle(x, y, r);
		r = r - 3;
	}
}

//随机颜色同心圆线条绘制
void DrawCircles4(float x, float y, float r)
{
	while (r > 0)
	{
		float h = rand() % 360;
		COLORREF color = HSVtoRGB(h, 0.9, 0.8);
		setlinecolor(color);
		circle(x, y, r);
		r = r - 3;
	}
}

int main()
{
	int width = 600;//窗口宽度
	int height = 600;//窗口高度
	initgraph(width, height);//新开一个窗口
	setbkcolor(RGB(255, 255, 255));//背景颜色为白色
	cleardevice();//以背景颜色清空背景
	srand(time(0));//随机种子函数①

	int xArray[1000];//数组存储所有圆心的x坐标
	int yArray[1000];//数组存储所有圆心的y坐标
	int rArray[1000];//数组存储所有圆的半径
	int rmin = 8;//圆的最小半径
	int rmax = 50;//圆的最大半径
	int circleNum = 0;//生成的圆的个数
	float x, y, r;//新增圆的圆心坐标、半径
	int isNewCircleOk;
	int i;
	int j;
	int drawMode = 3;

	while (circleNum < 1000)//当圆的个数小于1000时,循环运行
	{
		isNewCircleOk = 0;

		while (isNewCircleOk == 0)
		{
			if (_kbhit())//当按键时
			{
				char input = _getch();//获得用户按键
				if (input == ' ')//空格键
				{
					circleNum = 0;//圆的个数为0,相当于画面清除所有已有的圆圈
					cleardevice();//清屏
					drawMode++;//进行下一种绘图模式
					if (drawMode > 4)//如果大于4,重新回到第1种绘图模式
						drawMode = 1;
				}
			}
			x = rand() % width;//新增圆的圆心x坐标
			y = rand() % height;//新增圆的圆心y坐标
			r = rmin;//新圆的半径开始设为最小半径

			for (i = 0; i < circleNum; i++)//对所有已有圆进行遍历
			{
				if (isTwoCirclesIntersect(xArray[i], yArray[i], rArray[i], x, y, r))
				{
					break;
				}
			}
			if (i == circleNum)//当相等时,说明for循环已经遍历完毕
			{
				isNewCircleOk = 1;
			}
		}

		isNewCircleOk = 0;//继续设为不OK,下面要让这个新圆的半径最大
		while (isNewCircleOk == 0 && r < rmax)//当不OK,并且新圆的半径小于最大半径时
		{
			r++;//让半径+1
			for (j = 0; j < circleNum; j++)//对所有旧圆进行遍历
			{
				if (isTwoCirclesIntersect(xArray[j], yArray[j], rArray[j], x, y, r))
				{
					isNewCircleOk = 1;//一旦和一个旧圆相交,这时新圆OK
					break;//因为新圆半径已经达到最大的情况,这时跳出循环
				}
			}
		}

		xArray[circleNum] = x;//把新增圆的圆心坐标添加到数组中
		yArray[circleNum] = y;//
		rArray[circleNum] = r;//把新增圆的半径添加到数组中
		circleNum++;//使圆的个数增加1

		//根据不同绘图模式进行绘制
		if (drawMode == 1)
			DrawCircles1(x, y, r);
		if (drawMode == 2)
			DrawCircles2(x, y, r);
		if (drawMode == 3)
			DrawCircles3(x, y, r);
		if (drawMode == 4)
			DrawCircles4(x, y, r);

		Sleep(10);//暂停若干毫秒
	}

	_getch();//等待按键输入
	closegraph();//关闭窗口
	return 0;
}

注释

1、srand(time(0))

srand是种下随机种子数,你每回种下的种子不一样,用rand得到的随机数就不一样。
为了每回种下一个不一样的种子,所以就选用time(0),time(0)是得到当前时时间值(因为每时每刻时间是不一样的)
srand(time(0));//先设置种子
rand();//然后产生随机数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值