Possible Duplicate:
How do you detect where two line segments intersect?
Determining if two line segments intersect?
Given are two lines l1=((A0, B0), (A1, B1)) and l2=((A2, B2), (A3, B3)); Ax, Bx are integers and (Ax, Bx) specify the starts and ends of the lines.
Is there a algorithm using only integer arithmetic that determines if l1 and l2 intersect? (Only a Boolean answer is needed.)
My own approach was to compute a point near the intersection point with fixed-point arithmetic. The solution (a, b) was then substituted in the following equations:
I: abs((A0 + a * (A1-A0)) - (A2 + b * (A3-A2))) II: abs((B0 + a * (B1-B0)) - (B2 + b * (B3-B2)))
My method should return true if both I and II evaluate to true.
My C++-Code:
vec.h:
#ifndef __MY_VECTOR__ #define __MY_VECTOR__ #include template class vec { private: VType data[dim]; public: vec(){} vec(VType v0, ...){ data[0] = v0; va_list l; va_start(l, v0); for(unsigned int i=1; i vec helpArith1(const vec& A, long delta){ vec r(A); for(unsigned int i=0; i vec operator*(const vec& v, long delta) { return helpArith1(A, delta); } template vec operator*(long delta, const vec& v){ return v * delta; } template vec operator/(const vec& A, long delta) { return helpArith1(A, delta); } template vec helpArith2(const vec& A, const vec& B){ vec r; for(unsigned int i=0; i vec operator+(const vec& A, const vec& B){ return helpArith2(A, B); } template vec operator-(const vec& A, const vec& B){ return helpArith2(A, B); } template bool operator==(const vec& A, const vec& B) { for(unsigned int i==0; i bool operator!=(const vec& A, const vec& B) { return !(A==B); } #endif
line.h:
#ifndef __MY_LINE__ #define __MY_LINE__ #include "vec.h" unsigned long int ggt(unsigned long int A, unsigned long int B) { if(A==0) { if(B==0) { return 1; } return B; } while(B!=0) { unsigned long int temp = A % B; A = B; B = temp; } return A; } #define ABS(n) ( ((n) A, B; explicit line(long int iA_0, long int iA_1, long int iB_0, long int iB_1) : A(vec(iA_0(iB_0 slope() const{ vec temp = A-B; if(temp[0] sl1 = l1.slope(), sl2 = l2.slope(); // l2.A + b*sl2 = l1.A + a*sl1 // l2.A - l1.A = a*sl1 - b*sl2 // = (I, II)^T // I': sl2[1] * I; II': sl2[0] * II vec L = l2.A - l1.A, R = sl1; L[0] = L[0] * sl2[1]; R[0] = R[0] * sl2[1]; L[1] = L[1] * sl2[0]; R[1] = R[1] * sl2[0]; // I' - II' long int L_SUB = L[0] - L[1], R_SUB = R[0] - R[1]; if(ABS(R_SUB) == 0) { return ABS(L_SUB) == 0; } long int temp = ggt(ABS(L_SUB), ABS(R_SUB)); L_SUB /= temp; R_SUB /= temp; // R_SUB * a = L_SUB long int a = L_SUB/R_SUB, b = ((l1.A[0] - l2.A[0])*R_SUB + L_SUB * sl1[0])/R_SUB; // if the given lines intersect, then {a, b} must be the solution of // l2.A - l1.A = a*sl1 - b*sl2 L = l2.A - l1.A; long x = ABS((L[0]- (a*sl1[0]-b*sl2[0]))), y = ABS((L[1]- (a*sl1[1]-b*sl2[1]))); return x
main.cpp:
#include "line.h" int main(){ line A(0, 0, 6, 0), B(3, 3, 4, -3); bool temp = intersect(A, B); return 0; }
(I am not sure if my intersect function works for all lines, but with the test data I used so far it returned with the correct result.)