凸包生成算法实验报告

实验报告

班 级:

学生姓名:

学 号:

日 期: 2014 年5月11日 201101218

判断点线关系及计算多边形内角

一、点与线的关系

(1)定义:平面上的三点P1(x1,y1),P2(x2,y2),P3(x3,y3)的面积量:

|x1 x2 x3|

S(P1,P2,P3) = |y1 y2 y3| = (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)

|1 1 1 |

当P1P2P3逆时针时S 为正的,当P1P2P3顺时针时S 为负的。

令矢量的起点为A ,终点为B ,判断的点为C ,

如果S (A ,B ,C )为正数,则C 在矢量AB 的左侧;

如果S (A ,B ,C )为负数,则C 在矢量AB 的右侧;

如果S (A ,B ,C )为0,则C 在直线AB 上。

(2)算法

二、计算多边形内角

(1) 算法过程

第一步:输入一系列的离散点;

第二步:找x 坐标值最小的点p0,这样能确定由此点构成的多边形的角是凸的;

第三步:定义与p0点相邻的前后两个点p1,p2,若超出数组边界,则用首点或尾点取代;

第四步:计算p2与向量p1p0的位置关系,若p2在向量p1p0的左边,则多边形呈逆时针方向;若p2在向量p1p0的右边,则多边形呈顺时针方向。

第五步:计算多边形的各个内角,利用两个向量的夹角公式计算。由于多边形有凹凸性,所以算角时要分情况。找规律可知,若多边形是逆时针走向,那么,若三个相邻的点构成凸角,三点的走向始终是逆时针走向,否则,是顺时针走向,故可根据此来确定角度。

(2) 算法实现

1

2

3

(3) 算法结果

凸包生成算法

一、凸包定义

通俗的说就是:一组平面上的点,求一个包含所有点的最小凸多边形,这个最小凸多边形就是凸包。

二、Graham 算法思想

概要:Graham 算法的主要思想就是,最终形成的凸包,即包围所有点的凸多边形,假定多边形是按逆时针方向生成的,那么多边形内部包围的所有点与多边形每个有向边的关系都是:点在有向边的左边。依照此思想,只要找到一个出发点,然后依此出发点按逆时针方向构建多边形,并保证每加入一条有向边时,都要满足其余点都在该边的左边。

具体算法过程:

(1)输入:点集S={P}

(2)寻找基点P0:在所有点中找到y 坐标最小的点,若找到多个,则选取其中X 坐标最大的点作为基点,若只找到一个,则直接以这个点作为基点。

(3)排序:以基点为起点,以其余点为终点构成一个向量,逐个计算每个向量与x 轴正方向的夹角,并按夹角有小到大进行排序,得到一个排序的点S1={p0,p1,p2,p3…p(N-1)};对于夹角相同的点,剔除掉离基点近的点,只保留离基点最远的那个点。

注意:由于计算角度复杂且耗时,在这里采用另外一种方式处理,根据上面的点线关系,从基点p0出发,依次遍历其它点,设为pk ,p0和pk 就构成一条有向向量,依次判断其它点

(如pm )在向量的哪个方向,若在线段右边,则用其它点代替pk ,构成一个新向量p0pm, 继续判断剩余的点,这样一趟下来,就能找到最右边的点;依此道理判断其他点。如图:从向量p0p3(p3是任意选的,最终要将除p0外的所有点选到即可)开始,p1在向量p0p3左边,不变;p2在p0p3左边,向量不变;p4在p0p3右边,这时要将比较的向量变为p0p4;继续遍历p5,p5在p0p4右边,向量变为p0p5;继续遍历p6,p6在向量p0p5右边,向量变为p0p6;遍历p7,p7在向量p0p6右边,向量变为p0p7,这一趟下来就将p7这一个最右边的点找到了。同样的方法排序其他点,最后向量按与x 轴正方向的顺序就是{p7,p6,p5,p4,p3,p2,p1},依次递增。

(4)构造凸包:

第一步:首先将基点p0入栈,p1和p2也依次入栈;

第二步:取栈顶的前两个点构成向量,即向量

第三步:判断点p(k+1)是否在向量的左边;

第四步:

情况1:若在向量的左边,则将点p(k+1)入栈,重复第二步;

情况2:若在向量的右边,将点pk 出栈,继续取下一个点,重复步骤二。

第五步:最后栈中存储的点就为凸包。

三、编程实现

1、判断点p3是否在p1p2左边函数。

5、测试结果图

实验报告

班 级:

学生姓名:

学 号:

日 期: 2014 年5月11日 201101218

判断点线关系及计算多边形内角

一、点与线的关系

(1)定义:平面上的三点P1(x1,y1),P2(x2,y2),P3(x3,y3)的面积量:

|x1 x2 x3|

S(P1,P2,P3) = |y1 y2 y3| = (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)

|1 1 1 |

当P1P2P3逆时针时S 为正的,当P1P2P3顺时针时S 为负的。

令矢量的起点为A ,终点为B ,判断的点为C ,

如果S (A ,B ,C )为正数,则C 在矢量AB 的左侧;

如果S (A ,B ,C )为负数,则C 在矢量AB 的右侧;

如果S (A ,B ,C )为0,则C 在直线AB 上。

(2)算法

二、计算多边形内角

(1) 算法过程

第一步:输入一系列的离散点;

第二步:找x 坐标值最小的点p0,这样能确定由此点构成的多边形的角是凸的;

第三步:定义与p0点相邻的前后两个点p1,p2,若超出数组边界,则用首点或尾点取代;

第四步:计算p2与向量p1p0的位置关系,若p2在向量p1p0的左边,则多边形呈逆时针方向;若p2在向量p1p0的右边,则多边形呈顺时针方向。

第五步:计算多边形的各个内角,利用两个向量的夹角公式计算。由于多边形有凹凸性,所以算角时要分情况。找规律可知,若多边形是逆时针走向,那么,若三个相邻的点构成凸角,三点的走向始终是逆时针走向,否则,是顺时针走向,故可根据此来确定角度。

(2) 算法实现

1

2

3

(3) 算法结果

凸包生成算法

一、凸包定义

通俗的说就是:一组平面上的点,求一个包含所有点的最小凸多边形,这个最小凸多边形就是凸包。

二、Graham 算法思想

概要:Graham 算法的主要思想就是,最终形成的凸包,即包围所有点的凸多边形,假定多边形是按逆时针方向生成的,那么多边形内部包围的所有点与多边形每个有向边的关系都是:点在有向边的左边。依照此思想,只要找到一个出发点,然后依此出发点按逆时针方向构建多边形,并保证每加入一条有向边时,都要满足其余点都在该边的左边。

具体算法过程:

(1)输入:点集S={P}

(2)寻找基点P0:在所有点中找到y 坐标最小的点,若找到多个,则选取其中X 坐标最大的点作为基点,若只找到一个,则直接以这个点作为基点。

(3)排序:以基点为起点,以其余点为终点构成一个向量,逐个计算每个向量与x 轴正方向的夹角,并按夹角有小到大进行排序,得到一个排序的点S1={p0,p1,p2,p3…p(N-1)};对于夹角相同的点,剔除掉离基点近的点,只保留离基点最远的那个点。

注意:由于计算角度复杂且耗时,在这里采用另外一种方式处理,根据上面的点线关系,从基点p0出发,依次遍历其它点,设为pk ,p0和pk 就构成一条有向向量,依次判断其它点

(如pm )在向量的哪个方向,若在线段右边,则用其它点代替pk ,构成一个新向量p0pm, 继续判断剩余的点,这样一趟下来,就能找到最右边的点;依此道理判断其他点。如图:从向量p0p3(p3是任意选的,最终要将除p0外的所有点选到即可)开始,p1在向量p0p3左边,不变;p2在p0p3左边,向量不变;p4在p0p3右边,这时要将比较的向量变为p0p4;继续遍历p5,p5在p0p4右边,向量变为p0p5;继续遍历p6,p6在向量p0p5右边,向量变为p0p6;遍历p7,p7在向量p0p6右边,向量变为p0p7,这一趟下来就将p7这一个最右边的点找到了。同样的方法排序其他点,最后向量按与x 轴正方向的顺序就是{p7,p6,p5,p4,p3,p2,p1},依次递增。

(4)构造凸包:

第一步:首先将基点p0入栈,p1和p2也依次入栈;

第二步:取栈顶的前两个点构成向量,即向量

第三步:判断点p(k+1)是否在向量的左边;

第四步:

情况1:若在向量的左边,则将点p(k+1)入栈,重复第二步;

情况2:若在向量的右边,将点pk 出栈,继续取下一个点,重复步骤二。

第五步:最后栈中存储的点就为凸包。

三、编程实现

1、判断点p3是否在p1p2左边函数。

5、测试结果图


相关内容

  • ACM 题型算法分类
  • ACM 题型算法分类 题目均来自: http://acm.pku.edu.cn/JudgeOnline/ 主流算法: 1.搜索 //回溯 2.DP(动态规划) 3.贪心 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同等安置矩形的并的面积与周 ...

  • 挑战杯自然科学类学术论文写作指导
  • 3第三章 "写作指南挑战杯"自然科学类学术论文 "分布共分为六个组挑战杯"大学生课外学术科技作品竞赛的参赛作品,其中属于自然科学类的有机械与控制组,根据学科专业.信息技术组.数理组.生命科学组.能源化工组,以上各组的作品展现形式多为学术论文.怎样才能把参赛作品 ...

  • 最小生成树数据结构实验报告
  • 摘 要 最小生成树是数据结构中图的一种重要应用,在图中对于n个顶点的连通网 可以建立许多不同的生成树,最小生成树就是在所有生成树中总的权值最小的生成树. 本课程设计是以邻接矩阵作为图的存储结构,分别采用Prim和Kruskal算法 求最小生成树.Kruskal算法和Prim算法是求最小生成树的常用算 ...

  • 计算机图形学实验报告
  • 教育科学与技术学院 2016/2017学年第一学期 实 验 报 告 实验课程名称 计算机图形学 专 业 教育技术学 学 生 学 号 B14150226 学 生 姓 名 朱志耀 指 导 教 师 熊健.闫静杰 指 导 单 位 通信与信息工程学院 日 期: 2016年 11月 24日 1.每项实验报告的内 ...

  • 最小生成树实验报告
  • 北京理工大学软件学院 一.实验目的 1. 通过上机程序,进一步加深对最小生成树的理解. 2. 掌握Kruskal算法. 3. 学会用程序解决离散数学中的问题. 4. 增强我们编写程序的能力. 二.实验内容 求带权无向联通平面图的最小生成树 三.实验环境 我的实验依旧是在VC6.0实验环境下完成的,而 ...

  • 密码学数学基础第三次实验报告
  • 北京电子科技学院(BESTI ) 课程: 学号: 实验日期: 实验序号: 实验题目: 实验成绩: 实验评语: 实验报告 密码学数学基础 班级: 20155301 姓名: 2016年11月28日 指导老师: 实验三 群(Zn*,×) 中生成元的搜索算法 53班 滕树晨李艳俊 实验三群(Zn*,×)中生 ...

  • 网络安全应用实训报告
  • 安全技术及应用实训 项目二:网络安全应用实训项目 报告 目 录 任务1 知识剖析 ........................................................................................................... 1 ...

  • 计算机图形学复习题+试卷
  • 一.名词解释: 1.计算机图形学 研究怎样用计算机生成.处理和显示图形和科学. 2.图象处理 将客观世界中原来存在的物体映象处理成新的数字化图象. 3.凸多边形 是指这样一类多边形:在多边形内任选两个点,将这两个点用线段连接后,此线段上所有的点都在多边形内. 4.种子填充算法 根据已知多边形区域内部 ...

  • 数据挖掘实验指导书
  • <数据挖掘>实验指导书 2011年3月1日 长沙学院信息与计算科学系 前言 随着数据库技术的发展,特别是数据仓库以及Web 等新型数据源的日益普及,形成了数据丰富,知识缺乏的严重局面.针对如何有效地利用这些海量的数据信息的挑战,数据挖掘技术应运而生,并显示出强大的生命力.数据挖掘技术使数 ...