前端算法-最大三角形面积-鞋带公式&-海伦公式

简介: 前端算法-最大三角形面积-鞋带公式&-海伦公式

给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。


示例:
输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出: 2
解释: 
这五个点如下图所示。组成的橙色三角形是最大的,面积为2。

注意:

    3 <= points.length <= 50.
    不存在重复的点。
     -50 <= points[i][j] <= 50.
    结果误差值在 10^-6 以内都认为是正确答案。

思路:


a. 鞋带公式,用于计算任意多边形的面积,可用于计算三角形的面积;

b. 海伦公式,从三个顶点得到三边长,并使用海伦公司计算出面积;

c. 三角形面积公式S = 1/2 * a * b * sin(C),首先得到两边的长度,通过叉积算出夹角的正弦值,并使用公式计算出面积。


主要记录前两种实现方式。


1.鞋带公式:


比如已知 ΔABC 三个顶点的坐标 A:(x1,y1)、 B:(x2,y2)、 C:(x3,y3),对应的矩阵是这样:

image.png

计算面积先计算中间的矩阵:
$ a=(x1×y2)+(x2×y3)+(x3×y1) $


再从最右侧矩阵计算:
$ b=(y1×x2)+(y2×x3)+(y3×x1) $


则三角形面积为:


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


抽离出来即有:

image.png

公式中约定: 当下标大于 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 $


对应的是割补矩形法,而海伦公式对应如下

image.png

image.png

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:该方式还存在精度问题。


参考文档:
1.海伦公式的几何意义是什么?
2.【Green公式】Hunter’s Apprentice(判断多边形为顺时针或逆时针)--鞋带公式
3.求简单多边形面积时非常有用的“鞋带公式”

相关文章
|
11月前
|
存储 算法
算法入门:专题一:双指针(有效三角形的个数)
给定一个数组,找出能组成三角形的三元组个数。利用“两边之和大于第三边”的性质,先排序,再用双指针优化。固定最大边,左右指针从区间两端向内移动,若两短边之和大于最长边,则中间所有组合均有效,时间复杂度由暴力的O(n³)降至O(n²)。
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
1382 4
|
算法 前端开发 机器人
一文了解分而治之和动态规则算法在前端中的应用
该文章详细介绍了分而治之策略和动态规划算法在前端开发中的应用,并通过具体的例子和LeetCode题目解析来说明这两种算法的特点及使用场景。
一文了解分而治之和动态规则算法在前端中的应用
|
算法 前端开发
一文了解贪心算法和回溯算法在前端中的应用
该文章深入讲解了贪心算法与回溯算法的原理及其在前端开发中的具体应用,并通过分析LeetCode题目来展示这两种算法的解题思路与实现方法。
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
503 1
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
589 0
|
数据采集 算法
基于PSO粒子群算法的三角形采集堆轨道优化matlab仿真
该程序利用PSO算法优化5个4*20矩阵中的模块采集轨迹,确保采集的物品数量及元素含量符合要求。在MATLAB2022a上运行,通过迭代寻优,选择最佳模块组合并优化轨道,使采集效率、路径长度及时间等综合指标最优。具体算法实现了粒子状态更新、需求量差值评估及轨迹优化等功能,最终输出最优轨迹及其相关性能指标。
|
算法 数据建模
平面中判断点在三角形内算法(重心法)
平面中判断点在三角形内算法(重心法)
330 0
|
算法 C++
空间中判断点在三角形内算法(方程法)
空间中判断点在三角形内算法(方程法)
360 0

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    1364
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    645
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    501
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    503
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    609
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    791
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1561
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    365
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1280
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    615