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 = 0int b = 0int c = 0) :a(a), b(b), c(c) {}
    // 교점
    pdd operator&(const line &l) {
        db d = db(l.a*- l.b*a);
        return{ db(l.b*- l.c*b) / d,db(l.a*- 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

+ Recent posts