bool Vector2::isLineOverlap(const Vector2& A, const Vector2& B, const Vector2& C, const Vector2& D) { if( (A.x == B.x && A.y == B.y) || (C.x == D.x && C.y == D.y)) return false; if (crossProduct2Vector(A, B, C, D) == 0 && (crossProduct2Vector(C, D, C, A) == 0 || crossProduct2Vector(A, B, C, A) == 0)) return true; return false; }
// TODO: 'denom 이하' 부터 이해하기. bool Vector2::isLineIntersect(const Vector2& A, const Vector2& B, const Vector2& C, const Vector2& D, double *T1, double *T2) { if( (A.x == B.x && A.y == B.y) || (C.x == D.x && C.y == D.y)) return false; const double denom = crossProduct2Vector(A, B, C, D); if (denom == 0) { return false; } if (T1 != nullptr) *T1 = crossProduct2Vector(C, D, C, A) / denom; if (T2 != nullptr) *T2 = crossProduct2Vector(A, B, C, A) / denom; return true; }
bool Point::isLineOverlap(const Point& A, const Point& B, const Point& C, const Point& D) { // FAIL: Line undefined if ( (A.x==B.x && A.y==B.y) || (C.x==D.x && C.y==D.y) ) { return false; } if (crossProduct2Vector(A, B, C, D) == 0 && (crossProduct2Vector(C, D, C, A) == 0 || crossProduct2Vector(A, B, C, A) == 0)) { return true; } return false; }
bool Vector2::isLineParallel(const Vector2& A, const Vector2& B, const Vector2& C, const Vector2& D) { if ( (A.x==B.x && A.y==B.y) || (C.x==D.x && C.y==D.y) ) { return false; } if (crossProduct2Vector(A, B, C, D) == 0) { // line overlap if (crossProduct2Vector(C, D, C, A) == 0 || crossProduct2Vector(A, B, C, A) == 0) { return false; } return true; } return false; }
bool Point::isLineIntersect(const Point& A, const Point& B, const Point& C, const Point& D, float *S, float *T) { // FAIL: Line undefined if ( (A.x==B.x && A.y==B.y) || (C.x==D.x && C.y==D.y) ) { return false; } const float denom = crossProduct2Vector(A, B, C, D); if (denom == 0) { // Lines parallel or overlap return false; } if (S != nullptr) *S = crossProduct2Vector(C, D, C, A) / denom; if (T != nullptr) *T = crossProduct2Vector(A, B, C, A) / denom; return true; }