00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifdef COMP_GNUOLD
00026 #include <iostream.h>
00027 #include <fstream.h>
00028 #include <strstream.h>
00029 #include <math.h>
00030 #define Problemzeile istrstream line(zeile,100);
00031 #else
00032 #include <iostream>
00033 #include <fstream>
00034 #include <sstream>
00035 #include <cmath>
00036 #define Problemzeile std::istringstream line(zeile,std::ios::in);
00037 #endif
00038
00039
00040
00041
00042
00043
00044 #include "../paramete.h"
00045 #include "../abbrevi.h"
00046 #include "../math_lib/math_lib.h"
00047
00048
00049 #include "../basic/basic.h"
00050
00051
00052 #include "../domain/domain.h"
00053 #include "../domain/sca_dom.h"
00054
00055 Scat_domain::Scat_domain(int number) {
00056 sample = new D3vector[number];
00057 normal = new D3vector[number];
00058 punkte = number;
00059 }
00060
00061 Six_corner_pyramid::Six_corner_pyramid(
00062 D3vector top1, D3vector top2, D3vector top3,
00063 D3vector top4, D3vector top5, D3vector top6,
00064 D3vector down1, D3vector down2, D3vector down3,
00065 D3vector down4, D3vector down5, D3vector down6) :
00066 Scat_domain(8) {
00067 double normV;
00068
00069
00070 bordermax = top1;
00071 bordermax = MAX(top1,bordermax);
00072 bordermax = MAX(top2,bordermax);
00073 bordermax = MAX(top3,bordermax);
00074 bordermax = MAX(top4,bordermax);
00075 bordermax = MAX(top5,bordermax);
00076 bordermax = MAX(top6,bordermax);
00077
00078 bordermax = MAX(down1,bordermax);
00079 bordermax = MAX(down2,bordermax);
00080 bordermax = MAX(down3,bordermax);
00081 bordermax = MAX(down4,bordermax);
00082 bordermax = MAX(down5,bordermax);
00083 bordermax = MAX(down6,bordermax);
00084
00085 bordermin = top1;
00086 bordermin = MIN(top1,bordermin);
00087 bordermin = MIN(top2,bordermin);
00088 bordermin = MIN(top3,bordermin);
00089 bordermin = MIN(top4,bordermin);
00090 bordermin = MIN(top5,bordermin);
00091 bordermin = MIN(top6,bordermin);
00092
00093 bordermin = MIN(down1,bordermin);
00094 bordermin = MIN(down2,bordermin);
00095 bordermin = MIN(down3,bordermin);
00096 bordermin = MIN(down4,bordermin);
00097 bordermin = MIN(down5,bordermin);
00098 bordermin = MIN(down6,bordermin);
00099
00100
00101
00102 H = L_infty(bordermax-bordermin)*Bounding_cube_enlargement;
00103 VecH = (bordermax-bordermin)*Bounding_cube_enlargement;
00104 A = (bordermin+bordermax - VecH)/2;
00105
00106
00107
00108 sample[0] = top1;
00109 normal[0] = cross_product(top2-top1, top4-top1);
00110
00111
00112 sample[1] = down1;
00113 normal[1] = cross_product(down4-down1, down2-down1);
00114
00115
00116 sample[2] = top1;
00117 normal[2] = cross_product(down2-top1, top2-top1);
00118
00119 sample[3] = top2;
00120 normal[3] = cross_product(down3-top2, top3-top2);
00121
00122 sample[4] = top3;
00123 normal[4] = cross_product(down4-top3, top4-top3);
00124
00125 sample[5] = top4;
00126 normal[5] = cross_product(down5-top4, top5-top4);
00127
00128 sample[6] = top5;
00129 normal[6] = cross_product(down6-top5, top6-top5);
00130
00131 sample[7] = top6;
00132 normal[7] = cross_product(down1-top6, top1-top6);
00133
00134
00135 for(int i=0;i<8;++i) {
00136 normV = norm(normal[i]);
00137 normal[i] = normal[i] / normV;
00138 }
00139
00140 }
00141
00142
00143
00144 Scat_domain::Scat_domain(ifstream& Datei)
00145 {
00146
00147 char zeile[100];
00148 bordermax = D3vector(-9.999e9);
00149 bordermin = D3vector(9.999e9);
00150
00151 punkte = 0;
00152 do {
00153 Datei.getline(zeile,100);
00154 if ((zeile[0]==' ' || zeile[0]=='-') &&
00155 (zeile[1]>='0' && zeile[1]<='9')) punkte++;
00156 }
00157 while ( !Datei.eof() );
00158
00159 sample = new D3vector[punkte];
00160 normal = new D3vector[punkte];
00161
00162 Datei.clear();
00163 Datei.seekg(0);
00164 punkte = 0;
00165 char c;
00166
00167
00168
00169 do {
00170 Datei.getline( zeile,100 );
00171 if ((zeile[0]==' ' || zeile[0]=='-') && (zeile[1]>='0' && zeile[1]<='9'))
00172 {
00173 Problemzeile
00174 line >> sample[punkte].x >> c >> sample[punkte].y >> c
00175 >> sample[punkte].z >> c;
00176 line >> normal[punkte].x >> c >> normal[punkte].y >> c
00177 >> normal[punkte].z;
00178 bordermax.x =
00179 (bordermax.x<sample[punkte].x)?sample[punkte].x:bordermax.x;
00180 bordermax.y =
00181 (bordermax.y<sample[punkte].y)?sample[punkte].y:bordermax.y;
00182 bordermax.z =
00183 (bordermax.z<sample[punkte].z)?sample[punkte].z:bordermax.z;
00184 bordermin.x =
00185 (bordermin.x>sample[punkte].x)?sample[punkte].x:bordermin.x;
00186 bordermin.y =
00187 (bordermin.y>sample[punkte].y)?sample[punkte].y:bordermin.y;
00188 bordermin.z =
00189 (bordermin.z>sample[punkte].z)?sample[punkte].z:bordermin.z;
00190 punkte++;
00191 }
00192 }
00193 while ( !Datei.eof() );
00194
00195 H = L_infty(bordermax-bordermin)*Bounding_cube_enlargement;
00196 A = (bordermin+bordermax-D3vector(H))/2;
00197
00198 bordermin = bordermin -
00199 D3vector(H * (1.0 - 1.0/Bounding_cube_enlargement));
00200 bordermax = bordermax +
00201 D3vector(H * (1.0 - 1.0/Bounding_cube_enlargement));
00202
00203
00204 n_uniform = 3;
00205 return;
00206 };
00207
00208 bool Scat_domain::point_in_domain(D3vector V)
00209 {
00210 if(!(bordermin<V && V<bordermax)) return false;
00211 D3vector delta;
00212 double dist;
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 for(int i=0;i<punkte;i++) {
00230 delta=V-sample[i];
00231 dist=product(delta,normal[i]);
00232 if(dist>=0.0) return false;
00233 }
00234 return true;
00235 }
00236
00237 double Scat_domain::distance(D3vector V, dir_3D d) {
00238 if(!(bordermin<V && V<bordermax)) return -100.0;
00239
00240 D3vector dir_vector,delta,normal_vec, normal_vec2;
00241 switch (d)
00242 {
00243 case Wdir: dir_vector=D3vector(-1,0,0); break;
00244 case Edir: dir_vector=D3vector(1,0,0); break;
00245 case Sdir: dir_vector=D3vector(0,-1,0); break;
00246 case Ndir: dir_vector=D3vector(0,1,0); break;
00247 case Ddir: dir_vector=D3vector(0,0,-1); break;
00248 default: dir_vector=D3vector(0,0,1);
00249 }
00250
00251 double dis_R, dis_R_new, dist, prod_dir_nor;
00252 dis_R = 4.0*H;
00253 for(int i=0;i<punkte;i++) {
00254 prod_dir_nor = product(dir_vector,normal[i]);
00255 if(prod_dir_nor > 0) {
00256 delta=V-sample[i];
00257 dist=product(delta,normal[i]);
00258 dis_R_new = -dist/prod_dir_nor;
00259
00260 if(dis_R_new<dis_R)
00261 dis_R = dis_R_new;
00262 }
00263 }
00264 return dis_R;
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308 }