计算机图形学 分形图的生成936

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六分形图的生成

班级08信计二学号52 姓名刘丽杰分数

一、实验目的和要求:

1、掌握分形基本原理,熟悉分形的计算机模拟算法。

2、学习调试程序及分析运行结果。

3、上机操作迭代函数系统算法。

二、实验内容:

1、编程实现分形的贝塞尔算法,并输出图形。

2、编程实现一棵树,先按某一方向画一条直线段,然后在此线段上找到一系列节点,在每一节点处向左右偏转60度各画一条分支。节点位置和节点处所画分支的长度的比值各按0.618分割。

三、程序执行和运行结果:

1、贝塞尔程序:

#include

#include

#define WIDTH 640

#define HEIGHT 480

#define NUMPTS 6

HDC hdc;

float animpts[NUMPTS * 2];

float deltas[NUMPTS * 2];

void Init()

{

for (int i = 0; i < NUMPTS * 2; i += 2)

{

animpts[i ] = (float)rand() / RAND_MAX * WIDTH;

animpts[i + 1] = (float)rand() / RAND_MAX * HEIGHT;

deltas[i ] = (float)rand() / RAND_MAX * 4 + 2;

deltas[i + 1] = (float)rand() / RAND_MAX * 4 + 2;

if (animpts[i ] > WIDTH / 6.0f) deltas[i ] = -deltas[i ];

if (animpts[i + 1] > HEIGHT / 6.0f) deltas[i + 1] = -deltas[i + 1];

}

}

void Animate(float pts[], float deltas[], int index, int limit)

{

float newpt = pts[index] + deltas[index];

if (newpt <= 0)

{

newpt = -newpt;

deltas[index] = (float)rand() / RAND_MAX * 3 + 2;

}

else if (newpt >= (float)limit)

{

newpt = 2.0f * limit - newpt;

deltas[index] = -((float)rand() / RAND_MAX * 3 + 2);

}

pts[index] = newpt;

}

void Run()

{

int i;

for (i = 0; i < NUMPTS * 2; i += 2)

{

Animate(animpts, deltas, i , WIDTH);

Animate(animpts, deltas, i + 1, HEIGHT);

}

float* ctrlpts = animpts;

int len = NUMPTS * 2;

float prevx = ctrlpts[len - 2];

float prevy = ctrlpts[len - 1];

float curx = ctrlpts[0];

float cury = ctrlpts[1];

float midx = (curx + prevx) / 2.0f;

float midy = (cury + prevy) / 2.0f;

MoveToEx(hdc, (int)midx, (int)midy, NULL);

for (i = 2; i <= len; i += 2)

{

float x1 = (midx + curx) / 2.0f;

float y1 = (midy + cury) / 2.0f;

prevx = curx;

prevy = cury;

if (i < len)

{

curx = ctrlpts[i ];

cury = ctrlpts[i + 1];

}

else

{

curx = ctrlpts[0];

cury = ctrlpts[1];

}

midx = (curx + prevx) / 2.0f;

midy = (cury + prevy) / 2.0f;

float x2 = (prevx + midx) / 2.0f;

float y2 = (prevy + midy) / 2.0f;

POINT param[] = {(int)x1, (int)y1, (int)x2, (int)y2, (int)midx, (int)midy};

PolyBezierTo(hdc, param, 3);

}

}

void main()

{

initgraph(WIDTH, HEIGHT);

hdc = GetImageHDC();

Init();

BeginBatchDraw();

while (!kbhit())

{

cleardevice();

Run();

FlushBatchDraw();

Sleep(15);

}

EndBatchDraw();

getch();

closegraph();

}

运行结果:

2、程序:

相关文档
最新文档