MCPcopy Create free account
hub / github.com/cutdigital/mcut / compute_segment_intersection

Function compute_segment_intersection

source/math.cpp:828–876  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

826 }
827
828 char compute_segment_intersection(
829 const vec2& a, const vec2& b, const vec2& c,
830 const vec2& d, vec2& p, double& s, double& t)
831 {
832 // double s, t; /* The two parameters of the parametric eqns. */
833 double num, denom; /* Numerator and denominator of equations. */
834 char code = '?'; /* Return char characterizing intersection.*/
835
836 denom = a[0] * (d[1] - c[1]) + //
837 b[0] * (c[1] - d[1]) + //
838 d[0] * (b[1] - a[1]) + //
839 c[0] * (a[1] - b[1]);
840
841 /* If denom is zero, then segments are parallel: handle separately. */
842 if (denom == double(0.0)) {
843 return Parallellnt(a, b, c, d, p);
844 }
845
846 num = a[0] * (d[1] - c[1]) + //
847 c[0] * (a[1] - d[1]) + //
848 d[0] * (c[1] - a[1]);
849
850 if ((num == double(0.0)) || (num == denom)) {
851 code = 'v';
852 }
853
854 s = num / denom;
855
856 num = -(a[0] * (c[1] - b[1]) + //
857 b[0] * (a[1] - c[1]) + //
858 c[0] * (b[1] - a[1]));
859
860 if ((num == double(0.0)) || (num == denom)) {
861 code = 'v';
862 }
863
864 t = num / denom;
865
866 if ((double(0.0) < s) && (s < double(1.0)) && (double(0.0) < t) && (t < double(1.0))) {
867 code = '1';
868 } else if ((double(0.0) > s) || (s > double(1.0)) || (double(0.0) > t) || (t > double(1.0))) {
869 code = '0';
870 }
871
872 p[0] = a[0] + s * (b[0] - a[0]);
873 p[1] = a[1] + s * (b[1] - a[1]);
874
875 return code;
876 }
877
878 inline bool point_in_bounding_box(const vec2& point, const bounding_box_t<vec2>& bbox)
879 {

Callers 2

triangulate_faceFunction · 0.85

Calls 1

ParallellntFunction · 0.85

Tested by

no test coverage detected