bool collisionRectSAT(glm::vec4& URA4, glm::vec4& LRA4, glm::vec4& LLA4, glm::vec4& ULA4, glm::vec4& URB4, glm::vec4& LRB4, glm::vec4& LLB4, glm::vec4& ULB4) { glm::vec3 URA(URA4); glm::vec3 LRA(LRA4); glm::vec3 LLA(LLA4); glm::vec3 ULA(ULA4); glm::vec3 URB(URB4); glm::vec3 LRB(LRB4); glm::vec3 LLB(LLB4); glm::vec3 ULB(ULB4); glm::vec3 axis[4]; axis[0].x = URA.x - ULA.x; axis[0].y = URA.y - ULA.y; axis[1].x = URA.x - LRA.x; axis[1].y = URA.y - LRA.y; axis[2].x = ULB.x - LLB.x; axis[2].y = ULB.y - LLB.y; axis[3].x = ULB.x - URB.x; axis[3].y = ULB.y - URB.y; glm::vec3 vertA[] = {URA, LRA, LLA, ULA}; glm::vec3 vertB[] = {URB, LRB, LLB, ULB}; glm::vec3 projA[4]; glm::vec3 projB[4]; std::vector<double> positionA(4); std::vector<double> positionB(4); for (int a = 0; a < 4; a++) { for (int i = 0; i < 4; i++) { double top = vertA[i].x * axis[a].x + vertA[i].y * axis[a].y; double bottom = axis[a].x * axis[a].x + axis[a].y * axis[a].y; double common = top / bottom; projA[i].x = common * axis[a].x; projA[i].y = common * axis[a].y; positionA.at(i) = glm::dot(projA[i], axis[a]); } for (int i = 0; i < 4; i++) { double top = vertB[i].x * axis[a].x + vertB[i].y * axis[a].y; double bottom = axis[a].x * axis[a].x + axis[a].y * axis[a].y; double common = top / bottom; projB[i].x = common * axis[a].x; projB[i].y = common * axis[a].y; positionB.at(i) = glm::dot(projB[i], axis[a]); } double minA = *(std::min_element(positionA.begin(), positionA.end())); double minB = *(std::min_element(positionB.begin(), positionB.end())); double maxA = *(std::max_element(positionA.begin(), positionA.end())); double maxB = *(std::max_element(positionB.begin(), positionB.end())); //no collision on this axis, none at all if (((minB > maxA) || (maxB < minA))) { return false; } } return true; }
void Propagation::InitBkgArray(const std::string &BackRad) { // Routine to build the array of cumulative distribution of // background photons Bkg = BackRad; BkgE.resize(POINTS_VERY_FEW); BkgA.resize(POINTS_VERY_FEW); if (BackRad == "CMB") { double de = pow((double) eps_ph_sup_cmb / eps_ph_inf_cmb, 1. / POINTS_VERY_FEW); double e = eps_ph_inf_cmb; for (size_t i = 0; i < POINTS_VERY_FEW; i++) { BkgE[i] = e; BkgA[i] = CMBR(e); e *= de; } } else if (BackRad == "CIOB") { double de = pow((double) eps_ph_sup_ciob / eps_ph_inf_ciob, 1. / POINTS_VERY_FEW); double e = eps_ph_inf_ciob; for (size_t i = 0; i < POINTS_VERY_FEW; i++) { BkgE[i] = e; BkgA[i] = CIOBR(e); e *= de; } } else if (BackRad == "URB") { double de = pow((double) eps_ph_sup_urb / eps_ph_inf_urb, 1. / POINTS_VERY_FEW); double e = eps_ph_inf_urb; for (size_t i = 0; i < POINTS_VERY_FEW; i++) { BkgE[i] = e; BkgA[i] = URB(e); e *= de; } } else { double de = pow((double) eps_ph_sup_global / eps_ph_inf_global, (double) 1. / POINTS_VERY_FEW); double e = eps_ph_inf_global; for (size_t i = 0; i < POINTS_VERY_FEW; i++) { BkgE[i] = e; BkgA[i] = CBR(e); e *= de; } } // cumulate for (size_t i = 1; i < POINTS_VERY_FEW; i++) { BkgA[i] += BkgA[i - 1]; } // normalize double a = 1.0 / BkgA[POINTS_VERY_FEW - 1]; for (size_t i = 0; i < POINTS_VERY_FEW; i++) { BkgA[i] *= a; } }