分享代码 快乐编程

一起学习,一起进步,从分享代码开始~

[分形学] 基于 L 系统绘制 Hilbert (希尔伯特) 曲线

德国数学家 David Hilbert 发现了这样一种可以填满整个单位正方形的分形曲线,称它为 Hilbert 曲线。具体的我就不多做介绍了,相关内容请自己搜索。这里只说程序。

程序执行后,按数字键 1~8 可以显示相应阶数的 Hilbert (希尔伯特) 曲线,按 ESC 退出。

五阶 Hilbert (希尔伯特) 曲线的执行效果如下:

代码如下: 

// 程序名称:Hilbert (希尔伯特)曲线 (基于 L 系统绘制)
// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
// 最后修改:2011-3-7
//
#include <graphics.h>
#include <conio.h>

int g_len;	// Hilbert 曲线的单位长度

// 递归绘制 Hilbert 曲线
void hilbert(LPCTSTR 
...

吸顶灯上的一个图案,由若干圆弧组成

也不知道这个程序该叫什么名字,是我最早学编程的时候写的。那时候看见什么东西都想用程序画出来,然后偶然间在一个吸顶灯的灯罩上看到了这样的图案,于是就写了一个程序来生成。

执行效果如下:

代码如下:

// 程序名称:圆弧组成的图案
// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
// 最后修改:2011-3-7
//
#include <graphics.h>
#include <conio.h>
#include <math.h>

#define PI	3.1415926536
#define R	200

// 四舍五入
int Round(double x)
{
	return (int)(x < 0 ? x - 0.5 : x + 0.5);
}

// 主函数
void main()
{
	// 变量定义
	in
...

万花尺(又叫万花规)模拟程序

万花尺相信很多人小时候都玩过吧,将一个满是齿牙的小圆套在一个大圆里面,用笔放进小圆的洞里,然后转圈圈画,就可以画出很多美丽有趣的图案。这个程序就是万花尺的模拟程序。

下面是几组数据和执行效果的抓图:

代码如下:

////////////////////////////////////////////
// 程序名称:万花尺(又名万花规)模拟程序
// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
// 程序编写:yangw80 <yw80@qq.com>
// 最后更新:2011-2-26
//
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define PI 3.1415926536

void main()
...

俄罗斯方块(Tetris) VC 源代码

童年的经典游戏~~。界面上没有做额外的修饰,需要的可以自己增加。执行效果如下:

上面的图是后来改的,下面这张是以前的执行效果。不知道这次的修改是不是对得起观众?

代码如下:

////////////////////////////////////////////
// 程序名称:俄罗斯方块
// 编译环境:Visual C++ 6.0 / 2010,EasyX_v20131006(beta)
// 程序编写:krissi <zhaoh1987@qq.com>
// 更新记录:2010-12-18	首次编写
//      2011-9-28	修改了下落超时的逻辑
//      2013-10-7	修改了绘制方法,将原来的立体效果修改为扁平效果
//
#include <easyx.h>
#include <conio.h>
...

模仿 Windows 屏保“变幻线 (Mystify)” VC 源代码

该程序模仿的 Windows 经典屏幕保护程序“变幻线”,并使用了面向对象技术编写,初学面向对象时可以作为参考。

程序中,由多个连续的节点构成一个顶点对象,由四个顶点构成一个多边形对象,主程序有两个多边形在各自运动。更详细的,请参考源代码。

源代码如下:

// 程序名称:变幻线
// 编译环境:VC6 + EasyX v20100825
// 编 写 者:zhaoh1987@qq.com
// 编写日期:2010-11-25
//
#include <graphics.h>
#include <conio.h>
#include <time.h>
#define	WIDTH	640
#define	HEIGHT	480
#define	MAXSTEP	9



// 节点(多个连续的节点环,组成一个顶点)
struct POINTNODE
{
	POINT		pos;	// 位置
...

[分形学] 谢宾斯基 (Sierpinski) 三角形,也叫垫片

先说一个程序的实现过程:

  1. 随机生成 3 个点 P[0]、P[1]、P[2];
  2. 随机生成 1 个点 P;
  3. 绘制点 P;
  4. 随机生成 [0, 2] 内的整数 n;
  5. 令 P = P 与 P[n] 的中点;
  6. 重复执行步骤 3~5 三万次。

这个程序很简单,虽然随机性很大,但是结果几乎是完全相似的,会是一个很有趣的图案,也就是传说中的谢宾斯基三角形。以上步骤就是生成谢宾斯基三角形的随机迭代法。

程序代码如下:
(注:为了效果,将步骤(1)的三个点手动指定了。喜欢的话,可以将其修改为随机产生)。

// 程序名称:谢宾斯基(Sierpinski)三角形,也叫垫片
// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
// 最后更新:2010-11-16
//
#include <graphics.h>

...

涂格子游戏(也叫点灯游戏)(by 豆腐果)

该游戏是经典的涂格子游戏,很有挑战性。

执行效果如下:

 

源代码如下:

/**********************************************************
 * 程序功能:涂格子游戏
 * 程序版本:v0.1 基本功能演示版本,简单动态效果,可以过关
 * 编译环境:Visual C++ 6.0,EasyX_20130506(beta)
 * 最后更新:2010-11-9
 **********************************************************/
#include	<graphics.h>
#include	<conio.h>
#define		MaxNum				14		//单边最大格子数
#define		G_length			30		//格子边长
#define		USER_LBUTTONDOWN	
...

钟表模拟程序(表针形式)

这是个简单的表针式时钟模拟程序。

运行效果如下:

在源代码的基础上,可以通过 API 函数 mciSendString 轻松加上滴答声音,我就不再多写了。

代码如下:

////////////////////////////////////////////
// 程序名称:钟表模拟程序(表针形式)
// 编译环境:Visual C++ 6.0,EasyX 2013白露版
// 程序编写:BestAns <BestAns@qq.com>
// 最后更新:2010-10-30
//
#include <graphics.h>
#include <conio.h>
#include <math.h>

#define	PI	3.1415926536

void DrawHand(int hour, int minute, int seco
...

用多个圆形组合形成的心形图案

这个程序在很多书上都有写过,以下是运行效果截图:

代码如下:

// 程序名称:圆形组合而成的心形图案
// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
// 最后更新:2010-10-28
//
#include <graphics.h>
#include <conio.h>
#include <math.h>

#define	PI	3.1415926536

void main()
{
	int x, y, y1, r = 50, r1;

	// 初始化图形模式
	initgraph(640, 480);
	// 设置原点为屏幕中央
	setorigin(320, 240);
	// 设置绘图颜色为红色
	setcolor(RED);

	// 用数学方法,用多个圆形组合形成心形图案
	y1 = 240 - r;
	for(doubl
...

三维旋转球 源码+注释+简单讲解

关于三维的东西远不止这么点内容,也不是我几句话可以讲完的,需要大家扎扎实实的看图形学。不能好高骛远,要扎实、系统的学习。还要注意相关数学知识的学习。

过去我写了一些简单教程(以后还会写),但是这篇文章不算教程。我写这篇文章,是想表达我前面的看法,希望大家能认识到。

我在这篇文章里尽量不用图形学的术语,也不做优化、不加额外功能,只希望大家能从道理上看的清楚明白。

简单讲一下:
关于一个点,一定要有一个三维坐标,程序中的结构体 POINT3D 就是;
点的初始化由函数 InitPoint() 实现,该函数产生了 n 个半径为 1 的点;
点的运动,是在三维坐标内运动的,包括平移、缩放、旋转等。这个程序只涉及到了旋转,定义了三个方法:RotateX()、RotateY()、RotateZ(),分别实现绕三个轴旋转;
最后需要将三维世界呈现出来,这里用到一个术语:投影,就是将三维的画面投影到二维上。投影有多种方法,这个球体用一点透视就可以。还需要一个“观察点”,程序中用 viewZ

...