POJ 1329 Circle Through Three Points

题意:给你三个圆上的点,求圆的两种表达式。首先普及知识:


外接圆半径:公式:a/sinA=b/sinB=c/sinC=2R (R就是外接圆半径) 
本题可以这样:①.先利用余弦定理:a^2=b^2+c^2-2bc·cosA 
求出:cosA=(b^2+c^2-a^2)/2bc 在利用公式:sinA^2+cosA^2=1
确定 sinA=根号(1-cosA^2) =根号[(a^2+b^2+c^2)^2-2(a^4+b^4+c^4)]/(2bc) 
然后代入 a/sinA=2R求出R. R=abc/根号[(a^2+b^2+c^2)^2-2(a^4+b^4+c^4)]        
 
定义:设平面上的三点A(x1,y1),B(x2,y2),C(x3,y3),定义 
S(A,B,C) = (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3) 


已知三角形的三个顶点为A(x1,y1),B(x2,y2),C(x3,y3),则该三角形的外心为: 
           S((x1*x1+y1*y1, y1), (x2*x2+y2*y2, y2), (x3*x3+y3*y3, y3)) 
x0 = ----------------------------------------------------------- 
                       2*S(A,B,C) 


         S((x1,x1*x1+y1*y1), (x2, x2*x2+y2*y2), (x3, x3*x3+y3*y3)) 
y0 = ----------------------------------------------------------- 
            2*S(A,B,C) 

把圆心的坐标和半径求出来之后就输出。

代码:

#include<iostream>
#include<cmath>
using namespace std;
double Dist(double x,double y,double x1,double y1)
{
       return (x-x1)*(x-x1)+(y-y1)*(y-y1);
}
double Sn(double x1,double y1,double x2,double y2,double x3,double y3)
{
       return (x1-x3)*(y2-y3)-(y1-y3)*(x2-x3);
}
void Fn(double x)
{
     if(x<0) printf(" + %.3lf",-x);
     else printf(" - %.3lf",x);
}
int main()
{
    double x1,x2,x3,y1,y2,y3,x,y;
    while( scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF){
           double a=Dist(x1,y1,x2,y2);
           double b=Dist(x2,y2,x3,y3);
           double c=Dist(x3,y3,x1,y1);
           double r=sqrt(a*b*c)/sqrt((a+b+c)*(a+b+c)-2*(a*a+b*b+c*c));
         //  printf("%.lf\n",r);
           double s=Sn(x1,y1,x2,y2,x3,y3);
           double s1=Sn( x1*x1+y1*y1, y1, x2*x2+y2*y2, y2, x3*x3+y3*y3, y3);
           double s2=Sn( x1,x1*x1+y1*y1, x2, x2*x2+y2*y2, x3, x3*x3+y3*y3);
           x=s1/(2*s);
           y=s2/(2*s);
        
           printf("(x");
           Fn(x);
           printf(")^2 + (y");
           Fn(y);
           printf(")^2 = %.3lf^2\n",r);
           printf("x^2 + y^2");
           Fn(2*x); printf("x");
           Fn(2*y); printf("y");
           Fn(r*r-x*x-y*y);
           printf(" = 0\n\n");
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值