当前位置: 首页 > news >正文

PHP 给定 n 个有序顶点的多边形的面积(Area of a polygon with given n ordered vertices)

给定一个有 n 个顶点的多边形的有序坐标。求该多边形的面积。这里的有序是指坐标从第一个顶点到最后一个顶点按顺时针或逆时针排列。
示例:

输入 : X[] = {0, 4, 4, 0}, Y[] = {0, 0, 4, 4};
输出 : 16

输入 : X[] = {0, 4, 2}, Y[] = {0, 0, 4}
输出 : 8

我们可以使用鞋带公式计算多边形的面积。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

Area

[Tex]=\frac{1}{2}\left | \sum_{i=1}^{n-1}x_iy_(_i+_1_)+x_ny1-\sum_{i=1}^{n-1}x_(_i+_1_)y_i-x_1y_n \right |[/Tex]

= | 1/2 [ (x1y2 + x2y3 + ... + xn-1yn + xny1) - (x2y1 + x3y2 + ... + xnyn-1 + x1yn) ] |

上述公式是通过对顶点进行叉积来推导多边形中三角形面积的。
以下是上述公式的具体实现。

示例代码:

<?php
// PHP program to evaluate area of
// a polygon using shoelace formula

// (X[i], Y[i]) are
// coordinates of i'th point.
function polygonArea($X, $Y, $n)
{
// Initialize area
$area = 0.0;

// Calculate value of
// shoelace formula
$j = $n - 1;
for ($i = 0; $i < $n; $i++)
{
$area += ($X[$j] + $X[$i]) *
($Y[$j] - $Y[$i]);

// j is previous vertex to i
$j = $i;
}

// Return absolute value
return abs($area / 2.0);
}

// Driver Code
$X = array(0, 2, 4);
$Y = array(1, 3, 7);

$n = sizeof($X);

echo polygonArea($X, $Y, $n);

// This code is contributed by ajit
?>

输出

2

时间复杂度: O(n)

辅助空间: O(1),因为没有占用额外的空间。

为什么叫鞋带公式?

这个公式的命名源于我们计算它的方式。

例如:

设输入顶点为
(0, 1), (2, 3), and (4, 7).

评估过程与系鞋带的过程相匹配。

我们将顶点写成如下所示
0 1
2 3
4 7
0 1 [写两次]

我们评估正项如下
0 \ 1
2 \ 3
4 \ 7
0 1
即, 0*3 + 2*7 + 4*1 = 18

我们评估负项如下
0 1
2 / 3
4 / 7
0 / 1
即, 0*7 + 4*3 + 2*1 = 14

面积 = 1/2 (18 - 14) = 2

查看此页以获得更清晰的图像。

这是怎么回事?
我们总是可以将一个多边形分成三角形。面积公式如下:取每条边 AB,计算顶点位于原点 O 的三角形 ABO 的面积(有符号),然后取叉积(得出平行四边形的面积)除以 2。绕多边形旋转时,这些面积为正负的三角形会重叠,原点和多边形之间的面积会被抵消,总和为 0,只剩下参考三角形内部的面积。[来源:维基百科]

为了更好地理解,请看下图:

使用叉积计算三角形面积

将多边形划分为更小的三角形来计算面积

类似地,对于不规则多边形,我们可以形成三角形来计算面积

相关文章:
最小成本多边形三角剖分,
为给定的点集寻找简单闭合路径

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

http://www.jsqmd.com/news/502031/

相关文章:

  • 深度学习注意力可视化终极指南:如何理解模型决策过程与注意力机制
  • 终极指南:如何用sh1/sh实现安全的日志聚合与数据保护
  • Nuclide分支命名工具集成:Git钩子配置终极指南
  • 终极Android自定义View绘制指南:掌握onDraw与Canvas的完整流程
  • JavaScript 给定 n 个有序顶点的多边形的面积(Area of a polygon with given n ordered vertices)
  • 金融风控实战指南:使用auto-sklearn快速构建欺诈检测模型
  • 如何加入twin.macro社区:探索贡献与成长机会
  • 7个关键策略:MCP应用容器编排与备份最佳实践指南
  • 终极macOS启动盘制作指南:使用开源工具轻松创建系统安装盘
  • 电池组散热性能分析:基于ANSYS Fluent流体动力学模拟的研究
  • 7个关键步骤:FastSAM模型生产环境监控与告警实践指南
  • Gifski无障碍支持:为视障用户优化的视频转GIF工具详解
  • 5款免费开源电池管理工具:延长MacBook续航的终极指南
  • 终极指南:oapi-codegen生成代码的容器化与Serverless部署策略对比
  • 终极Android开发指南:掌握Dagger Hilt依赖注入的核心技巧
  • 2024-2026年北京房产继承律师推荐:涉及拆迁补偿的继承纠纷处理热门律师深度剖析 - 品牌推荐
  • SQLGlot深度学习集成指南:如何用AI处理图像与文本数据的SQL查询
  • 2026年北京继承律所推荐:遗嘱执行与财产分割高性价比服务及避坑指南 - 品牌推荐
  • 如何在Robo 3T中配置MongoDB Atlas文本搜索索引:完整指南
  • 终极MCP框架选型指南:为什么mcp-use是2025年最佳开发效率工具
  • MongoDB数据库重命名终极指南:Robo 3T安全迁移的7个关键步骤
  • PTFE、FEP、PFA:三种常见含氟塑料的区别与选型指南 - 众鑫氟塑铁氟龙管
  • 如何使用Papa Parse构建符合GDPR的数据处理方案:完整指南
  • 高压充电系统中的B型漏电流检测设计:标准要求、实现难点与工程方案
  • 如何快速掌握ffsubsync架构设计与API规范:新手开发者必备指南
  • 终极MCP应用安全事件响应演练计划:7天从零构建安全防护体系
  • 2026年北京继承律所推荐:家族房产传承纠纷处理靠谱律所及用户口碑真实评价 - 品牌推荐
  • AndroidLibs代码规范指南:如何为史上最全Android开源库项目贡献高质量PR
  • MyBookshelf混淆规则:Android开源阅读应用代码保护的完整指南
  • 终极指南:如何使用ffsubsync智能音频特征提取实现完美字幕同步