`
plussai
  • 浏览: 90685 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

凸包算法

阅读更多
今天做作业 ,研究凸包算法,写了一个专说中很快的方法。听说效率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实现凸包算法

    凸包算法C实现 凸包算法是计算几何中的一种基础和经典算法,用于计算一组点的凸包。凸包是指包含所有给定点的最小凸多面体。在计算机科学和信息技术领域,凸包算法有着广泛的应用,如计算机视觉、机器人学、GIS 等...

    计算几何求凸包算法的java实现

    在给定的Java程序中,“计算几何求凸包算法的java实现”是解决这个问题的关键。 这个Java代码实现了对离散点集进行求解凸包的过程。在图形用户界面中,用户可以通过鼠标点击生成点,程序会实时地计算这些点的凸包并...

    Implementation of convex hull.rar_matlab 快速凸包_凸包_凸包 matlab_凸包算法

    在MATLAB中实现凸包算法,可以有效地处理一系列几何问题,如碰撞检测、图像处理和机器学习等。本教程将详细介绍如何在MATLAB中实现快速的凸包算法。 首先,我们需要理解凸包的基本定义。给定一组二维或三维空间中的...

    凸包算法的界面化实现

    凸包算法是计算机科学中的一种重要算法,主要应用于图形学、机器学习、计算机视觉和几何计算等领域。在本项目中,我们关注的是如何通过界面化的方式实现这一算法,使用C++编程语言进行编码,并保证代码的可读性与...

    graham求凸包算法

    graham求凸包算法 graham求凸包算法 graham求凸包算法 graham求凸包算法 graham求凸包算法 graham求凸包算法

    二维快速凸包算法代码(C++)

    二维快速凸包算法是计算机图形学、几何计算和算法设计中的一个重要概念,它在路径规划、碰撞检测、图像处理等领域有着广泛的应用。本篇将详细解释这个算法的原理、实现方式以及C++代码中的关键部分。 二维凸包是指...

    凸包算法 Jarvis GrahamScan 两种算法对比

    两种凸包算法 算法导论的详细实现 C++ VS2008

    一种新的最小凸包算法及其应用

    ### 一种新的最小凸包算法及其应用 #### 概述 最小凸包是几何计算中的一个重要概念,它指的是能够完全包含一组给定点集合的最小凸多边形。最小凸包在GIS(地理信息系统)、计算机图形学、模式识别、人工智能等多个...

    基于C语言的凸包算法实现

    本程序是基于C语言的凸包算法(Graham)实现,能够直接编译运行,计算凸包的点为随机生成。该程序为控制台应用程序,输出结果有凸包顶点坐标、以及一个50*50的矩阵,其中0表示空白点,1表示随机生成的点集,2表示...

    凸包算法(Graham扫描法)JS实现.js

    采用Graham扫描法,实现提取凸包最小边界JS代码实现。(代码中点坐标采用平面坐标,如要在三维贴地展示,可转换为经纬度坐标)

    C#凸包算法

    C#作为一门面向对象的编程语言,提供了丰富的数据结构和算法库,使得实现凸包算法成为可能。 在C#中实现凸包算法,常见的方法有 Graham's Scan、Jarvis March(又称 gift wrapping 或刺猬法)和 QuickHull 等。这些...

    一种新的最小凸包算法及其程序

    最小凸包算法是一种在计算机图形学、几何计算和优化问题中广泛应用的技术。它旨在找到一组点集中包围所有点的最小凸多边形。这个过程在处理大量数据时尤其有用,例如在路径规划、碰撞检测或者图像分析等领域。在这个...

    用C#编写的凸包算法

    /// 凸包算法 /// /// &lt;param name="_list"&gt;&lt;/param&gt; /// &lt;returns&gt;&lt;/returns&gt; private List&lt;TuLine&gt; BruteForceTu(List&lt;Point&gt; _list) { //记录极点对 List&lt;TuLine&gt; role = new List(); //遍历 for ...

    凸包算法(convex hull)1.txt

    完整凸包算法,标准C++编译,包含注释完整有效,内涵博客链接。

    编写的凸包算法

    在给定的“编写的凸包算法”项目中,我们可以看到它是由C++语言实现的,专注于处理任意数量的点,并且提供了用户友好的界面,包括“凸包生成”和“清理画布”两个功能。 首先,我们来理解一下凸包的基本概念。在二...

    tubao.rar_凸包算法_点集凸包

    凸包算法是计算机科学中的一种几何算法,主要应用于二维或三维空间中的点集。这个算法的目的是找到一个最小的多边形(二维中是多边形,三维中是多面体),该多边形可以完全包围给定点集,且边界上的点均在点集内或者...

    凸包算法程序 C# .NET

    凸包算法是计算机科学中的一种几何算法,尤其在图形学、机器学习和地理信息系统(GIS)等领域有着广泛应用。本文将详细介绍使用C# .NET实现凸包算法的程序,并结合提供的文件资源进行解析。 首先,"凸包"的概念是指...

    凸包算法演示程序v0.01

    凸包算法是计算机科学中的一种重要几何算法,主要用于找出一组点集中的最小边界,这个边界称为凸包。在二维空间中,如果一个点集中的所有点都位于另一个点集的边界外或边界上,那么后者就是前者的凸包。凸包算法在...

    游戏中凸包算法

    《游戏中凸包算法详解》 在游戏开发中,凸包算法是一种重要的几何计算工具,它在碰撞检测、路径规划、图形渲染等多个领域有着广泛应用。本文将深入探讨凸包算法的基本概念、常见算法以及在游戏中如何应用。 一、...

Global site tag (gtag.js) - Google Analytics