还记得小时候玩的万花尺么?好好玩,各种不同的点距能画出各种各样形状图形。
C语言程序万花尺模拟
函数功能:每隔5秒随机生成万花图形 并自动保存作图参数以及图形到当前目录,图像格式为jpg
提示:
- 相关参数范围可以自行设置,用自定义mySetRand函数设置作图尺寸范围
注意:
- 内圆半径不能大于外圆半径,内圆作图点不能大于内圆半径
/*以下是完整代码,可自行个性化更改参数*/
- #include
- #include
- #include
- #include
- #include
- #include
- int mySetRand(int num, int min, int max);
- #define PI 3.1415926536
- int main()
- {
- int k = 0;
- wchar_t s[255] = { NULL };
- int R; // 静圆半径
- int r; // 动圆半径
- int dr; // 动圆上的作图点到圆心的距离
- while (1)
- {
- //产生一个100-395之间的随机数
- R = mySetRand(1, 100, 395);
- r = R - mySetRand(1, 5, 95);
- dr = r - mySetRand(1,2, r-5);
- // 求执行次数(最小公倍数/静圆半径)
- int m = R, n = r;
- int tmp;
- while (n != 0)
- {
- tmp = m % n;
- m = n;
- n = tmp;
- }
- double maxdegree = r / m * 2 * PI;
- //清屏
- //cleardevice();
- system("cls");
- initgraph(800, 610);
- setbkcolor(RGB(200, 200, 200));
- // 设置作图原点坐标,使其在窗口中心画图
- setorigin(400, 300);
- // 开始绘图
- int x, y;
- for (double degree = 0; degree < maxdegree; degree += 0.01)
- {
- x = (int)(dr * cos(degree*(double(R) / r - 1)) + (R - r) * cos(degree));
- y = (int)(dr * sin(degree*(double(R) / r - 1)) - (R - r) * sin(degree));
- putpixel(x, y, RGB(255,255,0));
- }
- //归位原点坐标
- setorigin(0, 0);
- _stprintf_s(s, _T("作图参数:外圆半径%.3d像素\\内圆半径%.3d像素\\作图点到圆心距离%.3d像素"), R, r, dr);
- settextstyle(20, 0, _T("黑体"));
- settextcolor(RED);
- outtextxy(60, 587, s);
- //保存图形到当前目录
- k++;
- _stprintf_s(s, _T("%.6d.jpg"), k);
- saveimage(s);
- //画面停留5秒后,清屏重新画另一个图
- Sleep(5000);
- closegraph();
- }
- return 0;
- }
- //指定范围随机数产生
- //num产生个数,产生范围min到max(包括min和max)
- int mySetRand(int num, int min, int max)
- {
- int *p_num = #
- int *p_min = &min;
- int *p_max = &max;
- int a = 0;
- int p1 = 0, p2 = 0;
- if ((*p_num)<0 || (*p_min>*p_max))
- {
- printf("最大值与最小值反过来了?\n元素个数为负数了?");
- getchar();
- return -1;
- }
- srand((unsigned int)time(0));
- for (size_t i = 0; i < *p_num; i++)
- {
- a = rand();
- if (*p_min == 0)
- {
- p2 = a % (*p_max + 1);
- }
- else if (*p_min>0)
- {
- p1 = a / (*p_max - *p_min + 1);
- p2 = a - p1*(*p_max - *p_min + 1) + *p_min;
- }
- else
- {
- printf("处理出错!");
- getchar();
- return -2;
- }
- if (p2>*p_max || p2<*p_min)
- {
- printf("数据有误!");
- getchar();
- }
- }
- return p2;
- }
//部分代码截图以及效果图展现如下