见缝插圆(基于VS2010以及Easyx)

这篇博客介绍了如何使用C++编程实现一个算法,该算法能够在画布上随机生成不相交的彩色同心圆。通过判断两圆是否相交,确保每个新生成的圆都能与已有圆相切或不相交。同时,提供了四种不同的颜色模式,包括固定黄色、随机颜色、递减亮度的随机颜色和递增亮度的随机颜色。程序中涉及图形库、颜色处理和随机数生成等技术。
摘要由CSDN通过智能技术生成

观看与网易云课堂的童晶老师的视屏教学
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

#include <graphics.h>
#include <conio.h>//Sleep()函数
#include <time.h>//srand()函数
#include <math.h>//sqrt()函数

//画黄色的圆
void DrawCicles1(float x,float y,float r)
{
	setlinecolor(RGB(0,0,0));
	setfillcolor((RGB(255,255,0)));
	fillcircle(x,y,r);
}
//画随机圆
void DrawCicles2(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 DrawCicles3(float x,float y,float r)
{
	while(r>0)
	{
		float h=rand()%300;
		COLORREF color=HSVtoRGB(h,0.6,0.8);
		setlinecolor(RGB(255,255,255));
		setfillcolor(color);
		fillcircle(x,y,r);
		r-=5;
	}
}
//画亮一点的同心圆
void DrawCicles4(float x,float y,float r)
{
	while(r>0)
	{
		float h=rand()%300;
		COLORREF color=HSVtoRGB(h,0.9,0.8);
		setlinecolor(RGB(255,255,255));
		setfillcolor(color);
		fillcircle(x,y,r);
		r-=5;
	}
}
//计算两个圆心的距离
float Dis2Points(float x1,float y1,float x2,float y2)
{
	float result;
	result=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
	return result;
}
//计算两个圆是否相交
int isTowCiclesIntersect(float x1,float y1,float r1,float x2,float y2,float r2)
{
	if (Dis2Points(x1,y1,x2,y2)<r1+r2)
	{
		return 1;
	}
	return 0;
}
//随机生成圆的半径
int randBetweenMinMax(int min,int max)
{
	int r=rand()%(max-min+1)+min;
	return r;
}

int main()
{
	int width=600;//画布宽
	int height=600;//画布宽
	initgraph(width,height);//生成画布
	setbkcolor(RGB(255,255,255));//设置背景颜色
	cleardevice();//清屏
	srand(time(0));

	int drawMode=0;//颜色选择模式
	int xArray[200];//圆的x坐标数组
	int yArray[200];//圆的y坐标数组
	int rArray[200];//圆的半径坐标数组
	int rmin=8;//圆的半径最小
	int rmax=50;//圆的半径最大
	int circleNum=0;//初始化圆的数量
	float x,y,r;//新圆的x、y、r
	int isNewCircleOk;//判断是否生成圆
	int i,j;
	while(circleNum<200)//圆的数量最多为200
	{
		isNewCircleOk=0;
		while(isNewCircleOk==0)
		{
			if (kbhit())//空格改变颜色
			{
				char input=_getch();
				if (input==' ')
				{
					circleNum=0;
					cleardevice();
					drawMode=drawMode+1;
					if (drawMode>4)
					{
						drawMode=1;
					}
				}
			}
			//随机生成圆的对应坐标
			x=rand()%width;
			y=rand()%height;
			r=rmin;
			//判断两圆是否相交,如果相交就重新生成
			for (i=0;i<circleNum;i++)
			{
				if (isTowCiclesIntersect(xArray[i],yArray[i],rArray[i],x,y,r))
				{
					break;
				}
			}
			if (i==circleNum)
			{
				isNewCircleOk=1;
			}
		}
		//这里是为了随机生成的圆大一点,尽量圆是相切
		isNewCircleOk=0;
		while (isNewCircleOk==0&&r<rmax)
		{
			r++;
			for (j=0;j<circleNum;j++)
			{
				if (isTowCiclesIntersect(xArray[j],yArray[j],rArray[j],x,y,r))
				{
					isNewCircleOk=1;
					break;
				}
			}
		}
		//重新生成的对应坐标复制
		xArray[circleNum]=x;
		yArray[circleNum]=y;
		rArray[circleNum]=r;
		circleNum++;
		//这里是颜色模式选择
		if (drawMode==1)
		{
			DrawCicles1(x,y,r);
		}
		if (drawMode==2)
		{
			DrawCicles2(x,y,r);
		}
		if (drawMode==3)
		{
			DrawCicles3(x,y,r);
		}
		if (drawMode==4)
		{
			DrawCicles4(x,y,r);
		}
		Sleep(100);//延时0.1秒
	}
	_getch();
	closegraph();//关闭
	return 0;
}

如有错误,地方请指教,主要作为个人学习记录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值