#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::matrix rotation; if(cos_angle != 1.0) { bsVector axis = bsVector(0, 0, 1).cross(k).norm(); ptype angle = acos(cos_angle); rts::quaternion quat; quat.CreateRotation(angle, axis); rotation = quat.toMatrix3(); } //find the phi values associated with the cassegrain ring ptype inPhi = asin(NAin); ptype outPhi = asin(NAout); //calculate the z-values associated with these angles ptype inZ = cos(inPhi); ptype outZ = cos(outPhi); ptype rangeZ = inZ - outZ; //draw a distribution of random phi, z values ptype z, phi, theta; for(int i=0; i