Advertisement
erfanul007

UVa 190

Jun 29th, 2021
922
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.90 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define all(v)          v.begin(), v.end()
  5. #define unq(v)          sort(all(v)),(v).resize(unique(all(v))-v.begin())
  6. #define PI              acos(-1.0)  // 3.1415926535897932
  7. #define eps             1e-9
  8. #define radianof(x)     x * (PI / 180.0)
  9. #define degreeof(x)     x * (180.0 / PI)
  10. #define fixdouble(x)    cout << fixed << setprecision(x)
  11.  
  12. typedef double T;
  13.  
  14. #ifdef ERFANUL007
  15.     #define debug(...) __f(#__VA_ARGS__, __VA_ARGS__)
  16.     template < typename Arg1 >
  17.     void __f(const char* name, Arg1&& arg1){
  18.         cout << name << " = " << arg1 << std::endl;
  19.     }
  20.     template < typename Arg1, typename... Args>
  21.     void __f(const char* names, Arg1&& arg1, Args&&... args){
  22.         const char* comma = strchr(names, ',');
  23.         cout.write(names, comma - names) << " = " << arg1 <<" | ";
  24.         __f(comma+1, args...);
  25.     }
  26. #else
  27.     #define debug(...)
  28. #endif
  29.  
  30. struct PT{
  31.     T x, y;
  32.  
  33.     PT(){}
  34.     PT(T x, T y) : x(x), y(y) {}
  35.  
  36.     inline void input() {
  37.         double _x, _y;
  38.         scanf("%lf %lf", &_x, &_y);
  39.         x = _x, y = _y;
  40.     }
  41.     inline void output() {
  42.         printf("{%.1f, %.1f}\n", (double)x, (double)y);
  43.     }
  44.     inline bool operator == (const PT &p) const {
  45.         return (abs(x - p.x) < eps && abs(y - p.y) < eps);
  46.     }
  47.     inline bool operator < (const PT &p) const {
  48.         return ((x + eps < p.x) || (abs(x - p.x) < eps && y + eps < p.y));
  49.     }
  50. } origin = PT(0, 0);
  51. //-----------operators-----------//
  52. inline PT operator + (const PT &u, const PT &v) {
  53.     return PT(u.x + v.x, u.y + v.y);
  54. }
  55. inline PT operator - (const PT &u, const PT &v) {
  56.     return PT(u.x - v.x, u.y - v.y);
  57. }
  58. inline PT operator * (const PT &u, const PT &v) {
  59.     return PT(u.x * v.x - u.y * v.y, u.x * v.y + v.x * u.y);
  60. } // multiplying two complex numbers
  61. inline PT operator * (const PT &u, const T &d) {
  62.     return PT(u.x * d, u.y * d);
  63. }
  64. inline PT operator * (const T &d, const PT &u) {
  65.     return PT(u.x * d, u.y * d);
  66. }
  67. inline PT operator / (const PT &u, const T &d) {
  68.     return PT(u.x / d, u.y / d);
  69. }
  70. //---------basic tools---------//
  71. T sqnorm(const PT &u) {
  72.     return (u.x * u.x) + (u.y * u.y);
  73. }
  74. // double norm(const PT &u) {
  75. //     return sqrt(sqnorm(u)); // |u|
  76. // }
  77. #define norm(u) sqrt(sqnorm(u))
  78. PT unit_vector(const PT &u) {
  79.     assert(norm(u) > eps);
  80.     return (u / (T)norm(u)); // u/|u|
  81. }
  82. T dot(const PT &u, const PT &v) {
  83.     return (u.x * v.x) + (u.y * v.y);
  84. }
  85. T cross(const PT &u, const PT &v) {
  86.     return (u.x * v.y) - (v.x * u.y);
  87. }
  88. double angle(const PT &u, const PT &v) { // u.v = |u||v|cos(theta)
  89.     assert(norm(u) * norm(v) > eps);
  90.     return acos(dot(u, v) / (norm(u) * norm(v)));
  91. }
  92. /* r = sqrt(x*x + y*y), theta = atan(y/x) [in radian] */
  93. PT toPolar(const PT &p){
  94.     assert(abs(p.x) > eps);
  95.     return PT(norm(p), atan(p.y/p.x)); // {r, theta}
  96. }
  97. /* x = r * cos(theta), y = r * sin(theta) [in radian] */
  98. PT toCartesian(const PT &p){
  99.     return PT(p.x * cos(p.y), p.x * sin(p.y)); // {x, y}
  100. }
  101. PT extend(const PT &u, const PT &v, const T &len) {
  102.     return v + unit_vector(v - u) * len; // parametric equation
  103. }
  104. PT projection(const PT &u, const PT &v, const PT &p) {
  105.     assert(norm(v - u) > eps);
  106.     return u + unit_vector(v - u) * (T)(dot(v - u, p - u) / norm(v - u));
  107. }
  108. PT rtt(const PT &piv, const PT &u, const double &theta) {
  109.     return (u - piv) * toCartesian(PT(1.0, theta)) + piv;
  110. }
  111. //---------being a vector guy---------//
  112. /* area of Parallelogram abc and d = a+b */
  113. T TriArea(const PT &a, const PT &b, const PT &c){
  114.     return cross(b - a, c - a); // + acw, - ccw, 0 linear
  115. }
  116. /* line ab to point c */
  117. int orientation(const PT &a, const PT &b, const PT &c) {
  118.     T val = (b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y);
  119.     if(abs(val) < eps) return 0;      // 0 linear
  120.     return val > eps ? 1 : -1;    // + ccw, - acw
  121. }
  122. /* point c is on segment ab or not */
  123. bool isOnSegment(const PT &a, const PT &b, const PT &c){
  124.     if(abs(norm(b - a) - norm(c - a) - norm(b - c)) < eps) return true;
  125.     return false;
  126. }
  127. /*line ab and line cd is parallel if ab X cd = 0 */
  128. bool ifParallel(const PT &a, const PT &b, const PT &c, const PT &d){
  129.     return abs(cross(a - b, c - d)) < eps;
  130. }
  131. /*line ab and line cd is perpendicular if ab . cd = 0 */
  132. bool ifPerpendicular(const PT &a, const PT &b, const PT &c, const PT &d){
  133.     return abs(dot(a - b, c - d)) < eps;
  134. }
  135. /* segment ab and segment cd intersect or not */
  136. bool isSegIntersect(const PT &a, const PT &b, const PT &c, const PT &d){
  137.     return (orientation(a, b, c) != orientation(a, b, d)
  138.         && orientation(c, d, a) != orientation(c, d, b));
  139. }
  140. PT LineIntersection(const PT &a, const PT &b, const PT &p, const PT &q){
  141.     assert(abs(cross(b - a, p - q)) > eps);
  142.     return a + (b - a) * cross(p - a, p - q) / cross(b - a, p - q);
  143. }
  144. PT _f;
  145. /* angular sort _f = arr[0] */
  146. bool CC(const PT &a, const PT &b){
  147.     return (_f.x-a.x)*(_f.y-b.y)<(_f.x-b.x)*(_f.y-a.y);
  148. }
  149. bool CCW(PT &a,PT &b){
  150.     return (_f.x-a.x)*(_f.y-b.y)>(_f.x-b.x)*(_f.y-a.y);
  151. }
  152. /* Radial Sort: _f = any extreme point of hull */
  153. bool ClockCmp(const PT &a, const PT &b){
  154.     int val = orientation(_f, a, b);
  155.     if(val == 0) return (sqnorm(a - _f) + eps) < sqnorm(b - _f);
  156.     return val > 0;
  157. }
  158. bool AClockCmp(const PT &a, const PT &b){
  159.     int val = orientation(_f, a, b);
  160.     if(val == 0) return (sqnorm(a - _f) + eps) < sqnorm(b - _f);
  161.     return val < 0;
  162. }
  163. //----------------------------------//
  164.  
  165. int main()
  166. {
  167.     #ifdef ERFANUL007
  168.         clock_t tStart = clock();
  169.         freopen("input.txt", "r", stdin);
  170.         freopen("output.txt", "w", stdout);
  171.     #endif
  172.  
  173.     double x1, y1, x2, y2, x3, y3;
  174.  
  175.     while(cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3){
  176.         PT A(x1, y1), B(x2, y2), C(x3, y3);
  177.         PT midAB = (A + B)/2;
  178.         PT rot_midAB = rtt(midAB, A, radianof(90));
  179.         PT midAC = (A + C)/2;
  180.         PT rot_midAC = rtt(midAC, A, radianof(90));
  181.         PT center = LineIntersection(midAB, rot_midAB, midAC, rot_midAC);
  182.         double r = norm(center - A);
  183.         printf("(x %c %.3f)^2 + (y %c %.3f)^2 = %.3f^2\n", (center.x > 0) ? '-' : '+',
  184.                                                             abs(center.x),
  185.                                                             (center.y > 0) ? '-' : '+',
  186.                                                             abs(center.y),
  187.                                                             r);
  188.         double val = sqnorm(center) - r * r;
  189.         printf("x^2 + y^2 %c %.3fx %c %.3fy %c %.3f = 0\n\n", (center.x > 0) ? '-' : '+',
  190.                                                             (abs(center.x * 2)),
  191.                                                             (center.y > 0) ? '-' : '+',
  192.                                                             (abs(center.y *2)),
  193.                                                             (val < 0) ? '-' : '+',
  194.                                                             abs(val));
  195.     }
  196.  
  197.  
  198.     #ifdef ERFANUL007
  199.         fprintf(stderr, "\n>> Runtime: %.10fs\n", (double) (clock() - tStart) / CLOCKS_PER_SEC);
  200.     #endif
  201.  
  202.     return 0;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement