见缝插圆

编程环境:Visual Stdio2022    插件:EasyX 

创建框架

窗口中的大小可以自己根据喜好而定

#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>  //可以用于打乱数字顺序
int main() {
	initgraph(800, 600);  //设置窗口大小
	setbkcolor(WHITE);  //背景颜色设置成白色
	cleardevice();  //刷新屏幕,不然还是黑的


	_getch();  //一直获取输入,可以让窗口一直固定
	closegraph();   //关闭设置
}

随机出现的圆点

先学习一下如何产生随机数

srand(time(0));  // 先打乱数字的顺序,不然后面产生的随机数一直只有一个

rand()%100;   //表示在100以内产生一个随机数,若没有srand(time(0))每次都是41

rand()%100+50;   //表示在50~100以内产生随机数

先尝试产生以下图片中的效果

代码参考:

#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>
int main() {
	initgraph(800, 600);
	setbkcolor(WHITE);
	cleardevice();
	srand(time(0)); //打乱顺序
	int x, y, r, num = 0;  //圆的坐标x,y;半径r,num为圆的个数
	while(1) {  //一直绘制圆点
		x = rand() % 800;
		y = rand() % 600;
		r = rand() % 50 + 8;  //半径在8~50以内随机大小
		setlinecolor(BLACK);  //边框设置成黑色
		setfillcolor(RGB(255, 0, 0));  //填充颜色设置成红色,理解两种不同的设置颜色的方式
		fillcircle(x, y, r); //绘制实心圆点,不设置颜色默认是白色
		Sleep(100);  //延迟一下,看得见出现过程
	}

	_getch();
	closegraph();
}

颜色单词要用大写,也可以用计算机三原色RGB

RGB(0,0,0)为黑色,RGB(255,255,255) 为白色

可以自己尝试多种颜色

不重叠的圆

1、需要用数组来存储新增的圆

int cx[1000], cy[1000], cr[1000];

2、计算两个圆的距离

根据坐标求解两个点之间的距离可以用
dist=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)

和半径之间比较,计算半径:dr=(r1-r2)*(r1-r2)

若dist<dr 说明两个圆有重叠部分

代码参考:

#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>
int main() {
	initgraph(800, 600);
	setbkcolor(WHITE);
	cleardevice();
	srand(time(0));
	int x,y,r, num = 0;
	int cx[1000], cy[1000], cr[1000]; //存储新增的圆位置和半径
	int i; //先定义一个i
	while(1){
		bool yesok = 0; //判断是否有重叠,按有重叠处理
		while (yesok == 0) { //无线循环是为了直到新的圆位置没有重叠为止
			x = rand() % 800;
			y = rand() % 600;
			r = rand() % 100 + 8;
			for ( i = 0; i < num; i++) { //遍历已经存在的圆的坐标位置和半径
				float dist = (cx[i] - x) * (cx[i] - x) + (cy[i] - y) * (cy[i] - y);
				float dr = (cr[i] +r) * (cr[i] + r);
				if (dist < dr) break;  //存在相交,跳出循环,继续产生随机值
			}
			if (i == num) yesok = 1; //直到遍历完了已存在的所有圆,设置yesok=1,就跳出了while

		}
		cx[num] = x;  //在数组中新增圆的坐标位置
		cy[num] = y;
		cr[num] = r;
		setlinecolor(BLACK);
		setfillcolor(RGB(255, 0, 0));
		fillcircle(x, y, r);
		num++;  //个数加一
		Sleep(100);
	}
	_getch();
	closegraph();
}

以此可以实现基本的见缝插圆的效果了

最后:弄个随机颜色

#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>
int main() {
	initgraph(800, 600);
	setbkcolor(WHITE);
	cleardevice();
	srand(time(0));
	int x,y,r, num = 0;
	int cx[1000], cy[1000], cr[1000]; //存储新增的圆位置和半径
	int i;
	while(1){
		bool yesok = 0;
		while (yesok == 0) {
			x = rand() % 800;
			y = rand() % 600;
			r = rand() % 100 + 8;
			for ( i = 0; i < num; i++) {
				float dist = (cx[i] - x) * (cx[i] - x) + (cy[i] - y) * (cy[i] - y);
				float dr = (cr[i] +r) * (cr[i] + r);
				if (dist < dr) break;  //不相交
			}
			if (i == num) yesok = 1; //排除第一个圆的情况,不然就挑不出循环

		}
		cx[num] = x;
		cy[num] = y;
		cr[num] = r;
		//随机颜色
		int red = rand() % 255;
		int green= rand() % 255;
		int blue= rand() % 255;
		setlinecolor(BLACK);
		setfillcolor(RGB(red,green,blue));  //颜色参数修改
		fillcircle(x, y, r);
		num++;
		Sleep(100);
	}
	_getch();
	closegraph();
}

来吧,展示:

学废了吗? 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值