CGL_1_C Counter-Clockwise
Table of contents
# Problem
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=CGL_1_C
Classify relative positions of 2 vectors into 5.
- Counter-clockwise
- Clockwise
- Opposite directions
- Same directions (p1 is further)
- Same directions (p2 is further)
# Explanation
First, calculate cross product.
If cross product is negative, the answer is 1.
If positive, the answer is 2.
If 0, they are on a line and the answer is 3, 4 or 5.
Second, calculate dot product.
If dot product is negative, the answer is 3.
If not, 2 vectors are on the same direction and the answer is 4 or 5.
Finally, calculate the lengths of 2 vectors.
# Solution
Int N;
Vector2 p0, p1, p2, v01;
string msgs[5] = {"COUNTER_CLOCKWISE", "CLOCKWISE", "ONLINE_BACK", "ONLINE_FRONT", "ON_SEGMENT"};
int clk(Vector2 &v01, Vector2 &v02) {
double cross_ = v01.cross(v02);
if (cross_ > 0.0) return 0;
else if (cross_ < 0.0) return 1;
double dot_ = v01.dot(v02);
if (v01.dot(v02) < 0.0) return 2;
if (v01.length() - v02.length() >= 0) return 4;
return 3;
}
void solve() {
Vector2 v02 = p2 - p0;
int msg_idx = clk(v01, v02);
cout << msgs[msg_idx] << endl;
}
void input() {
cin >> p0 >> p1 >> N;
v01 = p1 - p0;
while (cin >> p2) {
solve();
}
}
int main() {
cout.precision(15);
input();
}
Shun
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!