AOJ 0143 - Altair and Vega
AOJ 0035 - Is it convex? - ノートの切れ端でつかった外積を用いた.
ライブラリつくって使いまわしたい.
#include <iostream> #include <cstdio> struct P{ double x, y; }; typedef P Vector; struct Triangle{ P ps[3]; }; int crossProduct(Vector v1, Vector v2){ return v1.x*v2.y - v1.y*v2.x; } Vector pToVector(P p1, P p2){ return {p1.x-p2.x, p1.y-p2.y}; } bool triangle_contains(Triangle t, P p){ int count = 0; for(int i=0;i<3;i++){ Vector a = pToVector(t.ps[i], t.ps[(i+1)%3]), b = pToVector(p, t.ps[i]); if(crossProduct(a, b) > 0)count++; else count--; } return (count%3 != 0); } int main(){ int n; std::cin >> n; for(;n--;){ P ps[3], k, s; for(int i=0;i<3;i++){ std::cin >> ps[i].x >> ps[i].y; } std::cin >> k.x >> k.y >> s.x >> s.y; Triangle t; for(int i=0;i<3;i++){ t.ps[i] = ps[i]; } bool k_contains = triangle_contains(t, k), s_contains = triangle_contains(t, s); if(k_contains != s_contains){ puts("OK"); }else{ puts("NG"); } } }