#include "montecarlo.h" #include "rts/math/quaternion.h" #include "rts/math/matrix.h" #include #include using namespace std; void mcSampleNA(bsVector* samples, int N, bsVector k, ptype NAin, ptype NAout) { /*Create Monte-Carlo samples of a cassegrain objective by performing uniform sampling of a sphere and projecting these samples onto an inscribed sphere. samples = rtsPointer to sample vectors specified as normalized cartesian coordinates N = number of samples kSph = incident light direction in spherical coordinates NAin = internal obscuration NA NAout = outer cassegrain NA */ //get the axis of rotation for transforming (0, 0, 1) to k //k = -k; ptype cos_angle = k.dot(bsVector(0, 0, 1)); rts::rtsMatrix rotation; if(cos_angle != 1.0) { bsVector axis = bsVector(0, 0, 1).cross(k).norm(); ptype angle = acos(cos_angle); rts::rtsQuaternion quat; quat.CreateRotation(angle, axis); rotation = quat.toMatrix(); } //find the phi values associated with the cassegrain ring ptype inPhi = asin(NAin); ptype outPhi = asin(NAout); //cout<<"inPhi: "<