计算几何算法的实现

合集下载

基于计算几何的公交站点上下行判定方法研究与实现——以宜兴市为例

基于计算几何的公交站点上下行判定方法研究与实现——以宜兴市为例

基于计算几何的公交站点上下行判定方法研究与实现——以
宜兴市为例
邢策梅;周松
【期刊名称】《现代测绘》
【年(卷),期】2024(47)1
【摘要】公交数据是智慧城市时空大数据不可或缺的专题数据,通过爬虫技术获取的互联网公交数据可用于扩充智慧城市时空大数据。

互联网获取的公交站点数据存在冗余且离散,不能正确地反映公交站点的个数及上下行情况。

为解决这些问题,在阐述计算几何叉积算法、网络爬虫技术、多线程坐标转换技术和几何中心计算方法的基础上,采用Python编程实现从数据获取、坐标转换、上下行判定、几何中心计算到格式转换的全流程。

从宜兴市公交数据处理的结果来看,经基于计算几何的上下行判定方法结合几何中心点确定的公交站点数据,能基本反映公交数据的真实情况。

【总页数】5页(P70-74)
【作者】邢策梅;周松
【作者单位】江苏省测绘工程院
【正文语种】中文
【中图分类】P208;U491.17
【相关文献】
1.基于计算几何方法的WSN节点部署研究
2.基于聚类分析方法的公交站点客流匹配方法研究
3.基于计算几何的曲面造型方法研究
4.基于路网的常规公交站点空间可达性评析方法--以虹桥枢纽公交接驳评估为例
因版权原因,仅展示原文概要,查看原文内容请购买。

程序设计艺术与方法

程序设计艺术与方法

程序设计艺术与方法实验一STL 的熟悉与使用1.实验目的(1)掌握C++中STL 的容器类的使用。

(2)掌握C++中STL 的算法类的使用。

2.试验设备硬件环境:PC 计算机软件环境:操作系统:Windows 2000 / Windows XP / Linux 语言环境:Dev cpp / gnu c++3.试验内容(1) 练习vector 和list 的使用。

定义一个空的vector,元素类型为int,生成10 个随机数插入到vector 中,用迭代器遍历vector 并输出其中的元素值。

在vector 头部插入一个随机数,用迭代器遍历vector 并输出其中的元素值。

用泛型算法find 查找某个随机数,如果找到便输出,否则将此数插入vector 尾部。

用泛型算法sort 将vector 排序,用迭代器遍历vector 并输出其中的元素值。

删除vector 尾部的元素,用迭代器遍历vector 并输出其中的元素值。

将vector 清空。

定义一个list,并重复上述实验,并注意观察结果。

(2) 练习泛型算法的使用。

- 149定义一个vector,元素类型为int,插入10 个随机数,使用sort 按升序排序,输出每个元素的值,再按降叙排序,输出每个元素的值。

练习用find 查找元素。

用min 和max 找出容器中的小元素个大元素,并输出。

源代码:#include <iostream>#include <vector>#include<iomanip>#include<ctime>#include <algorithm>using namespace std;vector<int> myV;bool sortup(int v1,int v2){return v1<v2;}int main(int argc, char *argv[]){srand(time(NULL));for (int i=0;i<10;i++)myV.push_back(rand());sort(myV.begin(),myV.end(),sortup);vector<int>::iterator it1;for (it1=myV.begin();it1!=myV.end();it1++){cout<<(*it1)<<setw(6);}cout<<endl;int min=myV[0];for (it1=myV.begin()+1;it1!=myV.end();it1++) if((*it1)<min)min=(*it1);cout<<"最小元素为" <<min<<endl;int max=myV[0];for (it1=myV.begin();it1!=myV.end();it1++)if((*it1)>max)max=(*it1);cout<<"最大元素为" <<max<<endl;cout<<endl;int value=rand();it1=find(myV.begin(),myV.end(),value);if((*it1)==value)cout<<"找到了这个随机数"<<endl ;elsecout<<"没有找到这个随机数"<<endl;myV.insert(myV.end(),value);cout<<"插入尾部的随机数为"<<value<<endl;for (it1=myV.begin();it1!=myV.end();it1++){cout<<(*it1)<<setw(6);}cout<<"\n"<<endl;int t=rand();myV.insert(myV.begin(),t);cout<<"插入头部的随机数为" <<t<<endl;for (it1=myV.begin();it1!=myV.end();it1++){cout<<(*it1)<<setw(6);}cout<<endl;myV.pop_back ();for (it1=myV.begin();it1!=myV.end();it1++) {cout<<(*it1)<<setw(6);}cout<<endl;myV.clear();if(myV.empty()){cout << "It's empty!" << endl;}system("PAUSE");return 0;}运行截图:2练习泛型算法的使用:源代码:#include<list>#include<iostream>//#inclued<algorithm>using namespace std;typedef list<int> lin;int value[]={1,2,3,4,5};void print(lin &l){int i;lin::iterator lit;for(lit=l.begin();lit!=l.end();lit++) cout<<(*lit)<<" ";cout<<endl;}bool sortsp(int v1,int v2){return v1>v2;}lin lin2;lin2.push_front(3);lin2.push_front(4);lin2.insert(lin2.begin(),value,value+5);cout<<"lin2内的元素为:";print(lin2);lin2.sort();cout<<"排序后的lin2: ";print(lin2);lin2.push_front(10);cout<<"在list头部插入10之后的结果:"; print(lin2);lin2.remove(6);cout<<"删除一个数后的lin1:";print(lin2);system("PAUSE");return 0;}实验二搜索算法的实现1. 实验目的(1) 掌握宽度优先搜索算法。

二分法程序实现平面区域计算几何

二分法程序实现平面区域计算几何

二分法程序实现平面区域计算几何计算几何是一门研究不同形状的几何图形之间的关系和属性的学科。

而平面区域计算几何则是研究平面上的区域和图形之间的关系和属性的领域。

在平面区域计算几何中,二分法是一种常见且有效的算法,能够在相当快的时间内对平面上的区域和图形进行分析和计算。

下面将介绍如何使用编程语言实现二分法程序,在计算几何问题中应用。

一、二分法算法二分法是一种基于分治思想的高效算法,其核心思想是通过将一个问题拆分为多个子问题,逐步缩小问题规模,最终得到问题的解。

在平面区域计算几何中,二分法通常被用来确定一个区域中特定位置的坐标或特定图形的性质。

下面是二分法的伪代码:```// 求解特定区域中位置的坐标或图形的性质low = 区域左下角坐标high = 区域右上角坐标while low < high:mid = (low + high) / 2if 满足条件1:high = midelse:low = mid + 1// 返回满足条件的坐标或性质return low```在二分法算法中,我们需要定义满足条件1的规则,以便在分治过程中快速定位目标区域。

对于不同问题,这个规则有很大的差异。

二、应用二分法算法解决平面区域计算几何问题使用二分法实现平面区域计算几何,需要先定义问题,然后才能确定条件1和算法规则。

这里我们的例子是一个简单的问题:给定一个二维平面上的矩形区域和一个内部点P,求该点到矩形的距离。

这个问题在计算机图形学和计算几何中是一个经典问题,可以应用于线段和多边形的求解。

二分法的核心是分治,所以我们首先要将问题分解为多个子问题,然后使用递归算法来解决它。

在这个问题中,我们可以使用水平线和垂直线将矩形划分成9个小矩形(包括本身)。

然后对每个小矩形重复这个过程,直到我们找到包含点P的最小矩形。

这个过程可以看做是一个模板,我们可以在这个过程中填充我们自己定义的条件1和算法规则。

代码实现如下:```// 定义一个二维点类class Point {double x;double y;}// 定义一个矩形类class Rect {Point topLeft;Point bottomRight;}// 定义一个函数来计算点到矩形的距离double distanceFromPointToRect(Point p, Rect rect) {// 判断点是否在矩形内if (p.x >= rect.topLeft.x && p.x <= rect.bottomRight.x &&p.y >= rect.topLeft.y && p.y <= rect.bottomRight.y) {return 0;}// 判断点在矩形的上下左右哪个区域double dx = 0.0, dy = 0.0;if (p.x < rect.topLeft.x) {dx = p.x - rect.topLeft.x;} else if (p.x > rect.bottomRight.x) {dx = p.x - rect.bottomRight.x;}if (p.y < rect.topLeft.y) {dy = p.y - rect.topLeft.y;} else if (p.y > rect.bottomRight.y) {dy = p.y - rect.bottomRight.y;}// 如果点在矩形的左上角、右上角、右下角或者左下角,直接返回距离if (dx == 0.0 || dy == 0.0) {return sqrt(dx*dx + dy*dy);}// 查找包含点P的最小子矩形Rect subRect = null;while (true) {// 将当前矩形平分为4个子矩形double midX = (rect.topLeft.x + rect.bottomRight.x) / 2.0;double midY = (rect.topLeft.y + rect.bottomRight.y) / 2.0;Rect[] subRects = {new Rect(rect.topLeft, new Point(midX, midY)),new Rect(new Point(midX, rect.topLeft.y), newPoint(rect.bottomRight.x, midY)),new Rect(new Point(midX, midY), rect.bottomRight),new Rect(new Point(rect.topLeft.x, midY), new Point(midX, rect.bottomRight.y))};// 判断点所在的子矩形if (p.x < midX) {if (p.y < midY) {subRect = subRects[0];} else {subRect = subRects[1];}} else {if (p.y < midY) {subRect = subRects[3];} else {subRect = subRects[2];}}// 如果包含点,则递归实现求解if (p.x >= subRect.topLeft.x && p.x <= subRect.bottomRight.x &&p.y >= subRect.topLeft.y && p.y <= subRect.bottomRight.y) {return distanceFromPointToRect(p, subRect);}// 否则将包含点的子矩形作为下一个矩形继续递归分治rect = subRect;}}```这个算法基于二分法思想,分治过程中计算出点P到矩形最小矩形的距离,最终得出点P到矩形的距离。

计算几何算法

计算几何算法

计算几何算法计算几何学是一门复杂而又深入的学科,它将数学和计算机科学结合在一起,用于对空间几何问题提出数学和计算机科学方法的解决方案。

计算几何学研究的主要内容包括几何计算、几何分析、图形处理等等。

计算几何学的研究可以追溯到古希腊的几何学,但它作为现代科学的一个分支是在20世纪60年代开始发展的。

在这50多年的发展中,计算几何学逐渐发展出一系列算法以解决各种几何问题。

计算几何学的算法分为基本算法和高级算法。

基本算法主要包括点位置检查算法、距离计算算法、可视性分析算法、图算法等等。

例如,点位置检查算法是一种用于判断两个点在三维空间中的关系的算法,距离计算算法用于计算两点在三维空间中的距离,可视性分析算法用于检测两个几何物体之间的可视性,而图算法则是用于建模空间结构和做几何计算的一类算法。

除了基本算法外,计算几何学还涉及一些高级算法,如几何建模算法、线性规划算法、最短路径算法、剖面分析算法等。

几何建模算法用于模拟物体的表面形状,利用该算法可以建立更真实的虚拟模型。

线性规划算法用于解决线性优化问题,可以用来找出最优路径。

最短路径算法用于求解具有权重的网络最短路径,是图论中应用最广泛的算法之一。

最后,剖面分析算法则是一种用于求解物体表面剖面的算法,可以帮助分析物体的结构和性质。

计算几何学的算法可以应用于各种空间几何问题的求解,为计算机视觉、图形学以及制造等领域提供了强大的算法支持。

计算几何学算法在空间几何问题领域中占据着重要的地位,在各种空间几何计算中得到了广泛的应用。

随着计算机技术的不断发展,计算几何学算法也在不断的完善和改进,使得计算几何学能够更加有效的解决空间几何问题,为解决现实世界中的各种复杂问题提供了强有力的技术支持。

展望未来,计算几何学将继续发展壮大,发展出更加强大的算法,为人类带来更多惊喜和机遇。

信息学竞赛中的计算几何问题与算法

信息学竞赛中的计算几何问题与算法

信息学竞赛中的计算几何问题与算法计算几何是信息学竞赛中的一个重要篇章,它将几何学和计算机科学相结合,利用算法和数据结构解决实际问题。

在本文中,我们将探讨信息学竞赛中的计算几何问题以及相应的算法。

一、点和线的处理信息学竞赛中,点和线的处理是最基础的问题之一。

常见的问题有求两点之间的距离、点是否在线段上、点是否在多边形内、线段是否相交等。

对于求两点之间的距离,我们可以利用勾股定理进行计算。

假设有两点A(x1, y1)和B(x2, y2),则距离d可以通过以下公式计算:d = sqrt((x2-x1)^2 + (y2-y1)^2)。

判断点是否在线段上可以利用叉积的性质。

设点A(x1, y1)、B(x2, y2)、C(x3, y3),则若AB和AC的叉积等于0,即(x2-x1)*(y3-y1) - (x3-x1)*(y2-y1) = 0,点C在线段AB上。

判断点是否在多边形内可以利用射线法。

假设有一条射线从当前点发出,若与多边形的边交点数为奇数,则点在多边形内;若为偶数,则点在多边形外。

判断线段是否相交可以利用线段相交的充要条件。

对于两条线段AB和CD,若AC和AD的叉积和BC和BD的叉积异号,并且CA和CB的叉积和DA和DB的叉积异号,则线段AB和CD相交。

二、面积和重心的计算另一个重要的计算几何问题是求解多边形的面积和重心。

多边形的面积可以通过求解多边形顶点的坐标和来计算,其中x[i]和y[i]分别表示第i个顶点的横坐标和纵坐标。

根据公式:Area = 0.5 * (x[0]*y[1] +x[1]*y[2] + ... + x[n-1]*y[0] - x[1]*y[0] - x[2]*y[1] - ... - x[0]*y[n-1]),即可求得多边形的面积。

多边形的重心是指多边形所有顶点的平均位置,计算重心的坐标可以通过求解多边形每个顶点和重心的横纵坐标之和的平均值来得到。

重心的横坐标的计算公式为:x = (x[0] + x[1] + ... + x[n-1]) / n,纵坐标的计算公式为:y = (y[0] + y[1] + ... + y[n-1]) / n。

给定平面上的n个点,求距离最近的两个点的距离。c语言

给定平面上的n个点,求距离最近的两个点的距离。c语言

给定平面上的n个点,求距离最近的两个点的距离。

c语言给定平面上的n个点,我们需要找到距离最近的两个点之间的距离。

这是一个常见的计算几何问题,在计算机科学中有很多有效的算法可以解决这个问题。

在本文中,我们将使用C语言来实现一个简单但有效的算法来求解这个问题。

首先,我们需要定义一个点的结构体来表示平面上的点。

点结构体可以包含两个成员变量,分别表示x和y坐标。

cstruct point {double x;double y;};接下来,我们需要实现一个计算两点之间距离的函数。

根据欧几里得距离公式,两点之间的距离可以通过下列公式计算得出:cdouble distance(struct point p1, struct point p2) {double dx = p1.x - p2.x;double dy = p1.y - p2.y;return sqrt(dx * dx + dy * dy);}现在我们已经有了计算距离的函数,接下来我们将介绍一种简单但有效的算法来找到距离最近的两个点。

我们首先需要将所有的点按照x坐标进行排序。

使用快速排序算法可以很高效地实现这一步。

cvoid quickSort(struct point arr[], int low, int high) {if (low < high) {int pivot = partition(arr, low, high);quickSort(arr, low, pivot - 1);quickSort(arr, pivot + 1, high);}}int partition(struct point arr[], int low, int high) {struct point pivot = arr[high];int i = (low - 1);for (int j = low; j <= high - 1; j++) {if (arr[j].x <= pivot.x) {i++;swap(&arr[i], &arr[j]);}}swap(&arr[i + 1], &arr[high]);return (i + 1);}void swap(struct point* a, struct point* b) {struct point temp = *a;*a = *b;*b = temp;}在完成排序之后,我们可以使用分治算法来找到最近的两个点。

计算几何中的交点检测算法研究

计算几何中的交点检测算法研究计算几何是一门研究几何形体与计算机表示与处理的学科。

其中,交点检测算法是计算几何中的重要内容之一,它能够在运用中涉及到多种场合,如矢量图形编辑器、计算机辅助设计(CAD)等领域。

本文将基于此进行研究。

一、计算几何中的交点检测算法意义计算几何中的交点检测算法是指根据输入的变量,判断它们是否有交点的一种算法。

简单来说,就是当我们需要判断两个图像是否相交时,通过计算两者之间是否存在交点来得出结论。

这种算法在矢量图形的绘制以及计算机辅助设计中得到广泛应用。

二、计算几何中交点检测算法的部分实现方法下面我们将介绍几种实现交点检测的常见方法,它们分别是:扫描线算法、随机增量法、新是赋权法和线段树法。

1. 扫描线算法扫描线算法通过将图形分割成一系列的横向均匀间隔的线段,并将其存放到二叉搜索树中,来判断两个图像之间是否存在交点。

通过该算法可以实现对图像的快速处理,同时也能够减少计算量。

但是使用此方法需要做好数据的预处理工作,否则算法复杂度会变得比较高,而时间和空间成本也会变得高昂。

2. 随机增量法随机增量法是通过随机选择一个点作为增量向量,来确定一个合理的交点。

本方法也可以支持多边形的交点检测。

其最大的优点就是运行速度快,但缺点在于结果的可靠性不是太高,需要对一些特殊情况作出特殊处理,否则容易出现计算错误的情况。

3. 新是赋权法新是赋权法主要是通过每个交点赋权进行筛选,然后根据权值大小来确定是否为合格交点。

该算法的优点在于运算简单,但缺点在于精度会受到赋权参数的影响,如果不恰当设置赋权参数可能会出现误差。

4. 线段树法线段树法是一种基于线段树数据结构的算法。

通过构建线段树,将多边形分为若干的子区域,并将其插入到线段树中,从而实现多边形的交点检测。

该算法可以有效地减少计算复杂度,同时,也能够精准的检测两个图形之间的交点。

三、总结交点检测算法的运用非常广泛,无论是在几何图形处理中还是在计算机辅助设计中都有着重要的作用。

计算几何算法与实现

计算几何算法与实现
计算几何算法是计算机科学领域中的一个重要分支,其主要研究对象是在计算机中对几何形体的描述、计算和变换。

计算几何算法包括点、线、多边形、曲线、曲面等几何形体的基本操作,如插值、拟合、裁剪、交、并、差、距离、相似变换、仿射变换、透视变换等。

在实际应用中,计算几何算法被广泛应用于计算机图形学、计算机辅助设计、计算机视觉、机器人、计算机动画等领域。

本书旨在系统介绍计算几何算法及其实现方法,涵盖了点、线、多边形、曲线、曲面等几何形体的基本操作及其应用。

本书共分为四个部分。

第一部分介绍计算几何算法的基础知识,包括坐标系、向量、点乘、叉乘、向量长度、向量夹角等概念。

第二部分重点介绍计算几何算法的基本操作,包括点、线、多边形、曲线、曲面的插值、拟合、裁剪、交、并、差、距离等。

第三部分介绍计算几何算法的应用,包括计算机图形学、计算机辅助设计、计算机视觉、机器人、计算机动画等领域的常用算法及其实现方法。

第四部分介绍计算几何算法的最新进展,包括深度学习、机器学习、数据挖掘等领域中的应用。

本书的目标读者为计算机科学及相关专业的本科、研究生学生,以及从事计算机图形学、计算机辅助设计、计算机视觉、机器人、计算机动画等领域工作的专业人员。

本书既可作为高校计算几何算法课程的教材,也可作为相关领域从业人员的参考书。

- 1 -。

计算几何与图形学有关的几种常用算法

算法系列之九:计算几何与图形学有关的几种常用算法(一)分类:算法系列2011-12-18 23:13 8182人阅读评论(41) 收藏举报我的专业是计算机辅助设计(CAD),算是一半机械一半软件,《计算机图形学》是必修课,也是我最喜欢的课程。

热衷于用代码摆平一切的我几乎将这本教科书上的每种算法都实现了一遍,这种重复劳动虽然意义不大,但是收获很多,特别是丢弃了多年的数学又重新回到了脑袋中,算是最大的收获吧。

尽管已经毕业多年了,但是每次回顾这些算法的代码,都觉得内心十分澎湃,如果换成现在的我,恐怕再也不会有动力去做这些事情了。

在学习《计算机图形学》之前,总觉得很多东西高深莫测,但实际掌握了之后,却发现其中了无神秘可言,就如同被原始人像神一样崇拜的火却被现代人叼在嘴上玩弄一样的感觉。

图形学的基础之一就是计算几何,但是没有理论数学那么高深莫测,它很有实践性,有时候甚至可以简单到匪夷所思。

计算几何是随着计算机和CAD的应用而诞生的一门新兴学科,在国外被称为“计算机辅助几何设计(Computer Aided Geometric Design,CAGD)”。

“算法系列”接下来的几篇文章就会介绍一些图形学中常见的计算几何算法(顺便晒晒我的旧代码),都是一些图形学中的基础算法,需要一些图形学的知识和数学知识,但是都不难。

不信?那就来看看到底有多难。

本文是第一篇,主要是一些图形学常用的计算几何方法,涉及到向量、点线关系以及点与多边形关系求解等数学知识,还有一些平面几何的基本原理。

事先声明一下,文中涉及的算法实现都是着眼于解释原理以及揭示算法实质的目的,在算法效率和可读性二者的考量上,更注重可读性,有时候为了提高可读性会刻意采取“效率不高”的代码形式,实际工程中使用的代码肯定更紧凑更高效,但是算法原理都是一样的,请读者们对此有正确的认识。

一、判断点是否在矩形内计算机图形学和数学到底有什么关系?我们先来看几个例子,增加一些感性认识。

几何计算

计算几何的常用算法1. 矢量减法设二维矢量 P = (x1,y1),Q = (x2,y2)则矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )显然有性质 P - Q = - ( Q - P )如不加说明,下面所有的点都看作矢量,两点的减法就是矢量相减;2.矢量叉积设矢量P = (x1,y1),Q = (x2,y2)则矢量叉积定义为:P × Q = x1*y2 - x2*y1 得到的是一个标量显然有性质P × Q = - ( Q × P )P × ( - Q ) = - ( P × Q )如不加说明,下面所有的点都看作矢量,点的乘法看作矢量叉积;叉乘的重要性质:> 若P × Q > 0 , 则P 在Q的顺时针方向> 若P × Q < 0 , 则P 在Q的逆时针方向> 若P × Q = 0 , 则P 与Q共线,但可能同向也可能反向3.判断点在线段上设点为Q,线段为P1P2 ,判断点Q在该线段上的依据是:( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以 P1,P2为对角顶点的矩形内4.判断两线段是否相交我们分两步确定两条线段是否相交:(1).快速排斥试验设以线段 P1P2 为对角线的矩形为R,设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交;(2).跨立试验如果两线段相交,则两线段必然相互跨立对方,如图1所示。

在图1中,P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0上式可改写成( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明 ( P1 - Q1 ) 和( Q2 - Q1)共线,但是因为已经通过快速排斥试验,所以 P1 一定在线段 Q1Q2上;同理,( Q2 - Q1) ×(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2上。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

度。

下图是个例子:
四、实验结果与分析(源程序及相关说明)
1)#include<iostream>
#include<utility>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<double,double> POINT;//线段
//fuction dirction determines the direction that the seqment
//p1p turns to p2p with respect to point p
//if return value is positive,means clockwise;
//if return value is negative,means counter-clockwise;
//naught means on the same line;
double direction(POINT p,POINT p1,POINT p2){
POINT v1,v2;
v1.first=p2.first-p1.first;
v1.second=p2.second-p1.first;
v2.first=p1.first-p.first;
v2.second=p1.second-p.second;
return v1.first*v2.second-v1.second*v2.second;}
//fuction on_seqment determines whether the point p is
on the segment p1p2
bool on_segment(POINT p,POINT p1,POINT p2){
double min_x=p1.first<p2.first?p1.first:p2.first;
double max_x=p1.first>p2.first?p1.first:p2.first;
double min_y=p1.second<p2.second?p1.second:p2.second;
double max_y=p1.second>p2.second?p1.second:p2.second;
if(p.first>=min_x&&p.first<max_x&&p.second>=
min_y&&p.second<=max_y)
return true;
else
return false;}
//point startPoint is the polor point that is needed for comparing two other poinr; POINT startPoint;
//function sortByPolorAngle provides the realizing of comparing two points,which support //the STL function sort();
bool sortByPolorAngle(const POINT &p1,const POINT &p2)
{
double d=direction(startPoint,p1,p2);
if(d<0)return true;
if(d>0)return false;
if(d==0&&on_segment(startPoint,p1,p2))return true;
if(d==0&&on_segment(p2,startPoint,p1))return true;
return false;
}
//here realizes the process of finding convex hull
void find_convex_hull(vector<POINT>&point)
{
POINT p0=point[0];
int k=0;
for(int i=0;i<point.size();i++)
{
if(point[i].second<p0.second||
point[i].second==p0.second&&point[i].first<p0.first){
p0=point[i];
k=i;}
}
point.erase(point.begin()+k);
point.insert(point.begin(),p0);
vector<POINT>convex_hull;
do{
convex_hull.push_back(point[0]);
startPoint=point[0];
point.erase(point.begin());
sort(point.begin(),point.end(),sortByPolorAngle);
if(point[0]==convex_hull[0])break;
point.push_back(convex_hull[convex_hull.size()-1]);
}while(1);
for(int j=0;j<convex_hull.size();j++){
cout<<convex_hull[j].first<<' '<<convex_hull[j].second<<endl;
}}
int main(){
vector<POINT> pv;
double x,y;
int i;
cout<<"请输入10个点<x,y>:"<<endl;
for(i=1;i<=10;i++){
cout<<"No."<<i<<':';
cin>>x>>y;
pv.push_back(make_pair(x,y));}
cout<<endl;
find_convex_hull(pv);
system("Pause");
return 0;}。

相关文档
最新文档