SoundSim
collision.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "main.h"
4 #include "collision.h"
5 #include "soundwavefunction.h"
6 #include <stdbool.h>
16 void absorption(item_node *temp, float coeff) {
17  // der Absoprtionsfaktor ist für Hindernisse und wird auf alle dB Zahlen angewandt.
18  setFreq20b40(temp, getFreq20b40(temp) * coeff);
19  setFreq40b100(temp, getFreq40b100(temp) * coeff);
20  setFreq100b150(temp, getFreq100b150(temp) * coeff);
21  setFreq150b400(temp, getFreq150b400(temp) * coeff);
22  setFreq400b1000(temp, getFreq400b1000(temp) * coeff);
23  setFreq1000b2000(temp, getFreq1000b2000(temp) * coeff);
24  setFreq2000b3500(temp, getFreq2000b3500(temp) * coeff);
25  setFreq3500b6000(temp, getFreq3500b6000(temp) * coeff);
26  setFreq6000b10000(temp, getFreq6000b10000(temp) * coeff);
27  setFreq10000b20000(temp, getFreq10000b20000(temp) * coeff);
28 }
35 void interference(int x, int y, int z) {
36  item_node *temp;
37  temp = getItem_Root(x, y, z);
38  int count = 0;
39  int direc = 0;
40  int sid = 0;
41  int max20b40 = 0, max40b100 = 0, max100b150 = 0, max150b400 = 0, max400b1000 = 0,
42  max1000b2000 = 0, max2000b3500 = 0, max3500b6000 = 0, max6000b10000 = 0, max10000b20000 = 0;
43  while (temp != NULL) {
44  if (getItemID(temp) == 0 && getDirectionID(temp) != 0) {
45  if (max20b40 < getFreq20b40(temp) && getFreq20b40(temp) > 0) {
46  max20b40 = getFreq20b40(temp);
47  } else max20b40 = 0;
48  if (max40b100 < getFreq40b100(temp) && getFreq40b100(temp) > 0) {
49  max40b100 = getFreq40b100(temp);
50  direc = getDirectionID(temp);
51  sid = getSideOfWave(temp);
52  } else max40b100 = 0;
53  if (max100b150 < getFreq100b150(temp) && getFreq100b150(temp) > 0) {
54  max100b150 = getFreq100b150(temp);
55  } else max150b400 = 0;
56  if (max150b400 < getFreq150b400(temp) && getFreq150b400(temp) > 0) {
57  max150b400 = getFreq150b400(temp);
58  } else max150b400 = 0;
59  if (max400b1000 < getFreq400b1000(temp) && getFreq400b1000(temp) > 0) {
60  max400b1000 = getFreq400b1000(temp);
61  } else max400b1000 = 0;
62  if (max1000b2000 < getFreq1000b2000(temp) && getFreq1000b2000(temp) > 0) {
63  max1000b2000 = getFreq1000b2000(temp);
64  } else max1000b2000 = 0;
65  if (max2000b3500 < getFreq2000b3500(temp) && getFreq2000b3500(temp) > 0) {
66  max2000b3500 = getFreq2000b3500(temp);
67  } else max2000b3500 = 0;
68  if (max3500b6000 < getFreq3500b6000(temp) && getFreq3500b6000(temp) > 0) {
69  max3500b6000 = getFreq3500b6000(temp);
70  } else max3500b6000 = 0;
71  if (max6000b10000 < getFreq6000b10000(temp) && getFreq6000b10000(temp) > 0) {
72  max6000b10000 = getFreq6000b10000(temp);
73  } else max6000b10000 = 0;
74  if (max10000b20000 < getFreq10000b20000(temp) && getFreq10000b20000(temp) > 0) {
75  max10000b20000 = getFreq10000b20000(temp);
76  } else max10000b20000 = 0;
77  count++;
78  }
79  temp = temp->next;
80  }
81  temp = getItem_Root(x, y, z);
82  while (temp != NULL) {
83  if (getItemID(temp) == 0) {
84  removeItem(temp);
85  }
86  temp = temp->next;
87  }
88  if (count > 1) {
89  item_node *tempNEW;
90  tempNEW = createItem(x, y, z, 0);
91  setDirectionID(tempNEW, direc);
92  setSideOfWave(tempNEW, sid);
93  if (getItemID(tempNEW) == 0 && getDirectionID(temp) != 0) {
94  switch (count) {
95  case 2: setFreq20b40(tempNEW, max20b40 + 3);
96  setFreq40b100(tempNEW, max40b100 + 3);
97  setFreq100b150(tempNEW, max100b150 + 3);
98  setFreq150b400(tempNEW, max150b400 + 3);
99  setFreq400b1000(tempNEW, max400b1000 + 3);
100  setFreq1000b2000(tempNEW, max1000b2000 + 3);
101  setFreq2000b3500(tempNEW, max2000b3500 + 3);
102  setFreq3500b6000(tempNEW, max3500b6000 + 3);
103  setFreq6000b10000(tempNEW, max6000b10000 + 3);
104  setFreq10000b20000(tempNEW, max10000b20000 + 3); break;
105  case 3: setFreq20b40(tempNEW, max20b40 + 5);
106  setFreq40b100(tempNEW, max40b100 + 5);
107  setFreq100b150(tempNEW, max100b150 + 5);
108  setFreq150b400(tempNEW, max150b400 + 5);
109  setFreq400b1000(tempNEW, max400b1000 + 5);
110  setFreq1000b2000(tempNEW, max1000b2000 + 5);
111  setFreq2000b3500(tempNEW, max2000b3500 + 5);
112  setFreq3500b6000(tempNEW, max3500b6000 + 5);
113  setFreq6000b10000(tempNEW, max6000b10000 + 5);
114  setFreq10000b20000(tempNEW, max10000b20000 + 5); break;
115  case 4: setFreq20b40(tempNEW, max20b40 + 6);
116  setFreq40b100(tempNEW, max40b100 + 6);
117  setFreq100b150(tempNEW, max100b150 + 6);
118  setFreq150b400(tempNEW, max150b400 + 6);
119  setFreq400b1000(tempNEW, max400b1000 + 6);
120  setFreq1000b2000(tempNEW, max1000b2000 + 6);
121  setFreq2000b3500(tempNEW, max2000b3500 + 6);
122  setFreq3500b6000(tempNEW, max3500b6000 + 6);
123  setFreq6000b10000(tempNEW, max6000b10000 + 6);
124  setFreq10000b20000(tempNEW, max10000b20000 + 6); break;
125  case 5: setFreq20b40(tempNEW, max20b40 + 7);
126  setFreq40b100(tempNEW, max40b100 + 7);
127  setFreq100b150(tempNEW, max100b150 + 7);
128  setFreq150b400(tempNEW, max150b400 + 7);
129  setFreq400b1000(tempNEW, max400b1000 + 7);
130  setFreq1000b2000(tempNEW, max1000b2000 + 7);
131  setFreq2000b3500(tempNEW, max2000b3500 + 7);
132  setFreq3500b6000(tempNEW, max3500b6000 + 7);
133  setFreq6000b10000(tempNEW, max6000b10000 + 7);
134  setFreq10000b20000(tempNEW, max10000b20000 + 7); break;
135  case 6: setFreq20b40(tempNEW, max20b40 + 8);
136  setFreq40b100(tempNEW, max40b100 + 8);
137  setFreq100b150(tempNEW, max100b150 + 8);
138  setFreq150b400(tempNEW, max150b400 + 8);
139  setFreq400b1000(tempNEW, max400b1000 + 8);
140  setFreq1000b2000(tempNEW, max1000b2000 + 8);
141  setFreq2000b3500(tempNEW, max2000b3500 + 8);
142  setFreq3500b6000(tempNEW, max3500b6000 + 8);
143  setFreq6000b10000(tempNEW, max6000b10000 + 8);
144  setFreq10000b20000(tempNEW, max10000b20000 + 8); break;
145  default: setFreq20b40(tempNEW, max20b40 + 2);
146  setFreq40b100(tempNEW, max40b100 + 2);
147  setFreq100b150(tempNEW, max100b150 + 2);
148  setFreq150b400(tempNEW, max150b400 + 2);
149  setFreq400b1000(tempNEW, max400b1000 + 2);
150  setFreq1000b2000(tempNEW, max1000b2000 + 2);
151  setFreq2000b3500(tempNEW, max2000b3500 + 2);
152  setFreq3500b6000(tempNEW, max3500b6000 + 2);
153  setFreq6000b10000(tempNEW, max6000b10000 + 2);
154  setFreq10000b20000(tempNEW, max10000b20000 + 2); break;
155  }
156  }
157  }
158 }
167  bool checkSoundValid(item_node * temp, int x, int y, int z) {
168  //TODO: x,y,z unnötig oder?
169  bool status = false;
170 
171  if (getItemID(temp) == 0)
172  { // Die Summe aller Freq kleiner oder gleich 0
173  int sum = getFreq20b40(temp) + getFreq40b100(temp) + getFreq100b150(temp) + getFreq150b400(temp) + getFreq400b1000(temp) + getFreq1000b2000(temp) + getFreq2000b3500(temp) + getFreq3500b6000(temp) + getFreq6000b10000(temp) + getFreq10000b20000(temp);
174  if (sum <= 0 )
175  {
176  removeItem(temp);
177  return status;
178  } else if (getDirectionID(temp) == -1)
179  { // Err 9 Richtung.
180  removeItem(temp);
181  return status;
182  } else if (sum > 1350 )
183  { // Summe unrealistisch hoch.
184  removeItem(temp);
185  return status;
186  } else {
187  status = true;
188  }
189  }
190  return status;
191  }
void interference(int x, int y, int z)
Definition: collision.c:35
void absorption(item_node *temp, float coeff)
Definition: collision.c:16
void setSideOfWave(item_node *node, int side)
void setFreq100b150(item_node *node, int value)
Definition: main.c:262
void setFreq1000b2000(item_node *node, int value)
Definition: main.c:280
struct item_node * next
Definition: main.h:13
int getFreq400b1000(item_node *node)
Definition: main.c:344
void setDirectionID(item_node *node, int value)
Definition: main.c:399
void setFreq6000b10000(item_node *node, int value)
Definition: main.c:298
item_node * createItem(int x, int y, int z, int id)
Definition: main.c:476
void setFreq10000b20000(item_node *node, int value)
Definition: main.c:304
int getFreq20b40(item_node *node)
Definition: main.c:312
void setFreq40b100(item_node *node, int value)
Definition: main.c:256
void setFreq3500b6000(item_node *node, int value)
Definition: main.c:292
int getItemID(item_node *node)
Definition: main.c:185
void setFreq20b40(item_node *node, int value)
Definition: main.c:250
int getFreq150b400(item_node *node)
Definition: main.c:336
int getFreq100b150(item_node *node)
Definition: main.c:328
int getFreq10000b20000(item_node *node)
Definition: main.c:384
int getFreq6000b10000(item_node *node)
Definition: main.c:376
Definition: main.h:10
int getSideOfWave(item_node *node)
void removeItem(item_node *node)
Definition: main.c:500
int getFreq1000b2000(item_node *node)
Definition: main.c:352
int getFreq3500b6000(item_node *node)
Definition: main.c:368
int getDirectionID(item_node *node)
Definition: main.c:410
int getFreq2000b3500(item_node *node)
Definition: main.c:360
void setFreq2000b3500(item_node *node, int value)
Definition: main.c:286
int getFreq40b100(item_node *node)
Definition: main.c:320
bool checkSoundValid(item_node *temp, int x, int y, int z)
Definition: collision.c:167
void setFreq150b400(item_node *node, int value)
Definition: main.c:268
item_node * getItem_Root(int x, int y, int z)
Definition: main.c:454
void setFreq400b1000(item_node *node, int value)
Definition: main.c:274