最大三角形面積 鞋帶公式& 海倫公式

給定包含多個點的集合,從其中取三個點組成三角形,返回能組成的最大三角形的面積。

示例:
輸入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
輸出: 2
解釋: 
這五個點以下圖所示。組成的橙色三角形是最大的,面積爲2。

注意:

    3 <= points.length <= 50.
    不存在重複的點。
     -50 <= points[i][j] <= 50.
    結果偏差值在 10^-6 之內都認爲是正確答案。

思路:

    1. 鞋帶公式,用於計算任意多邊形的面積,可用於計算三角形的面積;
    1. 海倫公式,從三個頂點獲得三邊長,並使用海倫公司計算出面積;
  • 3.三角形面積公式 S = 1/2 * a * b * sin(C),首先獲得兩邊的長度,經過叉積算出夾角的正弦值,並使用公式計算出面積。

主要記錄前兩種實現方式。

1.鞋帶公式:

好比已知 ΔABC 三個頂點的座標 A:(x1,y1)、 B:(x2,y2)、 C:(x3,y3),對應的矩陣是這樣:
spa

計算面積先計算中間的矩陣:
$ a=(x1×y2)+(x2×y3)+(x3×y1) $ .net

再從最右側矩陣計算:
$ b=(y1×x2)+(y2×x3)+(y3×x1) $code

則三角形面積爲: blog

$ SΔABC=12|a−b|=12|((x1×y2)+(x2×y3)+(x3×y1))−((y1×x2)+(y2×x3)+(y3×x1))| $ip

抽離出來即有:
rem

公式中約定: 當下標大於 n 時, xn+1=x1, yn+1=y1。在此就不證實了。文檔

鞋帶公式-實現代碼

var largestTriangleArea1 = function (points) {
  var maxs = 0;
  for (var i = 0; i < points.length; i++) {
    for (var j = i+1; j < points.length; j++) {
      for (var s = j+1; s < points.length; s++) {
        maxs = Math.max(maxs,0.5*Math.abs(
          points[i][0]*points[j][1]+
          points[j][0]*points[s][1]+
          points[s][0]*points[i][1]-
          points[i][1]*points[j][0]-
          points[j][1]*points[s][0]-
          points[s][1]*points[i][0]))
      }
    }
  }
  return maxs;
};

2.海倫公式

不一樣的面積公式對應不一樣的分割方法。 $ S = 1/2hb $get

對應的是割補矩形法,而海倫公式對應以下
it

var largestTriangleArea = function (points) {
  var maxs = 0;
  for (var i = 0; i < points.length; i++) {
    for (var j = i+1; j < points.length; j++) {
      for (var s = j+1; s < points.length; s++) {
        console.log(points[j][0],points[i][0])
          var a = Math.sqrt(Math.pow( Math.abs(points[j][0] - points[i][0]),2)+Math.pow( Math.abs(points[j][1] - points[i][1]),2));
          var b = Math.sqrt(Math.pow( Math.abs(points[s][0] - points[j][0]),2)+Math.pow( Math.abs(points[s][1] - points[j][1]),2));
          var c = Math.sqrt(Math.pow( Math.abs(points[i][0] - points[s][0]),2)+Math.pow( Math.abs(points[i][1] - points[s][1]),2));
          var l = (a+b+c)*0.5;
          maxs = Math.max(maxs,Math.sqrt(l*(l-a)*(l-b)*(l-c)))
      }
    }
  }
  return maxs;
};

tips:該方式還存在精度問題。io

參考文檔:

1.海倫公式的幾何意義是什麼?
2.【Green公式】Hunter’s Apprentice(判斷多邊形爲順時針或逆時針)--鞋帶公式
3.求簡單多邊形面積時很是有用的「鞋帶公式」

相關文章
相關標籤/搜索