circumradius.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include <test_common.h>
  2. #include <igl/circumradius.h>
  3. TEST_CASE("circumradius: equilateral-triangle", "[igl]" )
  4. {
  5. // Equilateral triangle
  6. Eigen::MatrixXd V(3,2);
  7. V << 0,0, 1,0, 0.5,sqrt(3.0)/2.0;
  8. Eigen::MatrixXi F(1,3);
  9. F << 0,1,2;
  10. Eigen::VectorXd R;
  11. igl::circumradius(V,F,R);
  12. REQUIRE (R.size() == 1);
  13. REQUIRE (R(0) == Approx(sqrt(3.0)/3.0).margin(1e-15));
  14. Eigen::MatrixXd C;
  15. Eigen::MatrixXd B;
  16. igl::circumradius(V,F,R,C,B);
  17. REQUIRE (R.size() == 1);
  18. REQUIRE (R(0) == Approx(sqrt(3.0)/3.0).margin(1e-15));
  19. REQUIRE (C.rows() == 1);
  20. REQUIRE (C.cols() == 2);
  21. REQUIRE (C(0,0) == Approx(0.5).margin(1e-15));
  22. REQUIRE (C(0,1) == Approx(sqrt(3.0)/6.0).margin(1e-15));
  23. REQUIRE (B.rows() == 1);
  24. REQUIRE (B.cols() == 3);
  25. REQUIRE (B(0,0) == Approx(1.0/3.0).margin(1e-15));
  26. REQUIRE (B(0,1) == Approx(1.0/3.0).margin(1e-15));
  27. REQUIRE (B(0,2) == Approx(1.0/3.0).margin(1e-15));
  28. }
  29. TEST_CASE("circumradius: right-triangle", "[igl]" )
  30. {
  31. // Right triangle
  32. Eigen::MatrixXd V(3,2);
  33. V << 0,0, 1,0, 0,1;
  34. Eigen::MatrixXi F(1,3);
  35. F << 0,1,2;
  36. Eigen::VectorXd R;
  37. igl::circumradius(V,F,R);
  38. REQUIRE (R.size() == 1);
  39. REQUIRE (R(0) == Approx(sqrt(2.0)/2.0).margin(1e-15));
  40. Eigen::MatrixXd C;
  41. Eigen::MatrixXd B;
  42. igl::circumradius(V,F,R,C,B);
  43. REQUIRE (R.size() == 1);
  44. REQUIRE (R(0) == Approx(sqrt(2.0)/2.0).margin(1e-15));
  45. REQUIRE (C.rows() == 1);
  46. REQUIRE (C.cols() == 2);
  47. REQUIRE (C(0,0) == Approx(0.5).margin(1e-15));
  48. REQUIRE (C(0,1) == Approx(0.5).margin(1e-15));
  49. REQUIRE (B.rows() == 1);
  50. REQUIRE (B.cols() == 3);
  51. REQUIRE (B(0,0) == Approx(0.0).margin(1e-15));
  52. REQUIRE (B(0,1) == Approx(0.5).margin(1e-15));
  53. REQUIRE (B(0,2) == Approx(0.5).margin(1e-15));
  54. }
  55. // Obtuse
  56. TEST_CASE("circumradius: obtuse-triangle", "[igl]" )
  57. {
  58. Eigen::MatrixXd V(3,2);
  59. V << 0,0, 4,0, 2,1;
  60. Eigen::MatrixXi F(1,3);
  61. F << 0,1,2;
  62. Eigen::VectorXd R;
  63. igl::circumradius(V,F,R);
  64. REQUIRE (R.size() == 1);
  65. REQUIRE (R(0) == Approx(2.5).margin(1e-15));
  66. Eigen::MatrixXd C;
  67. Eigen::MatrixXd B;
  68. igl::circumradius(V,F,R,C,B);
  69. REQUIRE (R.size() == 1);
  70. REQUIRE (R(0) == Approx(2.5).margin(1e-15));
  71. REQUIRE (C.rows() == 1);
  72. REQUIRE (C.cols() == 2);
  73. REQUIRE (C(0,0) == Approx(2).margin(1e-15));
  74. REQUIRE (C(0,1) == Approx(-1.5).margin(1e-15));
  75. REQUIRE (B.rows() == 1);
  76. REQUIRE (B.cols() == 3);
  77. REQUIRE (B(0,0) == Approx(1.25).margin(1e-15));
  78. REQUIRE (B(0,1) == Approx(1.25).margin(1e-15));
  79. REQUIRE (B(0,2) == Approx(-1.5).margin(1e-15));
  80. }
  81. // Tetrahedra test cases
  82. TEST_CASE("circumradius: equilateral-tetrahedra", "[igl]" )
  83. {
  84. // Tetrahedra
  85. Eigen::MatrixXd V(4,3);
  86. V << 0,0,0, 1,0,0, 0.5,sqrt(3.0)/2.0,0, 0.5,sqrt(3.0)/6.0,sqrt(2.0/3.0);
  87. Eigen::MatrixXi T(1,4);
  88. T << 0,1,2,3;
  89. Eigen::VectorXd R;
  90. Eigen::MatrixXd C;
  91. Eigen::MatrixXd B;
  92. igl::circumradius(V,T,R,C,B);
  93. REQUIRE (R.size() == 1);
  94. REQUIRE (R(0) == Approx(sqrt(3.0/8.0)).margin(1e-15));
  95. REQUIRE (C.rows() == 1);
  96. REQUIRE (C.cols() == 3);
  97. REQUIRE (C(0,0) == Approx(0.5).margin(1e-15));
  98. REQUIRE (C(0,1) == Approx(sqrt(3.0)/6.0).margin(1e-15));
  99. REQUIRE (C(0,2) == Approx(sqrt(1.0/24.0)).margin(1e-15));
  100. REQUIRE (B.rows() == 1);
  101. REQUIRE (B.cols() == 4);
  102. REQUIRE (B(0,0) == Approx(0.25).margin(1e-15));
  103. REQUIRE (B(0,1) == Approx(0.25).margin(1e-15));
  104. REQUIRE (B(0,2) == Approx(0.25).margin(1e-15));
  105. REQUIRE (B(0,3) == Approx(0.25).margin(1e-15));
  106. }
  107. TEST_CASE("circumradius: right-tetrahedra", "[igl]" )
  108. {
  109. // Tetrahedra
  110. Eigen::MatrixXd V(4,3);
  111. V << 0,0,0, 1,0,0, 0,1,0, 0,0,1;
  112. Eigen::MatrixXi T(1,4);
  113. T << 0,1,2,3;
  114. Eigen::VectorXd R;
  115. Eigen::MatrixXd C;
  116. Eigen::MatrixXd B;
  117. igl::circumradius(V,T,R,C,B);
  118. REQUIRE (R.size() == 1);
  119. REQUIRE (R(0) == Approx(sqrt(3.0)/2.0).margin(1e-15));
  120. REQUIRE (C.rows() == 1);
  121. REQUIRE (C.cols() == 3);
  122. REQUIRE (C(0,0) == Approx(0.5).margin(1e-15));
  123. REQUIRE (C(0,1) == Approx(0.5).margin(1e-15));
  124. REQUIRE (C(0,2) == Approx(0.5).margin(1e-15));
  125. REQUIRE (B.rows() == 1);
  126. REQUIRE (B.cols() == 4);
  127. REQUIRE (B(0,0) == Approx(-0.5).margin(1e-15));
  128. REQUIRE (B(0,1) == Approx( 0.5).margin(1e-15));
  129. REQUIRE (B(0,2) == Approx( 0.5).margin(1e-15));
  130. REQUIRE (B(0,3) == Approx( 0.5).margin(1e-15));
  131. }
  132. // Obtuse tetrahedron
  133. TEST_CASE("circumradius: obtuse-tetrahedra", "[igl]" )
  134. {
  135. Eigen::MatrixXd V(4,3);
  136. V << 0,0,0, 4,0,0, 2,1,0, 2,1,3;
  137. Eigen::MatrixXi T(1,4);
  138. T << 0,1,2,3;
  139. Eigen::VectorXd R;
  140. Eigen::MatrixXd C;
  141. Eigen::MatrixXd B;
  142. igl::circumradius(V,T,R,C,B);
  143. REQUIRE (R.size() == 1);
  144. REQUIRE (R(0) == Approx(sqrt(17.0/2.0)).margin(1e-15));
  145. REQUIRE (C.rows() == 1);
  146. REQUIRE (C.cols() == 3);
  147. REQUIRE (C(0,0) == Approx(2).margin(1e-15));
  148. REQUIRE (C(0,1) == Approx(-1.5).margin(1e-15));
  149. REQUIRE (C(0,2) == Approx(1.5).margin(1e-15));
  150. REQUIRE (B.rows() == 1);
  151. REQUIRE (B.cols() == 4);
  152. REQUIRE (B(0,0) == Approx(1.25).margin(1e-15));
  153. REQUIRE (B(0,1) == Approx(1.25).margin(1e-15));
  154. REQUIRE (B(0,2) == Approx(-2.0).margin(1e-15));
  155. REQUIRE (B(0,3) == Approx( 0.5).margin(1e-15));
  156. }