Javascript 使用 Jarvis 算法或包装的凸包(Convex Hull using Jarvis’ Algorithm or Wrapping)

news2025/1/16 19:05:31

 给定平面中的一组点,该集合的凸包是包含该集合所有点的最小凸多边形。

我们强烈建议您先阅读以下文章。 
如何检查两个给定的线段是否相交?

c++ https://blog.csdn.net/hefeng_aspnet/article/details/141713655
java https://blog.csdn.net/hefeng_aspnet/article/details/141713762
python https://blog.csdn.net/hefeng_aspnet/article/details/141714389
C# https://blog.csdn.net/hefeng_aspnet/article/details/141714420
javascript https://blog.csdn.net/hefeng_aspnet/article/details/141714442


贾维斯算法的思想很简单,我们从最左边的点(或 x 坐标值最小的点)开始,然后继续沿逆时针方向包裹点。 

最大的问题是,给定一个点 p 作为当前点,如何在输出中找到下一个点? 

这里的想法是使用orientation()。

 //c++ C++ 3 个有序点的方向(Orientation of 3 ordered points)-CSDN博客
//java Java 3 个有序点的方向(Orientation of 3 ordered points)-CSDN博客
//python Python 3 个有序点的方向(Orientation of 3 ordered points)_gh python 判断三点是否顺时针方向 如果是则反序-CSDN博客
//C# C# 3 个有序点的方向(Orientation of 3 ordered points)-CSDN博客
//Javascript javascript 3 个有序点的方向(Orientation of 3 ordered points)_threejs计算三个点的朝向-CSDN博客 

下一个点被选为在逆时针方向上领先于所有其他点的点,即,如果对于任何其他点 r,我们有“orientation(p, q, r) = 逆时针”,则下一个点是 q。 

 算法:
步骤 1)将 p 初始化为最左边的点。 
步骤 2)继续进行,直到不再回到第一个(或最左边的)点。2.1 
            )下一个点 q 是这样的点,即对于任何其他点 r,三元组 (p, q, r) 都是逆时针的。 

                    为了找到这一点,我们只需将 q 初始化为下一个点,然后遍历所有点。 

                    对于任意点 i,如果 i 更偏向逆时针,即 orientation(p, i, q) 是逆时针的,则我们将 q 更新为 i。 

                    我们的 q 的最终值将是最逆时针的点。2.2 
           ) next[p] = q(将 q 作为 p 的下一个存储在输出凸包中)。2.3 
           ) p = q(将 p 设置为 q 以进行下一次迭代)。

以下是上述算法的实现: 

// Javascript program to find convex hull of a set of points. Refer 
// https://www.geeksforgeeks.org/orientation-3-ordered-points/
// for explanation of orientation()
 
class Point
{
    constructor(x, y)
    {
        this.x = x;
        this.y = y;
    }
}
 
// To find orientation of ordered triplet (p, q, r).
    // The function returns following values
    // 0 --> p, q and r are collinear
    // 1 --> Clockwise
    // 2 --> Counterclockwise
function orientation(p, q, r)
{
    let val = (q.y - p.y) * (r.x - q.x) -
                  (q.x - p.x) * (r.y - q.y);
        
        if (val == 0) return 0;  // collinear
        return (val > 0)? 1: 2; // clock or counterclock wise
}
 
// Prints convex hull of a set of n points.
function convexHull(points, n)
{
    // There must be at least 3 points
        if (n < 3) return;
        
        // Initialize Result
        let hull = [];
        
        // Find the leftmost point
        let l = 0;
        for (let i = 1; i < n; i++)
            if (points[i].x < points[l].x)
                l = i;
        
        // Start from leftmost point, keep moving 
        // counterclockwise until reach the start point
        // again. This loop runs O(h) times where h is
        // number of points in result or output.
        let p = l, q;
        do
        {
         
            // Add current point to result
            hull.push(points[p]);
        
            // Search for a point 'q' such that 
            // orientation(p, q, x) is counterclockwise 
            // for all points 'x'. The idea is to keep 
            // track of last visited most counterclock-
            // wise point in q. If any point 'i' is more 
            // counterclock-wise than q, then update q.
            q = (p + 1) % n;
               
            for (let i = 0; i < n; i++)
            {
               // If i is more counterclockwise than 
               // current q, then update q
               if (orientation(points[p], points[i], points[q])
                                                   == 2)
                   q = i;
            }
        
            // Now q is the most counterclockwise with
            // respect to p. Set p as q for next iteration, 
            // so that q is added to result 'hull'
            p = q;
        
        } while (p != l);  // While we don't come to first 
                           // point
        
        // Print Result
        for (let temp of hull.values())
            document.write("(" + temp.x + ", " +
                                temp.y + ")<br>");
}
 
/* Driver program to test above function */
let points = new Array(7);
points[0] = new Point(0, 3);
points[1] = new Point(2, 3);
points[2] = new Point(1, 1);
points[3] = new Point(2, 1);
points[4] = new Point(3, 0);
points[5] = new Point(0, 0);
points[6] = new Point(3, 3);
 
let n = points.length;
convexHull(points, n);
 
// This code is contributed by avanitrachhadiya2155 

输出:

(0,3)
(0,0)
(3,0)
(3,3)

时间复杂度:O(m * n),其中 n 是输入点数,m 是输出点数或船体点数 (m <= n)。对于船体上的每个点,我们都会检查所有其他点以确定下一个点。  

最坏情况,时间复杂度:O(n 2 )。最坏情况发生在所有点都在船体上(m = n)。

辅助空间:O(n),因为已占用 n 个额外空间

集合 2-凸包(Graham 扫描) 

注意:当凸包中存在共线点时,上述代码可能会对不同顺序的输入产生不同的结果。例如,当输入 (0, 3), (0, 0), (0, 1), (3, 0), (3, 3) 时,它产生 (0, 3) (0, 0) (3, 0) (3, 3) 的输出;当输入 (0, 3), (0, 1), (0, 0), (3, 0), (3, 3) 时,输出为 (0, 3) (0, 1) (0, 0) (3, 0) (3, 3)。如果是共线,我们通常需要最远的下一个点,如果是共线点,我们可以通过添加一个 if 条件来获得所需的结果。请参考此修改后的代码。

资料来源:
http://www.dcs.gla.ac.uk/~pat/52233/slides/Hull1x1.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2214589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#中判断的应用说明二(switch语句)

一.判断的定义说明 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。下面是大多数编程语言中典型的判断结构的一般形式&#xff1a; 二.判…

六、设置弹窗显示队列

实现原理&#xff1a; 把弹窗放置在一个队列中&#xff0c;通过设置UI方法&#xff0c;直接调用这个队列中的文本 Queue是一个先进先出的队列。 一、队列的使用 写一个增加提示的方法 在这里使用锁来执行这个语句&#xff0c;向这个队列里面增加一个提示文本 在这里进行文本…

Llama3-Factory模型部署新手指南

一、介绍 为了保持其公司在人工智能开源大模型领域的地位&#xff0c;社交巨头Meta推出了旗下最新开源模型。当地时间4月18日&#xff0c;Meta在官网上宣布公布了旗下最新大模型Llama 3。目前&#xff0c;Llama 3已经开放了80亿&#xff08;8B&#xff09;和700亿&#xff08;…

报表控件stimulsoft操作:使用 Stimulsoft 产品连接到 Json数据源

我们继续我们的系列文章&#xff0c;介绍如何在 Stimulsoft 产品中连接各种类型的数据源。在上一篇文章中&#xff0c;我们讨论了如何连接 OData。今天&#xff0c;我们将深入研究另一种类型的数据源 - JSON。 Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate…

Bat To Exe Converter软件:将批处理文件bat转换成exe应用程序

Bat To Exe Converter软件&#xff1a; 将批处理文件bat转换成exe应用程序&#xff08;文章最后附软件下载地址&#xff09;Bat To Exe Converter软件可以把批处理文件bat转换为exe可执行文件&#xff0c;甚至运用密码保护文件&#xff0c;生成的.EXE是独立的文件&#xff0c;…

DevExpress WinForms中文教程:Data Grid - 如何点击获取信息?

在使用DevExpress WinForms的Data Grid之类控件时&#xff0c;可能需要实现自定义用户交互&#xff0c;例如显示数据行的上下文菜单&#xff0c;或者在双击一行时调用编辑表单。在这些情况下&#xff0c;您需要在指定的坐标处标识网格元素。 在本教程中&#xff0c;您将学习如…

Python案例 | 使用K-means 聚类算法提取图像中的颜色

假如我们需要提取下图中的颜色&#xff0c;可以通过使用 K-means 聚类算法对图像进行颜色聚类分析&#xff0c;并生成一个基于聚类中心(即最具代表性的颜色)的RGB值和调色板。 # 通过使用 K-means 聚类算法对图像进行颜色聚类分析&#xff0c;并生成一个基于聚类中心(即最具代…

时间序列预测(二)——前馈神经网络(Feedforward Neural Network, FNN)

上一篇文章有提到线性回归方程。 时间序列预测&#xff08;二&#xff09;——前馈神经网络&#xff08;Feedforward Neural Network, FNN&#xff09;-CSDN博客 与线性回归相比&#xff1a; 线性回归只有一个线性层&#xff0c;输入直接映射到输出&#xff0c;不包含隐藏层…

「漏洞复现」灵当CRM data/pdf.php 任意文件读取漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

网页内容获取:Scala自动化脚本的实现

对于开发者和数据科学家来说&#xff0c;自动化获取网页内容是一个常见的需求。Scala&#xff0c;作为一种多范式编程语言&#xff0c;以其强大的函数式编程特性和并发处理能力&#xff0c;成为了编写高效自动化脚本的理想选择。本文将介绍如何使用Scala结合Selenium WebDriver…

Element Ui el-table列表中的tooltip内容过长超出屏幕换行显示

elementui-table组件列表中的tooltip内容过长超出屏幕换行显示内容,虽然el-table列属性中带的有show-overflow-tooltip&#xff0c;可以设置内容超出列宽度显示为…&#xff0c;且有tooltip提示全部内容&#xff0c;但是内容过多时&#xff0c;提示会超出屏幕&#xff1a; 只有…

芒果YOLOv10改进136:注意力机制MLLA|即插即用:融合Mamba设计精髓的线性注意力视觉Transformer

💡本篇内容:芒果YOLOv10改进136:即插即用,最新注意力机制MLLA:融合 Mamba 设计精髓的线性注意力视觉Transformer MLLA|Mamba-Like Linear Attention 模块 | 即插即用 该模块将选择性的状态空间模型和线性注意力在一个统一公式中进行了重新阐述,将Mamba重新定义为具有六个主…

从头开始的可视化数据 matplotlib:初学者努力绘制数据图

从头开始学习使用 matplotlib 可视化数据&#xff0c;对于初学者来说&#xff0c;可能会有些挑战&#xff0c;但 matplotlib 的核心理念非常清晰&#xff1a;绘制图表需要了解如何设置图形、坐标轴以及如何用数据填充它们。我们可以通过一些简单的例子来逐步介绍基本步骤。 1. …

小程序底部导航按钮实现

商城小程序需要四个底部导航按钮&#xff0c;遂记录一下实现过程 最终实现效果如下所示 新建一个小程序项目&#xff0c;我是创建了JS模板&#xff0c;项目创建完成后需要新建五个文件夹&#xff0c;其中四个&#xff08;page子文件夹&#xff09;用于存放pages文件&#xff0…

探索光耦:光耦——不间断电源(UPS)系统中的安全高效卫士

在现代社会&#xff0c;不间断电源&#xff08;UPS&#xff09;系统已成为保障关键设备和数据安全的关键设施&#xff0c;广泛应用于企业数据中心、家庭电子设备等场景。UPS能在电力中断或波动时提供稳定电力&#xff0c;确保设备持续运行。而在这套系统中&#xff0c;光耦&…

C# 使用S7netplus读取西门子PLC的DB块-S7协议

在工业的设备监控领域&#xff0c;S7协议使用比较普遍下面简单教大家使用 1、添加包 2、添加帮助类(读写数据就研究该类即可&#xff0c;具体的理论就不多说了) //plc中类型与c#类型 bool > Bit //Byte > byte //word > ushort //DWord > uint //Int > short …

【AI知识点】三种不同架构的大语言模型(LLMs)的区别

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI大项目】【AI应用】 在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;预训练语言模型&#xff08;LLMs, Large Language Models&#xff09;通常基于不同的架构&#xff0c;如仅编码器的模型&#xff08;Enc…

Java开发中知识点整理

正则表达式 测试网址 Git 分支和主分支有冲突 先checkout origin/分支把origin/master pull进本地分支 修改冲突MergeCommit and Push

Apache SeaTunnel 介绍

SeaTunnel是一个非常易用、超高性能的分布式数据集成平台&#xff0c;支持实时海量数据同步。 每天可稳定高效同步数百亿数据&#xff0c;已被近百家企业应用于生产。 为什么需要 SeaTunnel​ SeaTunnel专注于数据集成和数据同步&#xff0c;主要旨在解决数据集成领域的常见问…