BestAns

路漫漫其修远兮,吾将上下而求索

VC绘图/游戏简易教程--9:用函数简化相同图案的制作 铜牌收录

教程总目录:https://codebus.cn/bestans/post/concise-lesson-contents

实际中有许多类似的图案,如果一一单独绘制,太麻烦。于是,我们需要一个公用的绘制过程,就是函数。

例如,我们需要画5个三角形,位于不同的位置。我们可以将绘制单个三角形的过程写成函数,函数内是一个独立的程序段,这个绘制过程很简单。
然后,在需要绘制的时候,调用这个函数即可。可以通过参数来解决细微差异(图案的坐标、颜色等),例如:

#include <graphics.h>
#include <conio.h>

// 在坐标 (x,y) 处,用颜色 c 绘制三角形
void sanjiaoxing(int x, int y, int c)
{
	// 设置画线颜色
	setlinecolor(c);

	// 画三角形的三条边
	line(x, y, x+50, y);
	line(x, y, x, y+50);
	line(x+50, y, x, y+50);
}

int main()
{
	initgraph(640, 480);	// 初始化图形窗口

	sanjiaoxing(100, 100, RED);
	sanjiaoxing(120, 160, BLUE);
	sanjiaoxing(140, 220, GREEN);
	sanjiaoxing(160, 120, BLUE);
	sanjiaoxing(160, 160, GREEN);
	sanjiaoxing(220, 140, GREEN);

	_getch();				// 按任意键继续
	closegraph();			// 关闭图形窗口
	return 0;
}

再结合循环等控制条件,就能绘制更复杂漂亮的图案了。试试运行下面程序,理解一下函数的用处:

#include <graphics.h>
#include <conio.h>

void sanjiaoxing(int x, int y, int color)
{
	// 设置画线颜色
	setlinecolor(color);

	// 画三角形的三条边
	line(x, y, x+10, y);
	line(x, y, x, y+10);
	line(x+10, y, x, y+10);
}

int main()
{
	initgraph(640, 480);	// 初始化图形窗口

	for(int x = 0; x < 640; x += 10)
		for(int y = 0; y < 480; y += 10)
			sanjiaoxing(x, y, RGB(x*255/639, y*255/479, 0));

	_getch();				// 按任意键继续
	closegraph();			// 关闭图形窗口
	return 0;
}

运行效果:

本节作业:

  1. 绘制 Windows 自带游戏“扫雷”的初始界面。

  2. 这个作业有点独特,仔细看下面这个数学过程:

  3. 在二维平面上随机生成 3 个点 P[0]、P[1]、P[2];

  4. 随机生成 1 个点 P;

  5. 绘制点 P;

  6. 随机生成 [0, 2] 内的整数 n;

  7. 令 P = P 与 P[n] 的中点;

  8. 重复执行步骤 (3)~(5) 三万次。

问题是:以上步骤执行完以后,这三万个点在屏幕上会是个什么情况?有规律吗?很难想出来吧,那就写个程序把这个过程模拟一下,看看究竟是什么~~

评论 (19) -

  • 很多三角形组成,每次运行都好像从不同角度显示这个图案,很3d
  • 谢宾斯基(Sierpinski)三角形
  • 是一个大三角形,里面由白的三角形和黑色的倒三角组成。。。然后白三角里又有其他的白三角和黑倒三角。。。。
  • 有两个大的长方形重叠在一起?
  • 是一个有一堆点构成的大三角形,然后大三角形里面又有小三角形,小三角形里面又有三角形。。。。。
  • 请问,是一条斜线吗?
    • 恭喜你,答错了
      • 其实吧,我觉得因为4 个点 P[0]、P[1]、P[2],P 随机生成,如果在一条直线上也许就会是一条斜线,我做了多次有一次近似斜线。
  • 就是随机的线条,还有些零散的点哈,没看出什么规律。emoji
    • 如果你说的是最后的作业的话,那表示你写错了 :)

添加评论