CGL_2_B Intersection

Calendar Clock iconCalendar Clock icon

AOJ

Table of contents

# Problem

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=CGL_2_B

Determin if 2 segments intersect each other.

# Solution

Define the return value of function cw

  1. 1: Counter-clockwise
  2. -1: Clockwise
  3. 0: On segment
  4. other integer xx: on a line, but out of segment

The result of the product of the 2 cw means:

  1. 1: no intersection.
  2. -1: They intersect.
  3. 0: They intersect. 4 points on a line. Either vertex of segment is on the other segment
  4. x2x^2: no intersection. 4 points on a line, but no common part.
// C++ 14
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <unordered_map>
#include <math.h>

#define ll long long
#define Int int
#define loop(x, start, end) for(Int x = start; x < end; x++)
#define loopdown(x, start, end) for(int x = start; x > end; x--)
#define rep(n) for(int x = 0; x < n; x++)
#define span(a,x,y) a.begin()+x,a.begin()+y
#define span_all(a) a.begin(),a.end()
#define len(x) (x.size())
#define last(x) (*(x.end()-1))

using namespace std;

#define EPS 0.0000000001
#define fequals(a,b) (fabs((a) - (b)) < EPS)

class Vector2 {
public:
  double x, y;
  
  Vector2(double x = 0, double y = 0): x(x), y(y) {}
  
  Vector2 operator + (const Vector2 v) const { return Vector2(x + v.x, y + v.y); }
  Vector2 operator - (const Vector2 v) const { return Vector2(x - v.x, y - v.y); }
  Vector2 operator * (const double k) const { return Vector2(x * k, y * k); }
  Vector2 operator / (const double k) const { return Vector2(x / k, y / k); }
  
  double length() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  double dot (Vector2 const v) { return x * v.x + y * v.y; }
  double cross (Vector2 const v) { return x * v.y - y * v.x; }
  
  bool parallel(Vector2 &other) {
    return fequals(0, cross(other));
  }
  
  bool orthogonal(Vector2 &other) {
    return fequals(0, dot(other));
  }
  
  bool operator < (const Vector2 &v) {
    return x != v.x ? x < v.x : y < v.y;
  }
  
  bool operator == (const Vector2 &v) {
    return fabs(x - v.x) < EPS && fabs(y - v.y) < EPS;
  }
};

ostream & operator << (ostream & out, Vector2 const & v) { 
  out<< "Vector2(" << v.x << ", " << v.y << ')';
  return out;
}

istream & operator >> (istream & in, Vector2 & v) { 
  double x, y;
  in >> x;
  in >> y;
  v.x = x;
  v.y = y;
  return in;
}
Int N;
Vector2 p0, p1, p2, p3;

int cw(Vector2 v01, Vector2 v02) {
  double cross_ = v01.cross(v02);
  if (cross_ > EPS) return 1; // above segment
  else if (cross_ < -EPS) return -1; // beneath segment
  if (v01.dot(v02) < 0) return 2; // opposite
  if (v01.length() - v02.length() >= 0) return 0; // on segment
  return -2; // out of segment
}

void solve() {
  int cw1 = cw(p1 - p0, p2 - p0) * cw(p1 - p0, p3 - p0);
  int cw2 = cw(p3 - p2, p1 - p2) * cw(p3 - p2, p0 - p2);
  if (cw1 <= 0 && cw2 <= 0) cout << 1 << endl;
  else cout << 0 << endl;
}

void input() {
  cin >> N;
  while (cin >> p0 >> p1 >> p2 >> p3) {
    solve();
  }
}

int main() {
  cout.precision(15);
  input();
}

Remote freelancer. A web and mobile application enginner.
Traveling around the world based on East Asia.
I'm looking forward to your job offers from all over the world!

Offer jobs or contact me!

Comments