示例: 輸入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 輸出: 2 解釋: 這五個點以下圖所示。組成的橙色三角形是最大的,面積爲2。 注意: 3 <= points.length <= 50. 不存在重複的點。 -50 <= points[i][j] <= 50. 結果偏差值在 10^-6 之內都認爲是正確答案。
S = 1/2 * a * b * sin(C)
,首先獲得兩邊的長度,經過叉積算出夾角的正弦值,並使用公式計算出面積。好比已知 Δ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; };
不一樣的面積公式對應不一樣的分割方法。 $ 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.求簡單多邊形面積時很是有用的「鞋帶公式」