predicates.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. #include <igl/predicates/predicates.h>
  2. #include <predicates.h>
  3. namespace igl {
  4. namespace predicates {
  5. using REAL = double;
  6. template<typename Vector2D>
  7. IGL_INLINE Orientation orient2d(
  8. const Eigen::MatrixBase<Vector2D>& pa,
  9. const Eigen::MatrixBase<Vector2D>& pb,
  10. const Eigen::MatrixBase<Vector2D>& pc) {
  11. using Point = Eigen::Matrix<REAL, Eigen::Dynamic, Eigen::Dynamic>;
  12. const Point& a = pa.template cast<REAL>();
  13. const Point& b = pb.template cast<REAL>();
  14. const Point& c = pc.template cast<REAL>();
  15. auto r = ::orient2d(
  16. const_cast<REAL*>(a.data()),
  17. const_cast<REAL*>(b.data()),
  18. const_cast<REAL*>(c.data()));
  19. if (r > 0) return Orientation::POSITIVE;
  20. else if (r < 0) return Orientation::NEGATIVE;
  21. else return Orientation::COLLINEAR;
  22. }
  23. template<typename Vector3D>
  24. IGL_INLINE Orientation orient3d(
  25. const Eigen::MatrixBase<Vector3D>& pa,
  26. const Eigen::MatrixBase<Vector3D>& pb,
  27. const Eigen::MatrixBase<Vector3D>& pc,
  28. const Eigen::MatrixBase<Vector3D>& pd) {
  29. using Point = Eigen::Matrix<REAL, Eigen::Dynamic, Eigen::Dynamic>;
  30. const Point& a = pa.template cast<REAL>();
  31. const Point& b = pb.template cast<REAL>();
  32. const Point& c = pc.template cast<REAL>();
  33. const Point& d = pd.template cast<REAL>();
  34. auto r = ::orient3d(
  35. const_cast<REAL*>(a.data()),
  36. const_cast<REAL*>(b.data()),
  37. const_cast<REAL*>(c.data()),
  38. const_cast<REAL*>(d.data()));
  39. if (r > 0) return Orientation::POSITIVE;
  40. else if (r < 0) return Orientation::NEGATIVE;
  41. else return Orientation::COPLANAR;
  42. }
  43. template<typename Vector2D>
  44. IGL_INLINE Orientation incircle(
  45. const Eigen::MatrixBase<Vector2D>& pa,
  46. const Eigen::MatrixBase<Vector2D>& pb,
  47. const Eigen::MatrixBase<Vector2D>& pc,
  48. const Eigen::MatrixBase<Vector2D>& pd) {
  49. using Point = Eigen::Matrix<REAL, Eigen::Dynamic, Eigen::Dynamic>;
  50. const Point& a = pa.template cast<REAL>();
  51. const Point& b = pb.template cast<REAL>();
  52. const Point& c = pc.template cast<REAL>();
  53. const Point& d = pd.template cast<REAL>();
  54. auto r = ::incircle(
  55. const_cast<REAL*>(a.data()),
  56. const_cast<REAL*>(b.data()),
  57. const_cast<REAL*>(c.data()),
  58. const_cast<REAL*>(d.data()));
  59. if (r > 0) return Orientation::INSIDE;
  60. else if (r < 0) return Orientation::OUTSIDE;
  61. else return Orientation::COCIRCULAR;
  62. }
  63. template<typename Vector3D>
  64. IGL_INLINE Orientation insphere(
  65. const Eigen::MatrixBase<Vector3D>& pa,
  66. const Eigen::MatrixBase<Vector3D>& pb,
  67. const Eigen::MatrixBase<Vector3D>& pc,
  68. const Eigen::MatrixBase<Vector3D>& pd,
  69. const Eigen::MatrixBase<Vector3D>& pe) {
  70. using Point = Eigen::Matrix<REAL, Eigen::Dynamic, Eigen::Dynamic>;
  71. const Point& a = pa.template cast<REAL>();
  72. const Point& b = pb.template cast<REAL>();
  73. const Point& c = pc.template cast<REAL>();
  74. const Point& d = pd.template cast<REAL>();
  75. const Point& e = pe.template cast<REAL>();
  76. auto r = ::insphere(
  77. const_cast<REAL*>(a.data()),
  78. const_cast<REAL*>(b.data()),
  79. const_cast<REAL*>(c.data()),
  80. const_cast<REAL*>(d.data()),
  81. const_cast<REAL*>(e.data()));
  82. if (r > 0) return Orientation::INSIDE;
  83. else if (r < 0) return Orientation::OUTSIDE;
  84. else return Orientation::COSPHERICAL;
  85. }
  86. }
  87. }
  88. #ifdef IGL_STATIC_LIBRARY
  89. // Explicit template instantiation
  90. template
  91. igl::predicates::Orientation
  92. igl::predicates::orient2d<Eigen::Matrix<double, -1, -1, 1, -1, -1>>
  93. (
  94. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  95. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  96. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&
  97. );
  98. template
  99. igl::predicates::Orientation
  100. igl::predicates::orient2d<Eigen::Matrix<float, -1, -1, 1, -1, -1>>
  101. (
  102. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  103. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  104. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&
  105. );
  106. template
  107. igl::predicates::Orientation
  108. igl::predicates::orient2d<Eigen::Matrix<double, -1, -1, 0, -1, -1>>
  109. (
  110. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  111. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  112. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&
  113. );
  114. template
  115. igl::predicates::Orientation
  116. igl::predicates::orient2d<Eigen::Matrix<float, -1, -1, 0, -1, -1>>
  117. (
  118. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  119. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  120. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&
  121. );
  122. template
  123. igl::predicates::Orientation
  124. igl::predicates::orient3d<Eigen::Matrix<double, -1, -1, 1, -1, -1>>
  125. (
  126. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  127. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  128. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  129. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&
  130. );
  131. template
  132. igl::predicates::Orientation
  133. igl::predicates::orient3d<Eigen::Matrix<float, -1, -1, 1, -1, -1>>
  134. (
  135. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  136. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  137. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  138. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&
  139. );
  140. template
  141. igl::predicates::Orientation
  142. igl::predicates::orient3d<Eigen::Matrix<double, -1, -1, 0, -1, -1>>
  143. (
  144. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  145. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  146. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  147. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&
  148. );
  149. template
  150. igl::predicates::Orientation
  151. igl::predicates::orient3d<Eigen::Matrix<float, -1, -1, 0, -1, -1>>
  152. (
  153. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  154. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  155. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  156. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&
  157. );
  158. template
  159. igl::predicates::Orientation
  160. igl::predicates::incircle<Eigen::Matrix<double, -1, -1, 1, -1, -1>>
  161. (
  162. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  163. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  164. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  165. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&
  166. );
  167. template
  168. igl::predicates::Orientation
  169. igl::predicates::incircle<Eigen::Matrix<float, -1, -1, 1, -1, -1>>
  170. (
  171. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  172. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  173. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  174. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&
  175. );
  176. template
  177. igl::predicates::Orientation
  178. igl::predicates::incircle<Eigen::Matrix<double, -1, -1, 0, -1, -1>>
  179. (
  180. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  181. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  182. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  183. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&
  184. );
  185. template
  186. igl::predicates::Orientation
  187. igl::predicates::incircle<Eigen::Matrix<float, -1, -1, 0, -1, -1>>
  188. (
  189. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  190. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  191. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  192. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&
  193. );
  194. template
  195. igl::predicates::Orientation
  196. igl::predicates::insphere<Eigen::Matrix<double, -1, -1, 1, -1, -1>>
  197. (
  198. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  199. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  200. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  201. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&,
  202. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 1, -1, -1>>&
  203. );
  204. template
  205. igl::predicates::Orientation
  206. igl::predicates::insphere<Eigen::Matrix<float, -1, -1, 1, -1, -1>>
  207. (
  208. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  209. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  210. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  211. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&,
  212. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 1, -1, -1>>&
  213. );
  214. template
  215. igl::predicates::Orientation
  216. igl::predicates::insphere<Eigen::Matrix<double, -1, -1, 0, -1, -1>>
  217. (
  218. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  219. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  220. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  221. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&,
  222. const Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1>>&
  223. );
  224. template
  225. igl::predicates::Orientation
  226. igl::predicates::insphere<Eigen::Matrix<float, -1, -1, 0, -1, -1>>
  227. (
  228. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  229. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  230. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  231. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&,
  232. const Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1>>&
  233. );
  234. #endif