Beispiel #1
0
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;
}
Beispiel #2
0
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;
	}
}