Skip to content

Commit 6a5a17e

Browse files
authored
Merge pull request #299 from vfisikop/trigonometric_intersect
Refactor trigonometric_positive_intersect function for hpolytopes
2 parents 9114f37 + 742eb01 commit 6a5a17e

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

include/convex_bodies/hpolytope.h

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -750,33 +750,36 @@ class HPolytope {
750750
}
751751

752752

753-
//------------oracle for exact hmc spherical gaussian sampling---------------//
754-
753+
// Boundary oracle for exact hmc spherical gaussian sampling
755754
// compute intersection point of ray starting from r and pointing to v
756-
// with polytope discribed by A and b
755+
// with polytope discribed by A and b (the ray describes a curve)
757756
std::pair<NT, int> trigonometric_positive_intersect(Point const& r, Point const& v,
758757
NT const& omega, int &facet_prev) const
759758
{
759+
constexpr NT pi_2 = NT(2.0) * M_PI;
760+
NT t = std::numeric_limits<NT>::max();
760761

761-
NT lamda = 0, C, Phi, t1, t2, tmin;
762-
NT min_plus = std::numeric_limits<NT>::max(), t = std::numeric_limits<NT>::max();
763-
NT max_minus = std::numeric_limits<NT>::lowest();
764-
VT sum_nom, sum_denom;
765-
unsigned int j;
766-
int m = num_of_hyperplanes(), facet = -1;
767-
762+
int m = num_of_hyperplanes();
763+
int facet = -1;
768764

765+
VT sum_nom;
766+
VT sum_denom;
769767
sum_nom.noalias() = A * r.getCoefficients();
770768
sum_denom.noalias() = A * v.getCoefficients();
771769

772770
NT* sum_nom_data = sum_nom.data();
773771
NT* sum_denom_data = sum_denom.data();
774772
const NT* b_data = b.data();
775773

774+
const NT omega_sqr = omega * omega;
775+
const NT pi_2_omega = pi_2 / omega;
776+
776777
for (int i = 0; i < m; i++) {
777778

778-
C = std::sqrt((*sum_nom_data) * (*sum_nom_data) + ((*sum_denom_data) * (*sum_denom_data)) / (omega * omega));
779-
Phi = std::atan((-(*sum_denom_data)) / ((*sum_nom_data) * omega));
779+
NT C = std::sqrt((*sum_nom_data) * (*sum_nom_data) + ((*sum_denom_data) * (*sum_denom_data))
780+
/ omega_sqr);
781+
NT Phi = std::atan((-(*sum_denom_data)) / ((*sum_nom_data) * omega));
782+
780783
if ((*sum_denom_data) < 0.0 && Phi < 0.0) {
781784
Phi += M_PI;
782785
} else if ((*sum_denom_data) > 0.0 && Phi > 0.0) {
@@ -785,20 +788,20 @@ class HPolytope {
785788

786789
if (C > (*b_data)) {
787790
NT acos_b = std::acos((*b_data) / C);
788-
t1 = (acos_b - Phi) / omega;
791+
NT t1 = (acos_b - Phi) / omega;
789792
if (facet_prev == i && std::abs(t1) < 1e-10){
790-
t1 = (2.0 * M_PI) / omega;
793+
t1 = pi_2_omega;
791794
}
792795

793-
t2 = (-acos_b - Phi) / omega;
796+
NT t2 = (-acos_b - Phi) / omega;
794797
if (facet_prev == i && std::abs(t2) < 1e-10){
795-
t2 = (2.0 * M_PI) / omega;
798+
t2 = pi_2_omega;
796799
}
797800

798-
t1 += (t1 < NT(0)) ? (2.0 * M_PI) / omega : NT(0);
799-
t2 += (t2 < NT(0)) ? (2.0 * M_PI) / omega : NT(0);
801+
t1 += (t1 < NT(0)) ? pi_2_omega : NT(0);
802+
t2 += (t2 < NT(0)) ? pi_2_omega : NT(0);
800803

801-
tmin = std::min(t1, t2);
804+
NT tmin = std::min(t1, t2);
802805

803806
if (tmin < t && tmin > NT(0)) {
804807
facet = i;

0 commit comments

Comments
 (0)