poj 1329

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


外接圆半径:公式: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<stdio.h>
#include<math.h> 
struct POINT
{
	double x,y;       
}point[5];
double distance(POINT a,POINT b)
{
	return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double area(double x1,double y1,double x2,double y2,double x3,double y3)
{
	return ((x1-x3)*(y2-y3)-(y1-y3)*(x2-x3) );
}
int main()
{
    double r,s,x,y,a,c,b,x1,x2,x3,y1,y2,y3,k;
    while(scanf("%lf%lf%lf%lf%lf%lf",&point[1].x,&point[1].y,&point[2].x,&point[2].y,&point[3].x,&point[3].y)!=EOF)
    {
        a=distance(point[2],point[3]);
        b=distance(point[1],point[3]);
        c=distance(point[1],point[2]); 
        x1=point[1].x;
		y1=point[1].y;
		x2=point[2].x;
		y2=point[2].y;
		x3=point[3].x;
		y3=point[3].y;
        r=a*b*c/sqrt((a*a+b*b+c*c)*(a*a+b*b+c*c)-2*(a*a*a*a+b*b*b*b+c*c*c*c));
        s=2*area(point[1].x,point[1].y,point[2].x,point[2].y,point[3].x,point[3].y);
        x=area(x1*x1+y1*y1,y1,x2*x2+y2*y2,y2,x3*x3+y3*y3,y3)/s;
        y=area(x1,x1*x1+y1*y1,x2,x2*x2+y2*y2,x3,x3*x3+y3*y3)/s;
        
        //printf("%.3lf %.3lf %.3lf\n",x,y,r);  
		if(x==0)
			printf("(x)^2 + ");
		else if(x<0)
			printf("(x + %.3lf)^2 + ",-1*x);
		else
			printf("(x - %.3lf)^2 + ",x);
		if(y==0)
            printf("(y)^2 = ");
		else if(y<0)
			printf("(y + %.3lf)^2 = ",-1*y); 
        else
			printf("(y - %.3lf)^2 = ",y);
		
		printf("%.3lf^2\n",r);
		

		printf("x^2 + y^2 ");

		if(x>0)
			printf("- %.3lfx ",2*x);
		else
            printf("+ %.3lfx ",-2*x);

        
		if(y>0)
			printf("- %.3lfy ",2*y);
		else
            printf("+ %.3lfy ",-2*y);
		
        k=x*x+y*y-r*r;
		if(k<0)
			printf("- %.3lf = 0\n",-k);
		else
            printf("+ %.3lf = 0\n",k);
		printf("\n");
		
    }
    
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值