ax + by + c = 0 형태의 직선방정식 a,b,c 세개가 주어질 때 만들어지는 삼각형의 넓이를 구하는 문제다.
삼각형이 형성되지 않는 경우는
1. 평행한 직선이 있거나 (평행하다에 동일한 직선도 포함)
2. 세 직선이 한 점에서 만나거나
하는 경우다.
두 직선 A,B가 평행한 경우는 A.x계수*B.y계수 == A.y계수*B.x계수 일 때다.
두 직선의 교점을 구하는 방법이나 점 세개를 가지고 삼각형의 넓이를 구하는 방법은 구글링 하면 바로 나온다.
그리고 세 직선이 한 점에서 만나는 경우는 따로 걸러줄 필요가 없는게 교점이 모두 같은 곳이기 때문에 어차피 넓이는 0으로 나온다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <stdio.h> #include <algorithm> using namespace std; typedef double db; typedef pair<db, db> pdd; struct line { int a, b, c; line(int a = 0, int b = 0, int c = 0) :a(a), b(b), c(c) {} // 교점 pdd operator&(const line &l) { db d = db(l.a*b - l.b*a); return{ db(l.b*c - l.c*b) / d,db(l.a*c - l.c*a) / (-d) }; } }; // 넓이 db r(pdd a, pdd b, pdd c) { return abs(a.first*b.second + b.first*c.second + c.first*a.second - (a.first*c.second + c.first*b.second + b.first*a.second)) / 2; } // 평행 확인 bool pr(line a, line b) { return a.a*b.b == a.b*b.a; } int t; int main() { scanf("%d", &t); while (t--) { line l[3]; for (int i = 0; i < 3; i++) scanf("%d%d%d", &l[i].a, &l[i].b, &l[i].c); pdd pt[3] = { l[0] & l[1],l[1] & l[2],l[0] & l[2] }; db ans; if (pr(l[0],l[1])|pr(l[1], l[2])|pr(l[0], l[2])) ans = 0; else ans = r(pt[0], pt[1], pt[2]); printf("%.4lf\n", ans); } return 0; } | cs |
'BOJ' 카테고리의 다른 글
6603 로또 (0) | 2017.09.01 |
---|---|
2644 촌수계산 (0) | 2017.09.01 |
2917 늑대 사냥꾼 (1) | 2017.08.31 |
3372 보드 점프 (0) | 2017.08.31 |
11762 A Towering Problem (0) | 2017.08.31 |