ABC002 C - 直訴


Tags:cpatcodergeometrydiff_experimentaldiff_brown

問題

https://atcoder.jp/contests/abc002/tasks/abc002_3

問題文

A=(xa,ya),B=(xb,yb),C=(xc,yc)A=(x_a, y_a), B=(x_b, y_b), C=(x_c, y_c) がこの順に与えられる。ABC\triangle ABC の面積は?

制約

  • xi,yi1000|x_i|, |y_i| \le 1000
  • A,B,CA, B, C は同一直線上にない
  • 絶対誤差 10210^{-2} まで許容される

サンプル

I/O 1

1 0 3 0 2 5
5.0

I/O 2

-1 -2 3 4 5 6
2.0

I/O 3

298 520 903 520 4 663
43257.5

考察

まあいろんなやり方あるけど、ヘロンの公式を知っていますか? (ヒントがあったけどガン無視)

ヘロンの公式

ABC\triangle ABC において、 a=BC,b=CA,c=ABa = BC, b = CA, c = AB とする (順番は気にしないけど、3 辺の長さ)。
このとき、 s=a+b+c2s = \frac{a+b+c}{2} として、 ABC=s(sa)(sb)(sc)\triangle ABC = \sqrt{s (s - a) (s - b) (s - c)} が成り立つ。

証明は略。

コード

https://atcoder.jp/contests/abc002/submissions/27501700

double sqr(double x) { return x * x; }
int main() {
  double ax, ay, bx, by, cx, cy;
  cin >> ax >> ay >> bx >> by >> cx >> cy;
  double a = sqrt(sqr(ax - bx) + sqr(ay - by));
  double b = sqrt(sqr(bx - cx) + sqr(by - cy));
  double c = sqrt(sqr(cx - ax) + sqr(cy - ay));
  double s = (a + b + c) / 2;
  cout << fixed << setprecision(5) << sqrt(s * (s - a) * (s - b) * (s - c)) << endl;
}