3.凸包证明.zip

  • 5ilaya
    了解作者
  • C/C++
    开发工具
  • 2KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 0
    下载次数
  • 2021-01-27 15:37
    上传日期
求二维凸包的代码,用C++写的,涉及OpenGL->Glut
3.凸包证明.zip
  • point.h
    221B
  • quick hull.cpp
    3.1KB
  • line.h
    173B
内容介绍
#include"point.h" #include"line.h" /* 所有点集向量中第一个位置为标杆位置,不存储点; */ #include"iostream" #include"vector" #include"gl/freeglut_std.h" #define FREEGLUT_STATIC #include <GL/glut.h> using namespace std; //设置点的数目 #define POINT_NUM 20 #define ZERO 1e-12 vector<Point>Points; vector<Line>Lines; //初始化点集 void InitPoints() { float x,y; srand(1000); Points.push_back(Point(0,0,0)); for(int i=1;i<=POINT_NUM;i++) { Point temp(0,0,0); x = (rand()%200-100)*0.01; y = (rand()%200-100)*0.01; temp.id = i; temp.x = x; temp.y = y; Points.push_back(temp); } } //得到三个点围成的面积,为正则p3在凸包左侧,否则在右侧 float Area(Point p1,Point p2,Point p3) { return (p1.x * p2.y + p3.x * p1.y + p2.x * p3.y - p3.x * p2.y - p2.x * p1.y - p1.x * p3.y); } void Sort(vector<Point>& S) { Point temp; for(int i=1; i<S.size()-1;i++) { for(int j=i+1; j<S.size();j++) { if(S[i].x>S[j].x) { temp = S[i]; S[i] = S[j]; S[j] = temp; } } } } void QuickHull(Point a, Point b,vector<Point>& S) { //pMax点为使得面积最大的凸包顶点 Point pMax(-1,-1,-1); Point p3; float area = 1e-12; float maxArea =-(1e12); vector<Point>S1;//存放左侧点 vector<Point>S2;//存放右侧点 S1.push_back(Point(0,0,0)); S2.push_back(Point(0,0,0)); for(int i=1;i<S.size();i++) { if(a.id!=S[i].id && b.id!=S[i].id && pMax.id != S[i].id) { area = Area(a,b,S[i]); if(area>maxArea) { pMax = S[i]; maxArea = area; } } } if(pMax.id!=-1) { for(int i=1;i<S.size();i++) { p3 = S[i]; if(Area(a,pMax,p3)>ZERO) S1.push_back(S[i]); else if(Area(pMax,b,p3)>ZERO) S2.push_back(S[i]); } //if(S1.size()!=1) // Sort(S1); //if(S2.size()!=1) // Sort(S2); QuickHull(a,pMax,S1);//左凸包递归 QuickHull(pMax,b,S2);//右凸包递归 } else { Line temp; temp.a = a; temp.b = b; Lines.push_back(temp); return; } } void RenderScene() { glClear(GL_COLOR_BUFFER_BIT); //不能用GL_LINE glColor3f(1,0,0); glPointSize(3); glBegin(GL_POINTS); for(int i=1;i<Points.size();i++) glVertex2f(Points[i].x,Points[i].y); glEnd(); glBegin(GL_LINES); for(int i=0;i<Lines.size();i++) { float x1 = Lines[i].a.x; float y1 = Lines[i].a.y; float x2 = Lines[i].b.x; float y2 = Lines[i].b.y; glColor3f(fabs(x1),fabs(x2),0); glVertex2f(x1,y1); glVertex2f(x2,y2); } glEnd(); glutSwapBuffers(); } int main(int argc, char* argv[]) { InitPoints(); Point a,b; //将所有点按x的大小进行排序,并找出x最小的和最大的点 Sort(Points); a = Points[1]; b = Points[Points.size()-1]; QuickHull(a,b,Points); QuickHull(b,a,Points); glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutCreateWindow("凸包问题"); glClearColor(1,1,1,1); glutDisplayFunc(RenderScene); glutMainLoop(); /*cout<<"线段依次为:"<<endl; for(int i=0;i<Lines.size();i++) { cout<<"("<<Lines[i].a.x<<" , "<<Lines[i].a.y<<")"<<" "<<"("<<Lines[i].b.x<<" , "<<Lines[i].b.y<<")"<<endl; } return 0;*/ }
评论
    相关推荐
    • GaussDB_100_1.0.1-DATABASE-REDHAT-64bit.tar.gz
      guassdb100在redhat上安装包,单机部署的包,安装步骤请看我的文中介绍,经过大量实验搭建总结出来的文档
    • SIM800C_MQTT.rar
      使用SIM800C模块,使用MQTT协议,连接中国移动onenet平台,能实现数据的订阅、发布、存储等
    • 卷积神经网络
      这是卷积神经网络的一个实际用例,已经调试好了,能够在matlab上成功运行,适合从事卷积神经网络(CNN)研究的人员学习使用。
    • android从bootloader到launcher启动流程整理
      讲述android 开机流程 从boot rom---bootloader---init--zygote---systemserver---ams 并附上自己整理的每个流程的流程图 ,清晰熟悉android 启动流程
    • 分数阶混沌系统:分数阶混沌系统的数值解。-matlab开发
      该工具箱包含可用于模拟一些著名的分数阶混沌系统的函数,例如: - 陈的系统, - Arneodo的系统, - Genesio-Tesi 的系统, - 洛伦兹系统, - 牛顿-莱普尼克系统, - 罗斯勒的系统, - Lotka-Volterra系统, - 达芬的系统, - 范德波尔的振荡器, -伏打的系统- 陆氏系统, - 刘的系统, - Chua的系统, - 金融系统, - 3 细胞 CNN。 这些函数以数值方式计算描述混沌系统的分数阶非线性微分方程的解。 每个函数返回总模拟时间的状态轨迹(吸引器)。 更多详情请看书: Ivo Petras,分数阶非线性系统:建模、分析和仿真,Springer,系列:非线性物理科学,2011,ISBN 978-3-642-18100-9。 http://www.springer.com/engineering/control/book/978-3-
    • matlabpam代码-dsp-library:用于光通信的MATLABDSP函数库
      matlab pam代码 DSP库 该项目包含几种不同的功能,可将DSP算法应用于光通信。 这些功能适用于相干和非相干(PAM,DMT)光通信。 大多数功能是相互独立的。 因此,该代码中的功能可以轻松使用,并与其他DSP功能结合使用。 用法 功能列表以及简短说明在文件中。 输入和输出参数的描述在每个函数的标题中。 讯号 通常,输入(和输出)信号在第一维度上具有时间(例如,列向量),而第二维度用于一次管理多个信号(例如,不同的极化,不同的参数等)。 之所以选择这种约定,是因为MATLAB通过将列保留在内存的连续部分中来存储矩阵,因此,这种约定比其他方法(行向量)要快。 参数 大多数功能使用参数结构作为输入参数。 函数中使用的参数的描述通常在标头中,而coherent-dsp函数的默认参数在文件中。 参考 执照 此代码在下发布。
    • 有关多目标跟踪的PHD滤波的一些资料
      一些关于多目标跟踪的新的文献,主要是有关概率假设密度(PHD)的
    • 基于python开发的全国新工商采集工具 v1.2版本
      这个软件是通过scrapy爬虫框架结合代理IP池再加上request模拟请求技术以及验证码识别技术,可以做到日更新采集全国新工商信息。采集的数据自动存储在mysql数据库表里,可下载全量1.8亿多企业工商基本信息和36维度的详细信息.支持sql和excel导出数据包格式。
    • Aerosim Blockset
      The AeroSim aeronautical simulation blockset provides a complete set of tools for the rapid development of nonlinear 6-degree of freedom aircraft dynamic models. In addition to the basic aircraft dynamics blocks, the library also includes complete aircraft models which can be customized through parameter files.
    • matlab匹配滤波代码-matlab_for_thesis:Matlab博士学位论文代码
      matlab匹配滤波代码博士论文的MATLAB代码 博士论文的MATLAB代码的一部分,“井田双色散水下声通道中的多载波通信”。 函数下的func_JingTian文件夹 FUNC_JINGTIAN包含多载波通信中一些通常需要的功能: OFDM调制/解调模块,包括几种数据辅助的信道估计方法和差分解调; 快速实现GFDM和C-FBMC调制/解调,分别包括时域和频域的迫零(ZF)和匹配滤波(MF)均衡; 为OFDM信道估计中使用的压缩感测方法计算字典的功能; 增加信道效应,施加宽带多普勒失真的功能; 通过线性调频Z变换(CZT)以任意精度对频域中的信号进行重采样; Hermite函数合成的信号之间的交叉歧义函数的计算。 演示文件夹 以下列出了四个演示 demo1:使用基本追踪(BP)算法形式的压缩感知方法对OFDM进行稀疏2-D信道估计; demo2:比较基本数据辅助OFDM信道估计算法,包括常规频域插值和基于IDFT的变换域方法; demo3:圆形滤波器组多载波(C-FBMC / OQAM)的基于DFT特征向量的原型滤波器合成; demo4:用于广义频分复用(GFDM)的辅助日期辅助无干