Tuesday, May 3, 2016

UVa 11178 - Morley's Theorem

Accepted date: 2016-05-03
Run Time: 0.020
Ranking (as of 2016-05-03): 43 out of 433
Language: C++

/*
  UVa 11178 - Morley's Theorem

  To build using Visual Studio 2012:
    cl -EHsc -O2 UVa_11178_Morleys_Theorem.cpp
*/

#include <cstdio>
#include <cmath>

struct point {
  double x_, y_;

  point() {}
  point(double x, double y) : x_(x), y_(y) {}
};

double square_distance(const point& p, const point& q)
{
  double dx = p.x_ - q.x_, dy = p.y_ - q.y_;
  return dx * dx + dy * dy;
}

point pA, pB, pC, pD, pE, pF;
double as, bs, cs, a, b, c, A, B, C;

point trilinear_to_cartesian(double x, double y, double z)
{
  double d = a * x + b * y + c * z;
  return point(a * x / d * pA.x_ + b * y / d * pB.x_ + c * z / d * pC.x_,
    a * x / d * pA.y_ + b * y / d * pB.y_ + c * z / d * pC.y_);
}
 
int main()
{
  int N;
  scanf("%d", &N);
  while (N--) {
    scanf("%lf %lf %lf %lf %lf %lf", &pA.x_, &pA.y_, &pB.x_, &pB.y_, &pC.x_, &pC.y_);
    as = square_distance(pB, pC), bs = square_distance(pC, pA), cs = square_distance(pA, pB);
    a = sqrt(as), b = sqrt(bs), c = sqrt(cs);
    A = acos((bs + cs - as) / (2.0 * b * c)), B = acos((cs + as - bs) / (2.0 * c * a)),
      C = acos((as + bs - cs) / (2.0 * a * b));
    pD = trilinear_to_cartesian(1.0, 2.0 * cos(C / 3.0), 2.0 * cos(B / 3.0)),
      pE = trilinear_to_cartesian(2.0 * cos(C / 3.0), 1.0, 2.0 * cos(A / 3.0)),
      pF = trilinear_to_cartesian(2.0 * cos(B / 3.0), 2.0 * cos(A / 3.0), 1.0);
    printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n", pD.x_, pD.y_, pE.x_, pE.y_, pF.x_, pF.y_);
  }
  return 0;
}

No comments:

Post a Comment