[问题描述]:
在一个正方形的屋子里面(只考虑平面结构),有一个光源和一个目的点,从光源开始经过多次反射到达目的点,其间相对4个镜面有N个反射点,求经过m次反射的所有反射点,以及这些反射点到目的点的距离和反射角,
[程序设计]
1.在第一次反射之后,以4个第一次反射点为根节点,构造4个完全三叉树,
2.每个节点的构造为,编号,x,y坐标,到达目的点的距离,父节点指针,反射角指针,下一个节点指针
[程序说明]
本程序使用C语言编写,是用通用的C语言函数库(我用的是MinGW:windows下开发Linux程序的编译库),在windows下编写,在Linux下运行通过(可能定义稍事修改)
#include
<
stdio.h
>
#include
<
malloc.h
>
#include
<
math.h
>

static
float
box_width
=
20.0
;
static
float
box_lenght
=
30.0
;
static
int
node_total
=
0
;

typedef
struct
NODE
...
{
int num ;
char mirror;
float x ;
float y ;
float distance ;
float incidence;
struct NODE *parent;
struct NODE *next;
}
NODE;


int
levelNums(
int
level)
...
{

if (level == 1)...{
return 1;
}else...{
return levelNums(--level)*3;
}
}

/**/
/*
* to use recursion to count up the tree nodes' numbers ;
*
*/

int
treeNums_recur(
int
level)
...
{
int sum;
sum = 0;
for(int i=1 ; i<=level ; i++)...{
sum = sum + levelNums(i);
}
return sum;
}

float
rtnDistand(
float
rx0,
float
ry0,
float
node_x ,
float
node_y)
...
{
return sqrt((node_x-rx0)*(node_x-rx0)+(node_y-ry0)*(node_y-ry0));
}

/**/
/*
* to use mathematics formula to count up the tree nodes' numbers ;
* A1 = 1 ; A2 = 3 ; A3 = 9 ; ...... An = 3*(n-1);
* S1 = 1 : S2 = 4 ; S3 = 13; ...... Sn = (3^n -1 )/2;
* @param int level : this node in which level
* @param return : the number from root to this level
*/

int
treeNums_maths(
int
level)
...
{
int sum;
int accumulate ;
accumulate = 3;
for (int n =1 ; n <level ; n ++)...{
accumulate = accumulate*3;
}
sum = (accumulate-1)/2;
return sum;
}



int
levelInTree(
int
num)
...
{
int level;
level = 0;
while(num > 0)...{
level++ ;
num = num - levelNums(level);
}
return level;
}


/**/
/*
* @param int num : child node's number
* @param return : parent node's number
*/

int
parentNum(
int
num)
...
{
int level,parentTreeNum,parent;
level =

该博客讨论了一个在二维平面上,光源经过多次反射到达目的点的问题。通过构造以第一次反射点为根的四个完全三叉树,并为每个节点存储坐标、距离、反射角等信息,实现了遍历所有可能的反射路径。程序采用C语言编写,可在Windows下开发,Linux下运行。
最低0.47元/天 解锁文章
424

被折叠的 条评论
为什么被折叠?



