A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangyupeng123 中级黑马   /  2017-7-12 22:23  /  1434 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

0.海伦公式介绍:
1.海伦公式求解三角形面积

与海伦在他的著作"Metrica"(《度量论》)中的原始证明不同,在此我们用三角公式和公式变形来证明。设三角形的三边a、b、c的对角分别为A、B、C,则余弦定理为下述推导

cosC = (a^2+b^2-c^2)/2ab
S=1/2*ab*sinC
=1/2*ab*√(1-cos^2 C)
=1/2*ab*√[1-(a^2+b^2-c^2)^2/4a^2*b^2]
=1/4*√[4a^2*b^2-(a^2+b^2-c^2)^2]
=1/4*√[(2ab+a^2+b^2-c^2)(2ab-a^2-b^2+c^2)]
=1/4*√[(a+b)^2-c^2][c^2-(a-b)^2]
=1/4*√[(a+b+c)(a+b-c)(a-b+c)(-a+b+c)]
设p=(a+b+c)/2
则p=(a+b+c)/2,p-a=(-a+b+c)/2,p-b=(a-b+c)/2,p-c=(a+b-c)/2,
上式=√[(a+b+c)(a+b-c)(a-b+c)(-a+b+c)/16]
    =√[p(p-a)(p-b)(p-c)]
所以,三角形ABC面积S=√[p(p-a)(p-b)(p-c)][2]




  1. package com.neusoft.chapter2.exercise;
  2.                   
  3.                   import java.util.Scanner;
  4.                   
  5.                   /**
  6.                    * @author zhao-chj
  7.                    * 海伦公式求解三角形面积
  8.                    * 1.用户输入三角形的三个点A(x1,y1),B(x2,y2),C(x3,y3)
  9.                    * 2.求解三角形的三条边
  10.                   * distance(A,B)=sqrt(pow((x2-x1),2)+pow((y2-y1),2)  边1
  11.                   * distance(A,C)=sqrt(pow((x2-x3),2)+pow((y2-y3),2)  边2
  12.                   * distance(B,C)=sqrt(pow((x2-x3),2)+pow((y2-y3),2)  边3
  13.                   * 2.根据海伦公式得到三角形的面积
  14.                   *   s=(边1+边2+边3)/2
  15.                   *   Area=sqrt(s(s-边1)(s-边2)(s-边3))
  16.                   * 4.输出三角形的面积
  17.                   */
  18.                  public class Exercise19 {
  19.                      public static void main(String[] args) {
  20.                          System.out.println("****请您输入三角形的三点坐标****");
  21.                          Scanner sc = new Scanner(System.in);
  22.                          System.out.println("输入A点坐标(x1,y1)");
  23.                          double x1 = sc.nextDouble();
  24.                          double y1 = sc.nextDouble();
  25.                          System.out.println("输入B点坐标(x2,y2)");
  26.                          double x2 = sc.nextDouble();
  27.                          double y2 = sc.nextDouble();
  28.                          System.out.println("输入C点坐标(x3,y3)");
  29.                          double x3 = sc.nextDouble();
  30.                          double y3 = sc.nextDouble();
  31.                          //1.计算边长
  32.                          //distance(A,B)=sqrt(pow((x2-x1),2)+pow((y2-y1),2)  边1
  33.                          double side1AB=Math.sqrt(Math.pow((x2-x1),2)+Math.pow((y2-y1),2));
  34.                          //计算第二个 边的 边长
  35.                          double side2AC=Math.pow((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1),0.5);
  36.                          //计算第三个 边的 边长
  37.                          double side2BC=Math.pow((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2),0.5);
  38.                          //2.海伦公式
  39.                          double s= (side1AB+side2AC+side2BC)/2;
  40.                          double Area=Math.pow(s*(s-side1AB)*(s-side2AC)*(s-side2BC), 0.5);
  41.                          //3.输出三角形的面积公式
  42.                          System.out.println("用海伦公式得到三角形的面积为:"+Area);
  43.                         
  44.                      }
  45.                  }

  46.                
  47.                 2.抽象其中求解三角形边长的方法和求解面积的方法重新实现海伦公式求解

  48.                   package com.neusoft.chapter2.exercise;
  49.                   import java.util.Scanner;
  50.                   /**
  51.                    * @author zhao-chj
  52.                    * 海伦公式求解三角形面积
  53.                    * 1.用户输入三角形的三个点A(x1,y1),B(x2,y2),C(x3,y3)
  54.                    * 2.求解三角形的三条边
  55.                    * distance(A,B)=sqrt(pow((x2-x1),2)+pow((y2-y1),2)  边1
  56.                    * distance(A,C)=sqrt(pow((x2-x3),2)+pow((y2-y3),2)  边2
  57.                   * distance(B,C)=sqrt(pow((x2-x3),2)+pow((y2-y3),2)  边3
  58.                   * 2.根据海伦公式得到三角形的面积
  59.                   *   s=(边1+边2+边3)/2
  60.                   *   Area=sqrt(s(s-边1)(s-边2)(s-边3))
  61.                   * 4.输出三角形的面积
  62.                   */
  63.                  public class Exercise19_1 {
  64.                   public static void main(String[] args) {
  65.                          System.out.println("****请您输入三角形的三点坐标****");
  66.                          Scanner sc = new Scanner(System.in);
  67.                          System.out.println("输入A点坐标(x1,y1)");
  68.                          double x1 = sc.nextDouble();
  69.                          double y1 = sc.nextDouble();
  70.                          System.out.println("输入B点坐标(x2,y2)");
  71.                          double x2 = sc.nextDouble();
  72.                          double y2 = sc.nextDouble();
  73.                          System.out.println("输入C点坐标(x3,y3)");
  74.                          double x3 = sc.nextDouble();
  75.                          double y3 = sc.nextDouble();
  76.                          //1.计算边长
  77.                          //distance(A,B)=sqrt(pow((x2-x1),2)+pow((y2-y1),2)  边1
  78.                          double side1AB=SloveSide(x1, x2, y1, y2);
  79.                          //2.计算第二个 边的 边长
  80.                          double side2AC=SloveSide(x1, x3, y1, y3);
  81.                          //3.计算第三个 边的 边长
  82.                          double side2BC=SloveSide(x2, x3, y2, y3);
  83.                          //4.调用求解面积的方法解决上述问题
  84.                          double Area= SloveArea(side1AB, side2AC, side2BC);
  85.                          System.out.println("用海伦公式得到三角形的面积为:"+Area);
  86.                      }
  87.                  
  88.                      private static double  SloveArea(double side1AB, double side2AC, double side2BC) {
  89.                          //2.海伦公式
  90.                          double s= (side1AB+side2AC+side2BC)/2;
  91.                          double Area=Math.pow(s*(s-side1AB)*(s-side2AC)*(s-side2BC), 0.5);
  92.                          //3.输出三角形的面积公式
  93.                  return Area;
  94.                      }
  95.                  
  96.                      private static double SloveSide(double x1,double x2,double y1,double y2) {
  97.                  // TODO 封装上述面积求解为一个方法
  98.                          double side=Math.sqrt(Math.pow((x2-x1),2)+Math.pow((y2-y1),2));
  99.                          return side;
  100.                      }
  101.                  }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马