• poj 1329 Circle Through Three Points(求圆心+输出)


    题目链接:http://poj.org/problem?id=1329

    输出很蛋疼,要考虑系数为0,输出也不同

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    
    const double eps = 1e-8;
    const double PI = acos(-1.0);
    const double INF = 1000000000000000.000;
    
    struct Point
    {
        double x,y;
        Point(double x=0, double y=0) : x(x),y(y) { }   //构造函数
    };
    typedef Point Vector;
    
    struct Circle
    {
        Point c;
        double r;
        Circle() {}
        Circle(Point c,double r): c(c),r(r) {}
    };
    Vector operator + (Vector A , Vector B)
    {
        return Vector(A.x+B.x,A.y+B.y);
    }
    Vector operator - (Vector A , Vector B)
    {
        return Vector(A.x-B.x,A.y-B.y);
    }
    Vector operator * (Vector A,  double p)
    {
        return Vector(A.x*p,A.y*p);
    }
    Vector operator / (Vector A , double p)
    {
        return Vector(A.x/p,A.y/p);
    }
    
    bool operator < (const Point& a,const Point& b)
    {
        return a.x < b.x ||( a.x == b.x && a.y < b.y);
    }
    
    int dcmp(double x)
    {
        if(fabs(x) < eps) return 0;
        else              return x < 0 ? -1 : 1;
    }
    bool operator == (const Point& a, const Point& b)
    {
        return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0;
    }
    
    ///向量(x,y)的极角用atan2(y,x);
    inline double Dot(Vector A, Vector B)
    {
        return A.x*B.x + A.y*B.y;
    }
    inline double Length(Vector A)
    {
        return sqrt(Dot(A,A));
    }
    inline double Angle(Vector A, Vector B)
    {
        return acos(Dot(A,B) / Length(A) / Length(B));
    }
    double Cross(Vector A, Vector B)
    {
        return A.x*B.y - A.y * B.x;
    }
    Vector vecunit(Vector v)
    {
        return v / Length(v);   //单位向量
    }
    
    Point read_point()
    {
        Point A;
        scanf("%lf %lf",&A.x,&A.y);
        return A;
    }
    Vector Normal(Vector A)
    {
        double L = Length(A);
        return Vector(-A.y/L, A.x/L);
    }
    Point GetLineIntersecion(Point P, Vector v,Point Q,Vector w)
    {
        Vector u = P - Q;
        double t = Cross(w,u)/Cross(v,w);
        return P + v*t;
    }
    
    //多边形
    //求面积
    double PolygonArea(Point* p,int n)    //n个点
    {
        double area = 0;
        for(int i=1; i<n-1; i++)
        {
            area += Cross(p[i]-p[0],p[i+1]-p[0]);
        }
        return area/2;
    }
    
    /*************************************分 割 线*****************************************/
    
    int main()
    {
        //freopen("E:\acm\input.txt","r",stdin);
    
        Point A,B,C,O;
        double R;
        while(scanf("%lf %lf %lf %lf %lf %lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y) == 6)
        {
    
            Point mid1 = (A+B)/2;
            Point mid2 = (B+C)/2;
            Vector v1 = Normal(A-B);
            Vector v2 = Normal(B-C);
    
            O = GetLineIntersecion(mid1,v1,mid2,v2);
            R = Length(O-A);
    
            if(dcmp(O.x)>0)          printf("(x - %.3f)^2 + ",O.x);
            else if(dcmp(O.x) == 0)  printf("x^2 + ",O.x);
            else                     printf("(x + %.3f)^2 + ",-O.x);
            if(dcmp(O.y)>0)          printf("(y - %.3f)^2 = ",O.y);
            else if(dcmp(O.y) == 0)  printf("y^2 = ",O.y);
            else                     printf("(y + %.3f)^2 = ",-O.y);
            printf("%.3f^2
    ",R);
    
            if(dcmp(O.x)>0)          printf("x^2 + y^2 - %.3fx ",2*O.x);
            else if(dcmp(O.x) == 0)  printf("x^2 + y^2 ");
            else                     printf("x^2 + y^2 + %.3fx ",-2*O.x);
    
            if(dcmp(O.y)>0)          printf("- %.3fy ",2*O.y);
            else if(dcmp(O.y) < 0)   printf("+ %.3fy ",-2*O.y);
    
            if(dcmp(O.x*O.x+O.y*O.y-R*R) > 0)
                printf("+ %.3f = 0
    ",O.x*O.x+O.y*O.y-R*R);
            else if(dcmp(O.x*O.x+O.y*O.y-R*R) == 0)
                printf("= 0
    ");
            else
                printf("- %.3f = 0
    ",-O.x*O.x-O.y*O.y+R*R);
            printf("
    ");
        }
    }
    View Code
  • 相关阅读:
    法正(25):劝降
    单例模式
    Redis学习笔记(六)---List
    canvas的使用
    HTML5的新特性
    html学习笔记一
    matlab无法使用
    Hadoop笔记(一)
    PL/SQL笔记(一)
    Oracle数据库(二)
  • 原文地址:https://www.cnblogs.com/acmdeweilai/p/3352737.html
Copyright © 2020-2023  润新知