/// Returns signed 2 theta (signed scattering angle w.r.t. to beam direction). double DetectorInfo::signedTwoTheta(const std::pair<size_t, size_t> &index) const { if (isMonitor(index)) throw std::logic_error( "Two theta (scattering angle) is not defined for monitors."); const auto samplePos = samplePosition(); const auto beamLine = samplePos - sourcePosition(); if (beamLine.nullVector()) { throw Kernel::Exception::InstrumentDefinitionError( "Source and sample are at same position!"); } // Get the axis defining the sign const auto &instrumentUpAxis = m_instrument->getReferenceFrame()->vecThetaSign(); const auto sampleDetVec = position(index) - samplePos; double angle = sampleDetVec.angle(beamLine); const auto cross = beamLine.cross_prod(sampleDetVec); const auto normToSurface = beamLine.cross_prod(instrumentUpAxis); if (normToSurface.scalar_prod(cross) < 0) { angle *= -1; } return angle; }
void Shape::sampleDirect(DirectSamplingRecord &dRec, const Point2 &sample) const { /* Piggyback on sampleArea() */ samplePosition(dRec, sample); dRec.d = dRec.p - dRec.ref; Float distSquared = dRec.d.lengthSquared(); dRec.dist = std::sqrt(distSquared); dRec.d /= dRec.dist; Float dp = absDot(dRec.d, dRec.n); dRec.pdf *= dp != 0 ? (distSquared / dp) : 0.0f; dRec.measure = ESolidAngle; }
/// Returns 2 theta (scattering angle w.r.t. to beam direction). double DetectorInfo::twoTheta(const std::pair<size_t, size_t> &index) const { if (isMonitor(index)) throw std::logic_error( "Two theta (scattering angle) is not defined for monitors."); const auto samplePos = samplePosition(); const auto beamLine = samplePos - sourcePosition(); if (beamLine.nullVector()) { throw Kernel::Exception::InstrumentDefinitionError( "Source and sample are at same position!"); } const auto sampleDetVec = position(index) - samplePos; return sampleDetVec.angle(beamLine); }
bool Cube::sampleDirect(uint32 /*threadIndex*/, const Vec3f &p, PathSampleGenerator &sampler, LightSample &sample) const { PositionSample point; samplePosition(sampler, point); Vec3f L = point.p - p; float rSq = L.lengthSq(); sample.dist = std::sqrt(rSq); sample.d = L/sample.dist; float cosTheta = -(point.Ng.dot(sample.d)); if (cosTheta <= 0.0f) return false; sample.pdf = rSq/(cosTheta*_area); return true; }
/** Returns L2 (distance from sample to spectrum). * * For monitors this is defined such that L1+L2 = source-detector distance, * i.e., for a monitor in the beamline between source and sample L2 is negative. */ double DetectorInfo::l2(const std::pair<size_t, size_t> &index) const { if (!isMonitor(index)) return position(index).distance(samplePosition()); else return position(index).distance(sourcePosition()) - l1(); }
Vertex Triangle::sampleVertex(){ glm::vec3 position = samplePosition(); glm::vec3 normal = computeNormal(position); return Vertex(position, normal); }