当前位置: 首页 > 编程笔记 >

Jarvis March算法

充普松
2023-03-14
本文向大家介绍Jarvis March算法,包括了Jarvis March算法的使用技巧和注意事项,需要的朋友参考一下

Jarvis March算法用于从一组给定的数据点中检测凸包的角点。

从数据集的最左端开始,我们通过逆时针旋转将这些点保留在凸包中。从当前点开始,我们可以通过从当前点检查这些点的方向来选择下一个点。当角度最大时,将选择该点。完成所有点后,当下一个点是起点时,停止算法。

输入输出

Input:
Set of points: {(-7,8), (-4,6), (2,6), (6,4), (8,6), (7,-2), (4,-6), (8,-7),(0,0), (3,- 2),(6,-10),(0,6),(-9,-5),(-8,-2),(-8,0),(-10,3),(-2,2),(-10,4)}
Output:
Boundary points of convex hull are:
(-9, -5) (6, -10) (8, -7) (8, 6) (-7, 8) (-10, 4) (-10, 3)

算法

findConvexHull(points, n)

输入:点数,点数。

输出:凸包的角点。

Begin
   start := points[0]
   for each point i, do
      if points[i].x < start.x, then          // get the left most point
         start := points[i]
   done

   current := start
   add start point to the result set.
   define colPts set to store collinear points

   while true, do                //start an infinite loop
      next := points[i]
      for all points i except 0th point, do
         if points[i] = current, then
            skip the next part, go for next iteration
         val := cross product of current, next, points[i]

         if val > 0, then
            next := points[i]
            clear the colPts array
         else if cal = 0, then
            if next is closer to current than points[i], then
               add next in the colPts
               next := points[i]
            else
               add points[i] in the colPts
      done

      add all items in the colPts into the result
      if next = start, then
         break the loop
      insert next into the result
      current := next
   done
   return result
End

示例

#include<iostream>
#include<set>
#include<vector>
using namespace std;

struct point {              //define points for 2d plane
   int x, y;

   bool operator==(point p2) {
      if(x == p2.x && y == p2.y)
         return 1;
      return 0;
   }

   bool operator<(const point &p2)const {       //dummy compare function used to sort in set
      return true;
   }
};

int crossProduct(point a, point b, point c) {            //finds the place of c from ab vector
   int y1 = a.y - b.y;
   int y2 = a.y - c.y;
   int x1 = a.x - b.x;
   int x2 = a.x - c.x;
   return y2*x1 - y1*x2;          //if result < 0, c in the left, > 0, c in the right, = 0, a,b,c are collinear
}

int distance(point a, point b, point c) {
   int y1 = a.y - b.y;
   int y2 = a.y - c.y;
   int x1 = a.x - b.x;
   int x2 = a.x - c.x;

   int item1 = (y1*y1 + x1*x1);
   int item2 = (y2*y2 + x2*x2);

   if(item1 == item2)
      return 0;             //when b and c are in same distance from a
   else if(item1 < item2)
      return -1;          //when b is closer to a
   return 1;              //when c is closer to a
}

set<point>findConvexHull(point points[], int n) {
   point start = points[0];
   for(int i = 1; i<n; i++) {              //find the left most point for starting
      if(points[i].x < start.x)
         start = points[i];
   }

   point current = start;
   set<point> result;                 //set is used to avoid entry of duplicate points
   result.insert(start);
   vector<point> *collinearPoints = new vector<point>;

   while(true) {
      point nextTarget = points[0];

      for(int i = 1; i<n; i++) {
         if(points[i] == current)       //when selected point is current point, ignore rest part
            continue;
         int val = crossProduct(current, nextTarget,points[i]);

         if(val > 0) {            //when ith point is on the left side
            nextTarget = points[i];
            collinearPoints = new vector<point>;      //reset collinear points

         }else if(val == 0) {          //if three points are collinear
            if(distance(current, nextTarget, points[i]) < 0) { //add closer one to collinear list
               collinearPoints->push_back(nextTarget);
                  nextTarget = points[i];
            }else{
               collinearPoints->push_back(points[i]); //when ith point is closer or same as nextTarget
            }
         }
      }
      vector<point>::iterator it;

      for(it = collinearPoints->begin(); it != collinearPoints->end(); it++) {

         result.insert(*it);     //add allpoints in collinear points to result set
      }

      if(nextTarget == start)        //when next point is start it means, the area covered
         break;
      result.insert(nextTarget);
      current = nextTarget;
   }
   return result;
}

int main() {
   point points[] = {{-7,8},{-4,6},{2,6},{6,4},{8,6},{7,-2},{4,-6},{8,-7},{0,0},
      {3,-2},{6,-10},{0,-6},{-9,-5},{-8,-2},{-8,0},{-10,3},{-2,2},{-10,4}};
   int n = 18;
   set<point> result;
   result = findConvexHull(points, n);
   cout << "Boundary points of convex hull are: "<<endl;
   set<point>::iterator it;

   for(it = result.begin(); it!=result.end(); it++)
      cout << "(" << it->x << ", " <<it->y <<") ";
}

输出结果

Boundary points of convex hull are:
(-9, -5) (6, -10) (8, -7) (8, 6) (-7, 8) (-10, 4) (-10, 3)
 类似资料:
  • 数学模型 1. 近似 2. 增长数量级 3. 内循环 4. 成本模型 注意事项 1. 大常数 2. 缓存 3. 对最坏情况下的性能的保证 4. 随机化算法 5. 均摊分析 ThreeSum 1. ThreeSumSlow 2. ThreeSumBinarySearch 3. ThreeSumTwoPointer 倍率实验 数学模型 1. 近似 N3/6-N2/2+N/3 ~ N3/6。使用 ~f(

  • 我正在使用ModBus RTU,并试图找出如何计算CRC16。我不需要代码示例。我只是对机制很好奇。我已经了解到,基本的CRC是数据字的多项式除法,根据多项式的长度,用零填充。下面的测试示例应该检查我的基本理解是否正确: 数据字:01001011 多项式:1001(x3+1) 由于最高指数x3而被填充3位 计算:0100 1011 000/1001->余数:011 计算。 null 第二次尝试:由

  • 本文向大家介绍Java算法之递归算法计算阶乘,包括了Java算法之递归算法计算阶乘的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享的java算法计算阶乘,在学习Java课程时经常会遇到求阶乘问题,今天接跟大家一起探讨一下 代码如下: 运行结果:

  • 第一部分:Top K 算法详解 问题描述 百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。 必备知识 什么是哈

  • 算法 我注意到从第一章开始,容器就占据了STL喝彩声中最大的一份。在某种意义上,这是可以理解的。容器有着非凡的造诣,它们使大批C++程序员每天的基本生活变得简单。尽管如此,STL算法的权利也很重要,一样有能力减轻程序员的负担。事实上,有超过100个算法,很容易证明比起容器,它们提供给程序员更精巧的工具集(起码一样强)。也许它们的数量是一部分问题。搞清八种截然不同的容器类型明显比记住70个算法的名字

  • 排序 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象稳定性 冒泡排序 O(n2) O(n2) O(1) 稳定 选择排序 O(n2) O(n2) O(1) 数组不稳定、链表稳定 插入排序 O(n2) O(n2) O(1) 稳定 快速排序 O(n*log2n) O(n2) O(log2n) 不稳定 堆排序 O(n*log2n) O(n*log2n) O(1) 不稳定 归并排序 O(n*

  • 算法

  • 目录 ​排序算法​ ​检索算法​