`
sky_若海
  • 浏览: 12866 次
  • 性别: Icon_minigender_1
  • 来自: 保定
文章分类
社区版块
存档分类
最新评论
阅读更多
this.locateBylonlat=function(featId,lons,lats,extendSelection){
		var lonArr=lons.split(',');
		var latArr=lats.split(',');
		var len=lonArr.length;
		var realLen=len-1;
		var lon;
		var lat;
		if(len<=4){
			var lonMide=(this.myParseFloat(lonArr[1])+this.myParseFloat(lonArr[2]))/2;
			var latMide=(this.myParseFloat(latArr[1])+this.myParseFloat(latArr[2]))/2;
			 lon=(this.myParseFloat(lonArr[0])+lonMide)/2;
			 lat=(this.myParseFloat(latArr[0])+latMide)/2;
			this.clickRightTree(featId,lon,lat,extendSelection)
		}else{
			var lonV=this.myParseFloat(lonArr[0]);
			var latV=this.myParseFloat(latArr[0]);
			var a;
			var b;
			var index=0;
		    for(var i=1;i <len-1;i++){                        //寻找一个凸顶点,最低点肯定是凸顶点 
                  if(this.myParseFloat(lonArr[i]) <lonV){ 
                	  lonV=this.myParseFloat(lonArr[i]);
                	  latV=this.myParseFloat(latArr[i]);
                      index=i; 
                  } 
		    } 
		      a=(index-1+realLen)%realLen;               //得到v的前一个顶点 
		      b=(index+1)%realLen;                       //得到v的后一个顶点 
		      var q;
		      var latTri=[this.myParseFloat(latArr[a]),this.myParseFloat(latArr[index]),this.myParseFloat(latArr[b])];
		      var lonTri=[this.myParseFloat(lonArr[a]),this.myParseFloat(lonArr[index]),this.myParseFloat(lonArr[b])];
		      var md=Number.MAX_VALUE; 
		      var bin=false; 
		      for(var i=0;i <realLen;i++) {              //寻找在三角形avb内且离顶点v最近的顶点q 
                  if(i==index)continue; 
                  if(i==(index-1+realLen)%realLen)continue; 
                  if(i==(index+1)%realLen)continue; 
                  if(!this.pnpoly(3,latTri,lonTri,this.myParseFloat(latArr[i]),this.myParseFloat(lonArr[i])))continue; 
                  bin=true; 
                  var distance=this.dist(lonArr,latArr,index,i);
	              if(distance <md) { 
				        q=i; 
				        md=distance; 
                   } 
		       } 
		      if(!bin){                                                         //没有顶点在三角形avb内,返回线段ab中点 
                  lon1=(this.myParseFloat(lonArr[a])+this.myParseFloat(lonArr[b]))/2; 
                  lat1=(this.myParseFloat(latArr[a])+this.myParseFloat(latArr[b]))/2; 
                  lon=(this.myParseFloat(lonArr[index])+lon1)/2;  
		    	  lat=(this.myParseFloat(latArr[index])+lat1)/2; 
		      }else{ 
		    	  lon=(this.myParseFloat(lonArr[index])+this.myParseFloat(lonArr[q]))/2;  //返回线段vq的中点 
		    	  lat=(this.myParseFloat(latArr[index])+this.myParseFloat(latArr[q]))/2; 
		      }
		      this.clickRightTree(featId,lon,lat,extendSelection)
		} 
	}
	this.myParseFloat=function(num){
		return OpenLayers.Util.toFloat(num);
	}
	this.dist=function(lonArr,latArr,i,j){
		var num1=(lonArr[i]-lonArr[j])*(lonArr[i]-lonArr[j]);
		var num2=(latArr[i]-latArr[j])*(latArr[i]-latArr[j]);
		return Math.sqrt(num1+num2);
	}
         //google的判断点在不在多边形区域内
	this.pnpoly=function(nvert, vertx, verty,testx,testy)
	{
	  var i, j, c = false;
	  for (i = 0, j = nvert-1; i < nvert; j = i++) {
	    if ( ((verty[i]>testy) != (verty[j]>testy)) &&
		 (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
	       c = !c;
	  }
	  return c;
	}



0
0
分享到:
评论

相关推荐

    java判断百度地图的点是否在多边形区域内

    在Java编程中,判断一个点是否位于多边形区域内是一个常见的地理空间运算问题。这个问题在地图应用、GIS(地理信息系统)以及游戏开发等领域有广泛的应用。以下是对这个知识点的详细阐述: 1. **坐标系统与投影**:...

    判断指定的经纬度坐标点是否落在指定的多边形区域内

    在矢量多边形区域中,一个坐标点的位置是否在区域内 算法: C#代码,适用于任意多边形(凹凸多边形),但是没有考虑实际误差范围的情况(应用在实际问题解决中,接近区域一定范围是可以忽略的,这个误差范围考虑后算法的...

    Go-polygon-判断点是否在一个多边形区域内支持凸多边形与凹多边形

    该方法基于一个几何事实:如果你从空间中的任意一点向任意方向画一条射线,这条射线将与凸多边形的边界交于偶数次,而与凹多边形的边界交于奇数次(不包括起点和终点)。通过计算这个交点数,我们可以确定点是否在...

    java判断某个点是否在所画多边形/圆形内

    java判断某个点是否在所画多边形或圆形内 在计算机图形学和 GIS 领域中,判断某个点是否在所画多边形或圆形内是一个常见的问题。java语言提供了多种方法来解决这个问题。本文将详细介绍java判断某个点是否在所画...

    QT实现多边形填充算法

    在计算机图形学中,多边形填充是一种基本的算法,用于在屏幕上绘制封闭的多边形内部区域。QT是一个流行的跨平台应用程序开发框架,它提供了丰富的图形用户界面(GUI)功能,包括支持自定义图形绘制。本文将详细介绍...

    Python随机生成均匀分布在三角形内或者任意多边形内的点

    ### Python随机生成均匀分布在三角形或任意多边形内的点 #### 一、背景与应用场景 在计算机图形学、统计学、数据可视化等领域,经常需要生成位于特定几何形状内部的随机点,例如三角形或多边形。这些随机点通常...

    平面多边形三角化

    有多种方法可以实现这一点,如Ear Clipping法、分而治之的三角剖分算法等。这些方法通常涉及找到合适的边来切割梯形,使得生成的三角形满足非交叉、内部不包含其他顶点的条件。 4. **后处理**:在所有梯形三角化...

    任意凸多边形裁剪凹多边形算法 OpengL实现

    6. 最后,保留所有在裁剪区域内的边和点,形成新的多边形。 在VS2008工程中,我们需要设置OpenGL上下文,编写相应的顶点和片段着色器代码,并将裁剪算法逻辑实现为GLSL(OpenGL Shading Language)程序。此外,还...

    计算机图形学:Lecture 5 多边形的扫描转换及区域填充.ppt

    逐点判断算法是对屏幕上的每个像素进行判断,确定它们是否在多边形区域内部,从而求出位于多边形区域内的像素的集合。逐点判断算法可以使用射线法和弧长法来实现。 射线法是将射线从一点出发,计算它与多边形边界的...

    泰森多边形资料

    它将平面分割成多个区域,使得每个区域内任意一点到其对应的生成点的距离,都小于到其他任何生成点的距离。这些区域就是泰森多边形,而生成点通常称为种子点或站点。 在提供的压缩包中,包含了一系列与泰森多边形...

    利用mongodb查询某坐标是否在规定多边形区域内的方法

    大家都知道MongoDB是一个基于分布式文件存储的数据库,并提供创建基于地理空间的索引的能力,本文将使用MongoDB 基于地理空间索引进行坐标所在区域的判断及使用。 1.使用百度拾取坐标工具,在地图上定义多边形的坐标...

    多边形的扫描转换算法、区域填充算法.pdf

    一旦知道区域内任意一点的内外关系,就可以确定整个区域的梯形归属。 2. 扫描线连贯性:这是区域连贯性在单条扫描线上的体现,意味着在一条扫描线上,多边形的入点和出点之间的所有点都属于多边形内部。 3. 边的...

    简单多边形的最小外接矩形算法

    - **自由矢量**:从一个多边形的任意一点指向另一个点的矢量,它不依赖于起点。 - **绝对矢量**:指从多边形的某个固定点出发到另一个点的矢量,起点固定。 #### 三、算法原理 为了找到简单多边形的最小外接矩形,...

    Android多边形区域递归种子填充算法的示例代码

    它们是搜索方向的问题,从区域内任意一点出发,如果只是通过上、下、左、右四个方向搜索到达区域内的任意像素,则用这种方法填充的区域就称为四连通域,这种填充方法就称为“4-联通算法”。如果从区域内任意一点出发...

    计算机图形学(MFC)-多边形平滑填充(颜色渐变效果进行填充)

    在三角形内,我们可以使用Barycentric坐标来确定每个像素相对于三角形三个顶点的位置,进而进行颜色插值。 接下来,遍历多边形内部的所有像素,计算它们的Barycentric坐标。这些坐标可以用来线性插值三角形三个顶点...

    计算机图形学多边形填充算法PPT学习教案.pptx

    区域的连续性是指区域内的一点与多边形的位置关系,即可确定该区域内所有点与多边形之间的内外关系。扫描线的连续性是区域连续性在扫描线上的体现,即扫描线与多边形的边界的交点序列具有偶数个元素。边的连续性是指...

    基于C语言的区域填充算法的实现

    区域填充算法是计算机图形学中的一种常用技术,用于将多边形区域内的所有像素点赋予指定的颜色。基于 C 语言的区域填充算法的实现是指使用 C 语言编写的区域填充算法程序,该算法可以高效地实现多边形的区域填充。 ...

    js 判断点是否在一个区域里面

    ### JavaScript 判断点是否在多边形区域内 在JavaScript编程中,经常需要处理与图形相关的逻辑,例如判断一个点是否位于一个多边形内部。这种需求常见于地图应用、游戏开发等场景。本文将详细介绍一种经典的算法...

    ios-多边形按钮.zip

    接下来,为了使按钮只在多边形区域内响应触摸事件,MZShapedButton可能重写了`hitTest:withEvent:`方法。这个方法是UIResponder类的一部分,用于确定视图是否应该接收特定的触摸事件。通过在该方法中加入自定义的...

Global site tag (gtag.js) - Google Analytics