inline ExPolygons to_expolygons(const Surfaces &src) { ExPolygons expolygons; expolygons.reserve(src.size()); for (Surfaces::const_iterator it = src.begin(); it != src.end(); ++it) expolygons.push_back(it->expolygon); return expolygons; }
double CalcIntegral(Surfaces &s, PointsXYZ &m){ //return; int ns=s.size(); // число треугольников CoordXYZ x[3]; for (int i = 0; i < 3; i++) x[i].resize(3); //============= init =================== vrt.Init(m.size(),p_DeltaT); CoordXYZ w(3); CoordXYZ control_point(3); CoordXYZ position_of_source(3); w[0] = 0; w[1] = 0; w[2] = 0; position_of_source[0] = e_x0; position_of_source[1] = e_y0; position_of_source[2] = e_z0; control_point[0] = p_control_x; control_point[1] = p_control_y; control_point[2] = p_control_z; double omega = p_omega; SourceOfNoise source_of_noise(omega, position_of_source,w);//,control_point); //========== end of init =============== double Sintegral; // for(double z=90.;z<100.;z+=(100.-90.)/200.) double T=0.; // for(;T<110.;T+=(110.-90.)/230.) { for (int i = 0; i < 3; ++i) IntN[i]=0; S_Surf=0.; // control_point[2]=z; Sintegral=0; for(int j=0;j<ns;j++) { int err; Sintegral+=CalcIntegralOfFullTrg(s[j],m,T,source_of_noise, control_point,err); if(err) { cout << " ERROR 3_ ret=" << err << " j= " << j << endl; return 0.; } } { static int ugu=0; if(!ugu) cout << " S_Surf=" << S_Surf << " (" << S_Surf/(4.*M_PI*kva(p_Rsphere)) << ") IntN " << IntN[0] << " " << IntN[1] << " " << IntN[2] << endl<< endl; ugu=1; } // cout << control_point[2] << " " << Sintegral << " " << source_of_noise.GetRho(control_point,T) << endl; if(!isbp) cout << T << "\t" << source_of_noise.GetRho(control_point,T) << " " << Sintegral << endl; } if(isbp) { vrt.PutData("koeff.txt"); // следует выполнить свёртку! int nk=150,ik; double dt=(p_T2-p_T1)/nk; for(ik=0,T=p_T1;ik<=nk;ik++,T+=dt) { Sintegral=vrt.Svertka(s,m,source_of_noise,T); cout << T << "\t" << source_of_noise.GetRho(control_point,T) << " " << Sintegral << endl; } } cout << endl; cout << " S_Surf=" << S_Surf << " (" << S_Surf/(4.*M_PI*kva(p_Rsphere)) << ") Int_N " << IntN[0] << " " << IntN[1] << " " << IntN[2] << endl; return Sintegral; }
vector<SimplifiedRib> CreateInitialStructure(Surfaces& s, PointsXYZ &m){ vector<Rib> k; k.resize(s.size()*3); //cout << s.size() << " " << k.size() << endl; for(int i = 0; i < s.size(); i++){ // заполняем k ребрами с номерами треугольников k[i*3].TriangleNumber = k[i*3+1].TriangleNumber = k[i*3+2].TriangleNumber = i; k[i*3].a = k[i*3+1].a = GetCoordSurf(s[i][0],m); k[i*3].b = k[i*3+2].a = GetCoordSurf(s[i][1],m); k[i*3+1].b = k[i*3+2].b = GetCoordSurf(s[i][2],m); } for(int i = 0; i < k.size(); i++){ //упорядочиваем вершины каждого ребра по величине модуля CoordXYZ t; /* cout << i << endl; cout << "a: " << k[i].a[0] << " " << k[i].a[1] << " "<< k[i].a[2] << " "; cout << "b: " << k[i].b[0] << " " << k[i].b[1] << " "<< k[i].b[2] << endl; if(!((i+1)%3)) cout << k[i].TriangleNumber << endl;*/ if(keisu(k[i].a) > keisu(k[i].b)) { t = k[i].a; k[i].a = k[i].b; k[i].b = t; } } qsortmy1(k,0,k.size()-1,0); int lb = 0; int rb = 0; for(int i = 1; i < k.size(); i++){ if(k[i].a[0] != k[i-1].a[0]){ rb = i-1; qsortmy1(k,lb,rb,1); lb = i; } else if(i == k.size()-1){ rb = i; qsortmy1(k,lb,rb,1); } } lb = rb = 0; for(int i = 1; i < k.size(); i++){ if(k[i].a[0] != k[i-1].a[0] || k[i].a[1] != k[i-1].a[1]){ rb = i-1; qsortmy1(k,lb,rb,2); lb = i; } else if(i == k.size()-1){ rb = i; qsortmy1(k,lb,rb,2); } } lb = rb = 0; for(int i = 1; i < k.size(); i++){ if(k[i].a[0] != k[i-1].a[0] || k[i].a[1] != k[i-1].a[1] || k[i].a[2] != k[i-1].a[2]){ rb = i-1; qsortmy2(k,lb,rb,0); lb = i; } else if(i == k.size()-1){ rb = i; qsortmy2(k,lb,rb,0); } } lb = rb = 0; for(int i = 1; i < k.size(); i++){ if(k[i].a[0] != k[i-1].a[0] || k[i].a[1] != k[i-1].a[1] || k[i].a[2] != k[i-1].a[2] || k[i].b[0] != k[i-1].b[0]){ rb = i-1; qsortmy2(k,lb,rb,1); lb = i; } else if(i == k.size()-1){ rb = i; qsortmy2(k,lb,rb,1); } } lb = rb = 0; for(int i = 1; i < k.size(); i++){ if(k[i].a[0] != k[i-1].a[0] || k[i].a[1] != k[i-1].a[1] || k[i].a[2] != k[i-1].a[2] || k[i].b[0] != k[i-1].b[0] || k[i].b[1] != k[i-1].b[1]){ rb = i-1; qsortmy2(k,lb,rb,2); lb = i; } else if(i == k.size()-1){ rb = i; qsortmy2(k,lb,rb,2); } } //qsorttriangletest(k,0,k.size()-1); /*for(int i = 0; i < k.size();i++){ if(k[i].TriangleNumber == 3779){ cout << i << " " << k[i].TriangleNumber << endl; cout << "a: " << k[i].a[0] << " " << k[i].a[1] << " "<< k[i].a[2] << " "; cout << "b: " << k[i].b[0] << " " << k[i].b[1] << " "<< k[i].b[2] << endl; } }*/ vector<SimplifiedRib> ret; ret.resize(k.size()); ret[0].RibNumber = 0; ret[0].TriangleNumber = k[0].TriangleNumber; int z = 0; for(int i = 1; i < k.size(); i++){ if(k[i].a != k[i-1].a || k[i].b != k[i-1].b) z++; ret[i].RibNumber = z; ret[i].TriangleNumber = k[i].TriangleNumber; } //qsorttriangle(ret,0,ret.size()-1); /*for(int i = 0; i < ret.size(); i++){ if(ret[i].RibNumber == 6805){ cout << i << " "; cout << "RibNumber: " << ret[i].RibNumber << " "; cout << "TriangleNumber: " << ret[i].TriangleNumber << endl; } }*/ return ret; }