今天做作业
,研究凸包算法,写了一个专说中很快的方法。听说效率N,算法的精髓在于任何的判断操作都基于一个点和向量的位置关系。
例如,要判断点是否在多边形内,只需判断点和每条边向量的位置是否都一直,都在左边或者都在右边。
bool CGrahamView::isLeft(CPoint point,m_line *line)
{
//m_line x;
float a=line->a;
float b=line->b;
float c=line->c;
float v=a*point.x+b*point.y+c*1.0f;
if(v<=0)
return true;
else
return false;
}
m_line CGrahamView::createLine(CPoint i, CPoint j)
{
//m_line *line=new m_line();
m_line line;
line.i=i;
line.j=j;
line.a=i.y-j.y;
line.b=j.x-i.x;
line.c=i.x*j.y-j.x*i.y;
return line;
}
bool CGrahamView::isInside(node *head, CPoint pt,bool isClock)
{
int flag=1;
node *p;
p=head->next;
vector<m_line> v_line;
m_line line;
while(p!=NULL&&p->next!=NULL)
{
line=createLine(p->pt,p->next->pt);
v_line.push_back(line);
p=p->next;
}
line=createLine(p->pt,head->next->pt);
v_line.push_back(line);
if(isClock==true)
{
for(int i=0;i<v_line.size();i++)
{
if(isLeft(pt,&v_line[i])==true)
{
flag=0;
break;
}
}
}
if(isClock==false)
{
for(int i=0;i<v_line.size();i++)
{
if(isLeft(pt,&v_line[i])==false)
{
flag=0;
break;
}
}
}
if(flag==0)
return false;
else
return true;
}
bool CGrahamView::findVisible(node *head, CPoint pt,bool isClock)
{
node * p;
p=head->next;
vector<m_line> v_line;
vector<int> v_point;
m_line line;
while(p!=NULL&&p->next!=NULL)
{
line=createLine(p->pt,p->next->pt);
v_line.push_back(line);
p=p->next;
}
line=createLine(p->pt,head->next->pt);
v_line.push_back(line);
if(isClock==true)
{
for(int i=0;i<v_line.size();i++)
{
if(isLeft(pt,&v_line[i])==true)
v_point.push_back(i);
}
}
else
{
for(int i=0;i<v_line.size();i++)
{
if(isLeft(pt,&v_line[i])==false)
v_point.push_back(i);
}
}
int sit=0;
int flag1;
int flag2;
int count=0;
count=v_point.size();
for(int i=0;i<v_point.size()-1;i++)
{
if(v_point[i]!=v_point[i+1]-1)
{
flag1=v_point[i];
flag2=v_point[i+1];
sit=1;
break;
}
}
if(sit==0)
{
int start=v_point[0]+1;
int end;
if(count>=2)
{
start=v_point[0]+1;
end=v_point[count-1];
for(int i=start;i<=end;i++)
//p=index(head,v_point[1]);
dele(head,start);
}
insert(head,pt,start-1);
v_point.clear();
}
else
{
int start=flag2+1;
insert(head,pt,flag2);
if(count>=2)
{
node*p=CGrahamView::index(head,(flag2+1)%CGrahamView::getSize(head));
node*q=p->next;
for(int i=count-1;i>0;i--)
{
if(q==NULL)
{
dele(head,0);
//q=head->next;
}
else
{
node*w =q;
q=q->next;
p->next=q;
delete w;
}
//if(start%CGrahamView::getSize(head)<flag2)
//flag2--;
// dele(head,start);
}
}
//insert(head,pt,flag2);
v_point.clear();
}
return 0;
}
node* CGrahamView::index(node *head, int index)
{
int i=0;
node*p;
if(index<0)
p=NULL;
else
{
p=head->next;
while(p!=NULL&&i<index)
{
p=p->next;
i++;
}
}
return p;
}
bool CGrahamView::insert(node*head,CPoint pt, int index)
{
if(index<0)
return false;
node*p;
p=CGrahamView::index(head,index);
node* np=new node();
np->pt=pt;
np->next=p->next;
p->next=np;
return true;
}
bool CGrahamView::dele(node *head, int index)
{
node*p;
int size=CGrahamView::getSize(head);
if(size==0)
// MessageBox("0");
return false;
index=index%size;
if(index<0)
return false;
if(index==0)
{
p=head->next;
head->next=p->next;
delete p;
}
else
{
p=CGrahamView::index(head,index-1);
node*q=p->next;
p->next=q->next;
delete q;
}
return true;
}
int CGrahamView::getSize(node* head)
{
int size=0;
node* p;
p=head->next;
while(p!=NULL)
{
size++;
p=p->next;
}
return size;
}
分享到:
相关推荐
凸包算法是计算机科学中的一种重要算法,主要应用于几何计算和数据处理领域。它用于找到一个二维平面上一组点的最小凸多边形,这个多边形包含了所有的点,并且是最小的。在这个场景中,"凸包算法计算随机散点的最小...
凸包算法C实现 凸包算法是计算几何中的一种基础和经典算法,用于计算一组点的凸包。凸包是指包含所有给定点的最小凸多面体。在计算机科学和信息技术领域,凸包算法有着广泛的应用,如计算机视觉、机器人学、GIS 等...
在给定的Java程序中,“计算几何求凸包算法的java实现”是解决这个问题的关键。 这个Java代码实现了对离散点集进行求解凸包的过程。在图形用户界面中,用户可以通过鼠标点击生成点,程序会实时地计算这些点的凸包并...
在MATLAB中实现凸包算法,可以有效地处理一系列几何问题,如碰撞检测、图像处理和机器学习等。本教程将详细介绍如何在MATLAB中实现快速的凸包算法。 首先,我们需要理解凸包的基本定义。给定一组二维或三维空间中的...
凸包算法是计算机科学中的一种重要算法,主要应用于图形学、机器学习、计算机视觉和几何计算等领域。在本项目中,我们关注的是如何通过界面化的方式实现这一算法,使用C++编程语言进行编码,并保证代码的可读性与...
graham求凸包算法 graham求凸包算法 graham求凸包算法 graham求凸包算法 graham求凸包算法 graham求凸包算法
二维快速凸包算法是计算机图形学、几何计算和算法设计中的一个重要概念,它在路径规划、碰撞检测、图像处理等领域有着广泛的应用。本篇将详细解释这个算法的原理、实现方式以及C++代码中的关键部分。 二维凸包是指...
两种凸包算法 算法导论的详细实现 C++ VS2008
### 一种新的最小凸包算法及其应用 #### 概述 最小凸包是几何计算中的一个重要概念,它指的是能够完全包含一组给定点集合的最小凸多边形。最小凸包在GIS(地理信息系统)、计算机图形学、模式识别、人工智能等多个...
本程序是基于C语言的凸包算法(Graham)实现,能够直接编译运行,计算凸包的点为随机生成。该程序为控制台应用程序,输出结果有凸包顶点坐标、以及一个50*50的矩阵,其中0表示空白点,1表示随机生成的点集,2表示...
采用Graham扫描法,实现提取凸包最小边界JS代码实现。(代码中点坐标采用平面坐标,如要在三维贴地展示,可转换为经纬度坐标)
C#作为一门面向对象的编程语言,提供了丰富的数据结构和算法库,使得实现凸包算法成为可能。 在C#中实现凸包算法,常见的方法有 Graham's Scan、Jarvis March(又称 gift wrapping 或刺猬法)和 QuickHull 等。这些...
最小凸包算法是一种在计算机图形学、几何计算和优化问题中广泛应用的技术。它旨在找到一组点集中包围所有点的最小凸多边形。这个过程在处理大量数据时尤其有用,例如在路径规划、碰撞检测或者图像分析等领域。在这个...
/// 凸包算法 /// /// <param name="_list"></param> /// <returns></returns> private List<TuLine> BruteForceTu(List<Point> _list) { //记录极点对 List<TuLine> role = new List(); //遍历 for ...
完整凸包算法,标准C++编译,包含注释完整有效,内涵博客链接。
在给定的“编写的凸包算法”项目中,我们可以看到它是由C++语言实现的,专注于处理任意数量的点,并且提供了用户友好的界面,包括“凸包生成”和“清理画布”两个功能。 首先,我们来理解一下凸包的基本概念。在二...
凸包算法是计算机科学中的一种几何算法,主要应用于二维或三维空间中的点集。这个算法的目的是找到一个最小的多边形(二维中是多边形,三维中是多面体),该多边形可以完全包围给定点集,且边界上的点均在点集内或者...
凸包算法是计算机科学中的一种几何算法,尤其在图形学、机器学习和地理信息系统(GIS)等领域有着广泛应用。本文将详细介绍使用C# .NET实现凸包算法的程序,并结合提供的文件资源进行解析。 首先,"凸包"的概念是指...
凸包算法是计算机科学中的一种重要几何算法,主要用于找出一组点集中的最小边界,这个边界称为凸包。在二维空间中,如果一个点集中的所有点都位于另一个点集的边界外或边界上,那么后者就是前者的凸包。凸包算法在...
《游戏中凸包算法详解》 在游戏开发中,凸包算法是一种重要的几何计算工具,它在碰撞检测、路径规划、图形渲染等多个领域有着广泛应用。本文将深入探讨凸包算法的基本概念、常见算法以及在游戏中如何应用。 一、...