HDU-1798 Tell me the area (C++和Java【水】两圆相交求公共面积)

原创 2016年05月31日 10:08:37

HDU-1798 Tell me the area(两圆相交求公共面积)

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Problem Description
There are two circles in the plane (shown in the below picture), there is a common area between the two circles. The problem is easy that you just tell me the common area.

Input
There are many cases. In each case, there are two lines. Each line has three numbers: the coordinates (X and Y) of the centre of a circle, and the radius of the circle.

Output
For each case, you just print the common area which is rounded to three digits after the decimal point. For more details, just look at the sample.

Sample Input
0 0 2
2 2 1

Sample Output
0.108

分析:题意就是求两圆的公共面积,简单数学题。
WA的情况:
1、PI不能写3.1415926,最好写acos(-1.0)
2、考虑情况(相切、相离、考虑等于0、包含 )

#include "cstdio"
#include "cmath"
#include "iostream" 
using namespace std;
#define PI acos(-1.0)
double dis(double x1,double y1,double x2,double y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double cos_angle(double a,double b,double c){
    return 0.5*(a*a+c*c-b*b)/(a*c);
}
int main(){
    double d,x1,y1,r1,x2,y2,r2,s,s1_,s2_,s1_tri,s2_tri,an1,an2;
    while(~scanf("%lf %lf %lf",&x1,&y1,&r1)){
        scanf("%lf %lf %lf",&x2,&y2,&r2);
        d = dis(x1,y1,x2,y2);
        if(d>=r1+r2||!r1||!r2){//相切、相离、考虑等于0 
            printf("0.000\n");
            continue;
        }
        if(d+r1<=r2){//包含 
            printf("%.3lf\n",PI*r1*r1);
            continue;
        }
        if(d+r2<=r1){//包含 
            printf("%.3lf\n",PI*r2*r2);
            continue;
        }
        an1 = acos(cos_angle(r1,r2,d));
        an2 = acos(cos_angle(r2,r1,d));

        s1_tri = 0.5*r1*r1*sin(an1*2);
        s2_tri = 0.5*r2*r2*sin(an2*2);
        s1_ = r1*r1*an1;
        s2_ = r2*r2*an2;
        s = (s1_-s1_tri)+(s2_-s2_tri);
        printf("%.3lf\n",s);
    }
    return 0;
}

Java(S三角形 用海伦公式)
第一次用JAVA写ACM,解决输入输出问题。

import java.io.*;
import java.math.*;
import java.util.*;
import java.text.*;

public class Main {
    public static void main(String []args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            double PI = Math.acos(-1.0);
            double x1 = sc.nextDouble(); // 圆心x
            double y1 = sc.nextDouble(); // 圆心y
            double r1 = sc.nextDouble(); 

            double x2 = sc.nextDouble();
            double y2 = sc.nextDouble();
            double r2 = sc.nextDouble();        
            double alpha,area;
            double d = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));//两圆心距离

            if(d>=r1+r2||r1==0||r2==0){//相切、相离、考虑等于0 
                area=0;

            }
            else if(d+r1<=r2){//包含 
                area = PI*r1*r1;

            }
            else if(d+r2<=r1){//包含 
                area = PI*r2*r2;
            }
            else{
                alpha=Math.acos((d*d+r1*r1-r2*r2)/(2*d*r1));//余弦定理取得相交弧所对本圆的圆心角
                area=alpha*r1*r1;//本圆扇形面积
                alpha=Math.acos((d*d+r2*r2-r1*r1)/(2*d*r2));//余弦定理取得相交弧所对另一圆的圆心角
                area+=alpha*r2*r2;//另一圆的扇形面积
                double s=(d+r1+r2)/2;//海伦公式之s
                area-=Math.sqrt(s*(s-d)*(s-r1)*(s-r2))*2;//两扇形面积减去两三角形面积即为交集
            }
            DecimalFormat df = new DecimalFormat( "0.000"); 
            System.out.println(df.format(area));
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

如何计算平面n个圆相交的公共部分的面积

原题参考 mmmcd 超超 在这个帖子当中的讨论http://community.csdn.net/Expert/topic/4075/4075074.xml?temp=.4154627N个任意圆相交...
  • happy__888
  • happy__888
  • 2005年06月21日 16:21
  • 2908

求两圆相交部分面积 c++

【问题描述】   给定平面上两个圆,求它们的公共部分的面积。 【输入格式】 一行有6个实数:x1,y1,r1,x2,y2,r2。其中r1,r2>0。【输出格式】 输出公共部分面积。【输入样例】...
  • qq_35546348
  • qq_35546348
  • 2016年07月10日 12:10
  • 3336

Java - 三角形与圆形面积

实验一  求三角形与圆形面积,参数由键盘键入。 代码: package 三角形与圆面积; import java.util.* ; class twoArea { double Tra...
  • Chuck_0430
  • Chuck_0430
  • 2013年10月12日 11:52
  • 1007

[模板] 求两圆相交面积(模板)

两圆相交分三种情况:相离相切相交
  • u014204710
  • u014204710
  • 2014年08月06日 12:00
  • 4538

两圆相交求面积

两圆相交求面积,考虑两圆的位置关系再计算其面积: (因为是计算面积,不考虑两圆相切的情况) 1.两圆相离: 判定条件:两圆半径之和大于等于圆心距 计算方法:显然相交面积为0 2.两圆相含:两...
  • u013250442
  • u013250442
  • 2014年12月01日 21:56
  • 3219

求两圆相交部分面积(C/C++)

已知两圆圆心坐标和半径
  • u012760023
  • u012760023
  • 2014年11月13日 10:40
  • 498

POJ 2546 Circular Area 两圆相交面积

题目:http://poj.org/problem?id=2546 题意:给定两个圆的圆心和半径,求两个圆的相交面积 思路:满满的高中几何知识,不多说 #include #include ...
  • discreeter
  • discreeter
  • 2016年07月14日 16:15
  • 541

计算两个圆相交部分的面积

double intersect(double x1,double y1,double r1,double x2,double y2,double r2){ double s,temp,p,l,an...
  • u011762318
  • u011762318
  • 2014年11月17日 21:42
  • 2734

计算几何专题(计算两圆相交面积)

There are two circles in the plane (shown in the below picture), there is a common area between the ...
  • qq_38853597
  • qq_38853597
  • 2017年07月31日 16:53
  • 380

POJ 2546 Circular Area【计算几何,计算两圆相交面积】

题意:给出两个圆的圆心个半径,求两个圆的相交面积。 要求相交面积,首先要判断两圆的位置关系。 参考博客:http://www.cnblogs.com/luyingfeng/p/4130689.html...
  • hurmishine
  • hurmishine
  • 2016年11月23日 20:39
  • 898
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU-1798 Tell me the area (C++和Java【水】两圆相交求公共面积)
举报原因:
原因补充:

(最多只允许输入30个字)