fork download
  1. import java.io.*;
  2. class Main{
  3. public static void main(String[] args)throws Exception{
  4. String str = br.readLine(); //x1 y1 x2 y2 x3 y3 xp yp r
  5. String[] str1 = str.split(" ");
  6. double[] a = new double[9]; //x1 y1 x2 y2 x3 y3 xp yp r
  7. double[] b = new double[6]; //a1 b1 a2 b2 a3 b3
  8. double d1=0,d2=0,d3=0,s1=0,s2=0,s3=0,flag1=0,flag2=0,flag3=0;
  9. for(int i=0;i<=8;i++){
  10. a[i] = Double.parseDouble(str1[i]);
  11. }
  12. for(int i=0;i<=4;i+=2){
  13. b[i] = (a[(i+3)%6]-a[i+1])/(a[(i+2)%6]-a[i]); //傾き (y2-y1)/(x2-x1)
  14. b[i+1] = a[i+1]+(-1*(b[i]*a[i])); //切片 y1+(-1*(傾き*x1))
  15. }
  16. //円の中心から各線分までの距離
  17. if(b[0]!=Double.POSITIVE_INFINITY && b[0]!=Double.NEGATIVE_INFINITY){
  18. d1 = Math.abs( (a[6]*b[0])+(a[7]*-1)-b[1] ) / Math.sqrt(b[0]*b[0]+1);
  19. }else{
  20. d1 = a[0];
  21. }
  22. if(b[2]!=Double.POSITIVE_INFINITY && b[2]!=Double.NEGATIVE_INFINITY){
  23. d2 = Math.abs( (a[6]*b[2])+(a[7]*-1)-b[3] ) / Math.sqrt(b[2]*b[2]+1);
  24. }else{
  25. d2 = a[2];
  26. }
  27. if(b[4]!=Double.POSITIVE_INFINITY && b[4]!=Double.NEGATIVE_INFINITY){
  28. d3 = Math.abs( (a[6]*b[4])+(a[7]*-1)-b[5] ) / Math.sqrt(b[4]*b[4]+1);
  29. }else{
  30. d3 = a[4];
  31. }
  32. //各頂点が円の中にあるか外にあるか
  33. if( ((a[0]-a[6])*(a[0]-a[6]) + (a[1]-a[7])*(a[1]-a[7])) >= a[8]*a[8]){
  34. flag1 = 1;
  35. }
  36. if( ((a[2]-a[6])*(a[2]-a[6]) + (a[3]-a[7])*(a[3]-a[7])) >= a[8]*a[8]){
  37. flag2 = 1;
  38. }
  39. if( ((a[4]-a[6])*(a[4]-a[6]) + (a[5]-a[7])*(a[5]-a[7])) >= a[8]*a[8]){
  40. flag3 = 1;
  41. }
  42. //面積の処理をするかしないか
  43. if(a[8]>d1 && flag1==1 && flag2==1){
  44. s1 = AB(d1,a[8]);
  45. System.out.println("s1:"+s1);
  46. }else{
  47. System.out.println("線分ABにおける面積はありません");
  48. }
  49. if(a[8]>d2 && flag2==1 && flag3==1){
  50. s2 = BC(d2,a[8]);
  51. System.out.println("s2:"+s2);
  52. }else{
  53. System.out.println("線分BCにおける面積はありません");
  54. }
  55. if(a[8]>d3 && flag3==1 && flag1==1){
  56. s3 = CA(d3,a[8]);
  57. System.out.println("s3:"+s3);
  58. }else{
  59. System.out.println("線分CAにおける面積はありません");
  60. }
  61. }
  62. public static double AB(double d1,double r){
  63. double l = Math.sqrt(r*r-d1*d1)*2; //弧の底辺の長さ
  64. double cosA = ((r*r)+(r*r)-(l*l))/(2*r*r); //余弦定理による角度cosA
  65. double rad = Math.acos(cosA); //アークコサインでラジアン出力
  66. double s = (0.5)*(r*r)*( rad - Math.sin(rad) ); //面積
  67. return s;
  68. }
  69. public static double BC(double d2,double r){
  70. double l = Math.sqrt(r*r-d2*d2)*2; //弧の底辺の長さ
  71. double cosA = ((r*r)+(r*r)-(l*l))/(2*r*r); //余弦定理による角度cosA
  72. double rad = Math.acos(cosA); //アークコサインでラジアン出力
  73. double s = (0.5)*(r*r)*( rad - Math.sin(rad) ); //面積
  74. return s;
  75. }
  76. public static double CA(double d3,double r){
  77. double l = Math.sqrt(r*r-d3*d3)*2; //弧の底辺の長さ
  78. double cosA = ((r*r)+(r*r)-(l*l))/(2*r*r); //余弦定理による角度cosA
  79. double rad = Math.acos(cosA); //アークコサインでラジアン出力
  80. double s = (0.5)*(r*r)*( rad - Math.sin(rad) ); //面積
  81. return s;
  82. }
  83. }
Success #stdin #stdout 0.03s 245632KB
stdin
-5 0 0 5 0 -5 0 0 5
stdout
s1:7.13495408493621
s2:39.269908169872416
s3:7.13495408493621