| 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 | { |
no test coverage detected