完全三叉树解决长方形容器中光源反射点遍历的问题

[问题描述]:
在一个正方形的屋子里面(只考虑平面结构),有一个光源和一个目的点,从光源开始经过多次反射到达目的点,其间相对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;
 }

}

/**/
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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值